这是我的代码,
search.xhtml page
<h:form id="searchform">
<h:inputText id="deptId" value="#{searchBean.departmentId}"></h:inputText>
<h:inputText id="deptName" value="#{searchBean.deparmentName}"></h:inputText>
<h:commandButton value="Click to Search" action="#{searchBean.searchEmployees}">
</h:commandButton>
</h:form>
searchresults.xhtml page
<rich:dataTable value="#{searchBean.employeeList}" var="e" id="table">
<rich:column>
<f:facet name="header">
<h:outputText value="FNAME"/>
</f:facet>
<h:outputText value="#{e.fName}"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="LNAME"/>
</f:facet>
<h:outputText value="#{e.lName}"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="DEPARTMENT"/>
</f:facet>
<h:outputText value="#{e.dept}"/>
</rich:column>
</rich:dataTable>
在托管bean中
ManagedBean
@ManagedBean(name="searchBean")
@RequestScoped
public class SearchBean implements Serializable{
private String departmentId;
private String deparmentName;
private List<EmpBean> employeeList;
//....get/set 's
public String searchEmployees(){
employeeList = service.getEmployees(departmentId,deparmentName);
return "searchresults.xhtml";
}
问题:虽然搜索结果页面从表中获取了记录,但它并未显示记录 我能够使用搜索bean作为会话范围来实现这一点,但我想将范围用作Requestscope,因为性能。 请建议......!
答案 0 :(得分:3)
问题
您没有看到结果的原因是因为您对@RequestScope
的理解不正确,因此对范围的预期不可能
searchEmployees
在INVOKE_APPLICATION
阶段执行,第二阶段到JSF请求处理生命周期的最后阶段。当用户被重定向到 searchResults.xhtml 时,保存搜索结果的SearchBean
实例已被销毁并创建了一个全新的实例,从而产生一个空列表。 / p>
这是除@SessionScoped
之外的每个bean范围的规则:导航操作将导致旧bean被销毁并创建一个新bean。这并不是说@SessionScoped
应该是您的选择范围(使用@SessionScoped
bean支持页面通常是一个糟糕的主意。)
解决方案
使用FlashScope
暂时存储结果,以便在其他页面上显示。例如
employeeList = service.getEmployees(departmentId,deparmentName);
Flash theFlashScope = FacesContext.getCurrentInstance().getExternalContext().getFlash();
theFlashScope.put("searchResults",employeeList);
return "searchresults.xhtml";
然后在 searchResults.xhtml
中<rich:dataTable value="#{flash.searchResults}" var="e" id="table">
这里,#{flash}
是一个隐含的EL对象;你不必做任何其他事情。
编辑:根据您的&#34;答案&#34;,您应该知道Flash
对象仅保留存储在其中的变量,仅用于第一次呈现页面。后续的HTTP请求将清除flash对象的内容。
如果您有兴趣保持Flash对象的内容超出第一次渲染,则应使用Flash#keep
:
<rich:dataTable value="#{flash.keep.searchResults}" var="e" id="table">
进一步阅读