【问题标题】:Rendering JSF pages using information from sessions使用来自会话的信息呈现 JSF 页面
【发布时间】:2012-12-24 03:25:33
【问题描述】:

我有以下 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 页面有问题?

【问题讨论】:

    标签: java servlets jsf-2 javabeans facelets


    【解决方案1】:

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

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

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

    另见:

    【讨论】:

    • 非常感谢。这成功了。另外请告诉我我对托管会话bean的理解是否正确?
    • 我正在使用会话来存储数据并在 bean 中检索它们?这是正确的方法还是有更好的方法?
    • 答案取决于您使用 servlet 的原因。此外,我想知道是否有必要使 bean 会话范围并像那样按摩列表并将静态变量作为属性。更重要的是,我想知道整个豆子的用处。你可以只做&lt;h:dataTable value="#{userList}" var="username"&gt;&lt;h:column&gt;#{username}&lt;/h:column&gt;&lt;/h:dataTable&gt; 而不需要一个bean。也许 servlet 的工作应该由 bean 来完成?
    • This article 应该可以在一定程度上帮助您入门。
    • 您可以尝试将 JSF 视为对 Servlet API 的抽象。例如,ExternalContext#getSessionMap() 返回HttpSession 的所有属性的映射。 JSF 会话范围的托管 bean 基本上存储为 HttpSession 的属性。 EL #{} 将分别解析请求、会话和应用程序范围内的属性,直到找到第一个非空属性。因此,servlet 中的 session.setAttribute("foo", foo) 也可以通过 EL 中的 #{foo} 使用(以及 JSF 中的 @ManagedProperty("#{foo}")!)此外,我们的 JSF wiki 页面可能会有所帮助:stackoverflow.com/tags/jsf/info
    猜你喜欢
    • 2017-12-17
    • 2014-03-24
    • 2013-09-27
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多