jsfjavabeansfaceletsjsf-2.2backing-beans

web.xml setup for facelets template and client


I've looked at a few resources for JSF and facelets, but don't understand a few configuration points. What's the distinction between:

<url-pattern>/faces/*</url-pattern>

and:

<url-pattern>*.jsf</url-pattern>

While I understand it's possible to have several url-pattern elements, unless .jsf pages are explicitly being used, there's no actual need for this mapping, correct? If only faces templates and clients are being used, then it's extraneous?

Furthermore, if the facelet template and client are inside WEB-INF, how are they accessed?

With the latest releases for JSF and Facelets, there seems no hard requirement for faces-config.xml; correct?

Finally, if Glassfish is being used with facelets clients/templates, then the EL is through CDI?

Overall, why isn't this client:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <body>
        <ui:composition template="./template.xhtml">
            <ui:define name="top">
                top
            </ui:define>
            <ui:define name="content">
                expression language not evaluating?
                <h:outputLabel value="#{hello.hi(fred)}" />
            </ui:define>
        </ui:composition>
    </body>
</html>

using this template:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <h:outputStylesheet name="./css/default.css"/>
        <h:outputStylesheet name="./css/cssLayout.css"/>
        <title>Facelets Template</title>
    </h:head>
    <h:body>
        <div id="top" class="top">
            <ui:insert name="top">Top</ui:insert>
        </div>
        <div id="content" class="center_content">
            <ui:insert name="content">Content</ui:insert>
        </div>
    </h:body>
</html>

with this web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/client.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

using this bean:

package pkg;

import javax.faces.bean.SessionScoped;
import javax.inject.Named;


@Named
@SessionScoped
public class Hello {

    public Hello() {
    }

    public String hi(String name) {
        return "hi " + name;
    }

}

Instead, the EL simply shows in the page as so:

thufir@dur:~$ 
thufir@dur:~$ lynx http://localhost:8080/HelloExpressionLanguage/client.xhtml -dump
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <body>
        <ui:composition template="./template.xhtml">
            <ui:define name="top">
                top
            </ui:define>
            <ui:define name="content">
                expression language not evaluating?
                <h:outputLabel value="#{hello.hi(fred)}" />
            </ui:define>
        </ui:composition>
    </body>
</html>thufir@dur:~$ 
thufir@dur:~$ 
thufir@dur:~$ lynx http://localhost:8080/HelloExpressionLanguage/ -dump
   top

   expression language not evaluating?
thufir@dur:~$ 
thufir@dur:~$ 

Solution

  • It is not clear that where do you want to see the expected "hello fred" output. In the example you use ui:insert, but it for templates.

    if you want to use the hello method in the bean you will need to use an EL expression and for the output a h:outputLabel tag:

    <h:outputLabel value="#{helloWorld.hello('fred')}" />
    

    Update1 (if JSF code not processed):

    You should check your web.xml. It have to contains a servlet and a listener like this:

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    

    Note: of you use .xhtml or .hello or something else, you have to match the url-pattern of the server-mapping.