2013-02-16 83 views
1

我有一個視圖範圍的bean的問題。我知道這是常見的問題,但我沒有得到正確的答案。我有一個數據表,負責在用戶輸入的搜索條件下顯示搜索結果。 這裏是XHTML:jsf2 viewscoped管理的bean多次啓動

<html xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns="http://www.w3.org/1999/xhtml" 

    xmlns:p="http://primefaces.org/ui"> 


<h:panelGroup id ="adminReportLogList"> 

<p:dataTable value="#{adminLogView.lazyModelReport}" var="model" id="reportLogList" lazy="true" paginator="true" rows="20" paginatorAlwaysVisible="false" paginatorPosition="bottom" emptyMessage="emppty list" styleClass="dtable" style="table-layout: fixed; width: 100%" 
      paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" rowsPerPageTemplate="5,10,15,20"> 

    <p:column headerText="Report number" sortBy="#{model.reportNumber}"> 
     <h:outputText value="#{model.reportLogId}"/> 
    </p:column> 
    <p:column headerText="Report date" sortBy="#{model.reportDate}"> 
      <h:outputText value="#{model.reportDate}"> 
       <f:convertDateTime pattern="yyyy/MM/dd hh:mm:ss"/> 
      </h:outputText> 
    </p:column> 
    <p:column headerText="Search date" sortBy="#{model.searchLogId.searchDate}"> 
     <h:outputText value="#{model.searchLogId.searchdate}"> 
       <f:convertDateTime pattern="yyyy/MM/dd hh:mm:ss"/> 
      </h:outputText> 
    </p:column> 
    <p:column headerText="User name" sortBy="#{model.searchLogId.loginLogId.username}"> 
     <h:outputText value="#{model.searchLogId.loginLogId.username}"/> 
    </p:column> 
    <p:column headerText="Customer number" sortBy="#{model.customerId}"> 
     <h:outputText value="#{model.customerId.registernumber}"/> 
    </p:column> 
    <p:column headerText="Customer name" sortBy="#{model.customerId}"> 
     <h:outputText value="#{model.customerId.name}"/> 
    </p:column> 
</p:dataTable> 

</h:panelGroup> 
<br/> 

// SEARCH PANEL 
<p:panel> 
    <h:panelGrid columns="3" styleClass="insGrid" id="reportLogSearchPanel"> 
     <h:outputText value="User: "/> 
     <p:inputText id="reportLogSearchByUserName" value="#{adminLogView.searchUserName}"> 
      <p:watermark for="reportLogSearchByUserName" value ="Customer name"/> 
     </p:inputText> 
     <h:message for="reportLogSearchByUserName" id="msgReportLogSearchByUserName" styleClass="errorMessage"/> 

     <h:outputText value="Customer id number: "/> 
     <p:inputText id="reportLogSearchByCustomerName" value="#{adminLogView.searchCustomerName}"> 
      <p:watermark for="reportLogSearchByCustomerName" value="Customer id number"/> 
     </p:inputText> 
     <h:message for="reportLogSearchByCustomerName" id="msgReportLogSearchBySearchDate" styleClass="errorMessage"/> 

     <h:outputText value="Report date "/> 
     <p:inputText id="reportLogSearchByReportDate" value="#{adminLogView.searchReportDate}"> 
      <p:watermark for="reportLogSearchByReportDate" value="Report date YYYY/MM/DD"/> 
     </p:inputText> 
     <h:message for="reportLogSearchByReportDate" id="msgReportLogSearchByReportDate" styleClass="errorMessage"/> 

     <h:panelGroup/> 
     <h:commandButton value="Search" styleClass="btn" action="#{adminLogView.searchReport()}"> 
      <f:ajax render =":form:adminReportLogList :form:reportLogList" execute=":form:reportLogSearchPanel"/> 
     </h:commandButton> 

    </h:panelGrid> 

</p:panel> 

這是在標籤中使用的另一種XHTML是:/我想它不是在這種情況下會引起/

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="./../templates/admin_main.xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:p="http://primefaces.org/ui"> 

    <ui:define name="content"> 
     <h:panelGroup id="include"> 
     <ui:include src="#{adminLogView.page}.xhtml"/> 
     </h:panelGroup> 
    </ui:define> 

</ui:composition> 

這裏是我的豆

@Named(value = "adminLogView") 
@ViewScoped 
public class AdminLogView implements Serializable{ 
    @EJB 
    private LogServiceLocal logService; 
    private List<Reportlog> ReportLogList; 

    String page = "reportLog"; 
    LazyDataModel<Reportlog> lazyModelReport; 
    LazyDataModel<Loginlog> lazyModelLogin; 
    LazyDataModel<Searchlog> lazyModelSearch; 

    String searchCustomerName; 
    String searchUserName; 
    String searchReportDate; 


    @PostConstruct 
    public void init(){ 

     this.lazyModelReport = new LazyReportLogDataModel(this.logService); 
    } 

    public void searchReport(){ 
     Map<String, String> filter = new HashMap<String, String>(); 
     if(this.searchCustomerName != null && !this.searchCustomerName.isEmpty()) 
      filter.put("customerName", this.searchCustomerName); 
     if(this.searchReportDate != null && !this.searchReportDate.isEmpty()) 
      filter.put("reportDate", this.searchReportDate); 
     if(this.searchUserName != null && !this.searchUserName.isEmpty()) 
      filter.put("userName", this.searchUserName); 



     this.lazyModelReport.load(0, 30, null, SortOrder.UNSORTED, filter); 

    } 
} 

當我們導航到上面的頁面時,@postConstruct方法稱爲多重t imes,即使使用sessionScoped。即使我們在同一視圖中單擊搜索按鈕,bean也會再次初始化。只有RequestScope可以正常工作。 有沒有我誤解或忘記。 PS。 在此先感謝。

回答

2

您是否擁有正確的SessionScoped? javax.enterprise.context.SessionScoped

在類路徑中是否有Myfaces CODI或任何其他適配器?否則@ViewScoped具有未記錄的行爲,因爲它是JSF-2範圍。

如果您擁有正確的@SessionScoped,那麼對於我來說,至少對於我來說,所發現的行爲完全是未知的問題。

另外:

@Named(value = "adminLogView") 

你給這裏的價值是它會默認爲。不妨跳過這樣的設置值。

祝你好運

2

@ javax.faces.bean.ViewScoped無法使用CDI。因此,您需要使用SeamFaces或MyFaces CODI來從Viewscope服務中受益。

CDI提供擴展來創建您自己的作用域,以便您可以實現上下文並使用@NormalScope來執行此操作。

  • CDI觸發一個事件AfterBeanDiscovery每個bean調用後
  • 您可以使用CDI擴展到@Observes這一事件,並添加上下文實現
  • 在您可以將範圍實施:
    1. 使用上下文讓您的豆的名字從FacesContext ViewRoot地圖並返回後每個AJAX調用回
    2. 使用CreationalContext如果從第一步bean名字就是沒有找到FacesContext中的ViewRoot地圖

去創造一個更深入的解釋我推薦此鏈接:http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

+0

這在博客文章中太簡單了。作爲一名開發人員,我更願意查看可用的代碼。就像Codi或DeltaSpike中的一樣。 – 2013-04-30 23:29:48

+1

personnally在每次ajax回撥之後,我只是需要檢索我的bean,Steven Verborgh的實現對我有所幫助,並進行了一些修改 – Kurohige 2013-05-01 16:22:33

+0

這就是我所說的。如果我能得到一些也包含特殊情況的東西,我不會關注只顯示一半真相的博客。 – 2013-05-06 21:23:57

相關問題