我有以下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页面存在问题?
答案 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。
请注意,此问题与会话管理无关。考虑到奇怪的设计,你可能迟早会遇到与之相关的问题,但这是一个不同的问题。