使用会话中的信息呈现JSF页面

时间:2013-01-09 20:43:29

标签: java servlets jsf-2 javabeans facelets

我有以下JSF页面:

<h:head>
    <title>Admin Page</title>        
</h:head>
<h:body>

    <h1>Users List</h1>

    <h:dataTable value="#{adminBean.linkArr}" var="o" >

        <h:column>
            <f:facet name="header">User name</f:facet>
            #{o.username}
        </h:column>

    </h:dataTable>        

</h:body>

这样的托管bean:

@ManagedBean(name="adminBean")
@SessionScoped
public class AdminBean {

private static UserLink[] linkArr;

public AdminBean() {
    FacesContext context = FacesContext.getCurrentInstance();  
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();  
    HttpSession session = request.getSession();

    String values[] = (String[])request.getSession().getAttribute("userList");

    int userNos = values.length;
    linkArr = new UserLink[userNos];

    for(int i = 0; i < userNos; ++i) {
        String tmp = values[i];
        linkArr[i] = new UserLink(tmp);
    }                
}
public UserLink[] getLinkArr() {
    return linkArr;
}

public static class UserLink {

    public String username;

    public UserLink(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}
}

我实际上要做的是:

通过创建会话来保存先前调用的servlet中的一些数据。假设只在调用其关联的XHTML文件时创建托管会话bean,我从会话对象获取属性,然后使用填充JSF表。

但是,我得到以下输出而不是JSF表:

Users List

User name #{o.username}

我是否假设托管会话bean的生命周期错误,或者我的JSF页面存在问题?

1 个答案:

答案 0 :(得分:2)

那么,EL根本没有评估?这只能表示当前请求网址(如您在浏览器的地址栏中看到的)与网络应用<url-pattern>中配置的FacesServlet的{​​{1}}不匹配。它是负责将XHTML文件解析为JSF组件树并让它评估所有EL表达式并生成有效HTML代码的人。如果您已经在webbrowser中右键单击查看源,您还应该注意到:所有JSF标记都保持未解析,而不是生成HTML表示。

因此,要解决此问题,您需要确保当前请求URL与faces servlet的URL模式匹配。因此,如果您已将其映射到web.xml,那么您应该按*.jsf而不是page.jsf打开该页面。或者,您也可以将page.xhtml中面部servlet的URL模式更改为web.xml,这样您就不必担心虚拟URL。

请注意,此问题与会话管理无关。考虑到奇怪的设计,你可能迟早会遇到与之相关的问题,但这是一个不同的问题。

另见: