jsf2搜索bean请求范围未显示结果

时间:2014-04-26 06:08:56

标签: jsf-2 richfaces jsf-2.2

这是我的代码,

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,因为性能。     请建议......!

1 个答案:

答案 0 :(得分:3)

问题

您没有看到结果的原因是因为您对@RequestScope的理解不正确,因此对范围的预期不可能

searchEmployeesINVOKE_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">

进一步阅读