0

我有以下 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 中的一些数据。假设托管会话 bean 仅在调用其关联的 XHTML 文件时创建,我从会话对象中获取属性,然后使用它来填充 JSF 表。

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

Users List

User name #{o.username}

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

4

1 回答 1

2

那么,EL根本不被评估?这只能意味着当前请求 URL(如您在浏览器地址栏中看到的)与webapp<url-pattern>FacesServlet配置的web.xml. 它负责将 XHTML 文件解析为 JSF 组件树,并让它评估所有 EL 表达式并生成有效的 HTML 代码。如果您在 webbrowser 中完成了右键单击,查看源代码,您还应该注意到:所有 JSF 标记都未解析,而不是生成了它们的 HTML 表示。

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

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

也可以看看:

于 2013-01-09T20:47:33.133 回答