2014-04-26 89 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"> 

進一步閱讀