2014-04-26 57 views
0

这里是我的代码,JSF2搜索豆请求范围不显示结果

search.xhtml页

<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页

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

在Managed 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"; 
    } 

问题:searchre虽然它从表 获取记录,但页面不显示记录我可以使用搜索bean作为会话范围来实现此目的,但我希望将范围用作Requestscope,因为性能。 请建议...!

+1

@Makky - 这是可怕的建议。会话范围几乎不是一个页面支持bean的好候选 – kolossus

回答

1

的问题

你没有看到的结果的原因是因为你有@RequestScope,因此一个不正确的认识,范围

searchEmployees的不可能期望在INVOKE_APPLICATION阶段执行, JSF请求处理生命周期的第二阶段到最后阶段。当用户被重定向到searchResults.xhtml时,您的SearchBean中保存搜索结果的实例已被销毁,并创建了一个全新的实例,导致列表为空。

这是除了@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对象;你不必做任何事情。

编辑:根据你的“答案”,你应该知道,Flash对象只保存页面的第一次呈现存储变量。随后的HTTP请求将清除Flash对象的内容。

如果你有兴趣在保持闪存对象的内容超出了第一渲染,你应该使用Flash#keep

<rich:dataTable value="#{flash.keep.searchResults}" var="e" id="table"> 

进一步阅读