2012-02-29 53 views
0

Im使用primefaces版本3.1.1,Mojarra 2.1.3,Netbeans 7.0.1,GlassFish Server 3.1。ViewScoped bean重新創建,每次我點擊我的數據表中的commandButton

我的測試應用程序正在使用帶有原始div和css的頂部,左側,內容,右側和底部佈局的facelet模板。用戶使用容器管理的jdbcrealm登錄後,它們將顯示使用該模板的主index.html。

我在左側面板上放置了一個導航菜單,隨後在點擊菜單項後使用ajax更新中央面板內容。中心面板將通過使用sessionScoped NavigationBean<ui:include>中動態更新。

在頁面clientList.xhtml的其中之一,我把一個<p:dataTable>一個按鈕,通過彈出一個<p:dialog>查看詳細信息。我使用viewCoped bean來保存dataTable上顯示的數據列表。

問題是,當我點擊按鈕選擇每行最後一列中的一行時,對話框根本沒有出現,並且我的gif圖像始終處於無限滾動狀態。當我使用NetBeans調試程序時,我注意到構造函數被再次調用,點擊按鈕之後前一個實例不見了。

這是我的index.xhtml使用facelets模板。

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 
<ui:composition template="/BySalesAutomationTemplate.xhtml"> 
    <ui:define name="title"> 
     <h:outputText value="Facelet Index Page"></h:outputText> 
    </ui:define> 
    <ui:define name="top"> 
     TOP 
    </ui:define> 
    <ui:define name="left"> 
     <ui:include src="users/menu#{request.isUserInRole('ADMIN') ? 'Admin' : 'User'}.xhtml" /> 
    </ui:define> 
    <ui:define name="right"> 
     <h:outputText value="Cuba2 daan"></h:outputText> 
    </ui:define> 
    <ui:define name="maincontent"> 
     <c:if test="#{navigationBean.page!=null}"> 
      <ui:include src="#{navigationBean.page}.xhtml" /> 
     </c:if> 
    </ui:define> 
    <ui:define name="bottom"> 
     <center>2012</center> 
    </ui:define> 
    </ui:composition> 
</html> 

這是這是在點擊左側面板中的菜單上的鏈接顯示在我的index.xhtml中心面板clientList.xhtml頁面。

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <title>Client Listing</title> 
</h:head> 
<h:body> 
    <p>Client List</p> 
    <h:form> 
     <h:commandButton action="#{authBackingBean.logout}" value="Logout" /> 
    </h:form> 
    <f:view> 
     <h:form id="formdetail" prependId="false"> 
      <p:ajaxStatus> 
       <f:facet name="start"> 
        <h:graphicImage value="images/loading.gif" /> 
       </f:facet> 
       <f:facet name="complete"> 
        <h:outputText value="" /> 
       </f:facet> 
      </p:ajaxStatus> 
      <p:growl id="growl" showDetail="true"/> 
      <p:dataTable id="dtClientList" value="#{saClientController.lazyModel}" rowsPerPageTemplate="10,20,30,50" 
         paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 
         paginatorAlwaysVisible="false" var="item" paginator="true" rows="10"> 
       <f:facet name="header"> 
        <h:outputText value="Client List"/> 
       </f:facet> 
       <p:column filterBy="#{item.idSaClient}"> 
        <f:facet name="header"> 
         <h:outputText value="IdSaClient"/> 
        </f:facet> 
        <p:commandLink action="#{saClientController.showDetails(item)}" value="#{item.idSaClient}" target=":maincontent"/>       
       </p:column> 
       <p:column filterBy="#{item.saClientName}"> 
        <f:facet name="header"> 
         <h:outputText value="saClientName"/> 
        </f:facet> 
        <h:outputText value="#{item.saClientName}"/> 
       </p:column> 
       <p:column filterBy="#{#item.saClientAddress}"> 
        <f:facet name="header"> 
         <h:outputText value="SaClientAddress"/> 
        </f:facet> 
        <h:outputText value="#{item.saClientAddress}"/> 
       </p:column> 
       <p:column style="width:40px"> 
        <h:panelGrid columns="3" styleClass="actions" cellpadding="2"> 
         <p:commandButton id="selectButton" update=":formdetail:display" oncomplete="clientDialog.show()" icon="ui-icon-search" title="View">         
          <f:setPropertyActionListener value="#{item}" target="#{saClientController.selectedSaClient}" /> 
         </p:commandButton> 
        </h:panelGrid> 
       </p:column> 
       <f:facet name="footer"> 
        <h:outputText value="Client List"/> 
       </f:facet> 
      </p:dataTable>      
     </h:form> 

     <p:dialog id="clientDialog" header="Client Detail" widgetVar="clientDialog" resizable="false" showEffect="explode" hideEffect="explode"> 
      <h:panelGrid id="display" columns="2" cellpadding="4"> 
       <f:facet name="header"> 
        <h:outputText value="Selected Row" /> 
       </f:facet> 
       <h:outputText value="ID" /> 
       <h:outputText value="#{saClientcontroller.selectedSaClient.idSaClient}" /> 
       <h:outputText value="NAME:" /> 
       <h:outputText value="#{saClientcontroller.selectedSaClient.saClientName}" /> 
       <h:outputText value="DESCRIPTION:" /> 
       <h:outputText value="#{saClientcontroller.selectedSaClient.saClientAddress}" /> 
      </h:panelGrid> 
     </p:dialog>     

    </f:view> 
    </h:body> 
</html> 

這是我的支持豆。

public class SaClientController implements Serializable { 

    @EJB 
    private SaClientFacade saClientFacade; 
    private SaClient selectedSaClient; 
    private LazyDataModel<SaClient> lazyModel; 
    private List<SaClient> saclients; 

    /** Creates a new instance of SaClientController */ 
    public SaClientController() { 
    } 

    @PostConstruct 
    public void Init() { 
     saclients = saClientFacade.Retrieve(); 
     lazyModel = new LazyDataModelImp(saclients); 
    } 

    public LazyDataModel<SaClient> getLazyModel() { 
     return lazyModel; 
    } 

    public List<SaClient> getClients() { 
     return saClientFacade.Retrieve(); 
    } 

    public SaClient getDetails() { 
     return selectedSaClient; 
    } 

    public String showDetails(SaClient selectedSaClient) { 
     this.selectedSaClient = selectedSaClient; 
     return "DETAILS"; 
    } 

    public String update() { 
     System.out.println("###UPDATE###"); 
     selectedSaClient = saClientFacade.Update(selectedSaClient); 
     return "SAVED"; 
    } 

    public String list() { 
     System.out.println("###LIST###"); 
     return "LIST"; 
    } 

    public SaClient getSelectedSaClient() { 
     return selectedSaClient; 
    } 

    public void setSelectedSaClient(SaClient selectedSaClient) { 
     this.selectedSaClient = selectedSaClient; 
    } 

    public String dummyAction() 
    { 
     return null; 
    } 
} 

這是LazyModelImp

public class LazyDataModelImp extends LazyDataModel<SaClient> { 

    private List <SaClient> datasource; 

    public LazyDataModelImp(List<SaClient> datasource) { 
     this.datasource = datasource; 
    } 

    @Override 
    public SaClient getRowData(String rowKey) { 
     for (SaClient saclient : datasource) { 
      if (saclient.getIdSaClient().toString().equals(rowKey)) { 
       return saclient; 
      } 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(SaClient saclient) { 
     return saclient.getIdSaClient().toString(); 
    } 

    @Override 
    public List<SaClient> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) { 
     List<SaClient> data = new ArrayList<SaClient>(); 
     //filter   
     for (SaClient saclient : datasource) { 
      boolean match = true; 
      for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
       try {      
        String filterProperty = it.next(); 
        String filterValue = filters.get(filterProperty); 
        String fieldValue = String.valueOf(saclient.getFilterSortFieldValue(filterProperty)); 
        if (filterValue == null || fieldValue.startsWith(filterValue.toUpperCase()) || fieldValue.startsWith(filterValue.toLowerCase())) { 
         match = true; 
        } else { 
         match = false; 
         break; 
        } 
       } catch (Exception e) { 
        match = false; 
       } 
      } 
      if (match) { 
       data.add(saclient); 
      } 
     } 
     //rowCount 
     int dataSize = data.size(); 
     this.setRowCount(dataSize); 
     //paginate 
     if (dataSize > pageSize) { 
      try { 
       return data.subList(first, first + pageSize); 
      } catch (IndexOutOfBoundsException e) { 
       return data.subList(first, first + (dataSize % pageSize)); 
      } 
     } 
     else { 
      return data; 
     } 
     //sort 
     //if (sortField != null) { 
     // Collections.sort(data, new LazySorter(sortField, sortOrder)); 
     //}  
     //return data; 
    } 
} 

我已經禁用的web.xml節省了部分狀態。

<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param> 

的backingBean將重新初始化,我第一次在clienList.xhtml上查看詳情點擊的commandButton DataTable中的最後一列。對話框根本不顯示。但按F5後。可以顯示對話框但沒有任何內容,對話框中顯示的唯一內容是標籤outputText,但不是bean值,它們是空的。對新手問題抱歉。我會非常高興,如果任何人都可以告訴我做什麼是錯誤的,並且可能對導航有點建議,並且我的策略是否顯示在index.xhtml中的所有內容(所以我一直只有1個視圖ID,是index.xhtml,對不對?)是對的。

+3

哇......這太多了。下次請嘗試只包含與您遇到的問題直接相關的代碼和配置。如果不可能,請嘗試在測試頁面中重現問題。 – 2012-02-29 18:37:40

+0

謝謝maple_shaft。對不起......我只是想把所有東西都放進去以獲取詳細信息。下次我會放更短的版本。順便說一句,您如何看待我的解決方案,只有/index.xhtml始終顯示在瀏覽器中。並且只有中心面板內容正在通過動態地包含其他xhtml頁面進行更新?可以嗎? – frazkok 2012-03-01 00:53:33

+0

這是一個常用的解決方案,其他人已經使用了這個。由於您已經在使用Primefaces,因此可能會從使用Primefaces佈局模板中受益。 http://www.primefaces.org/showcase/ui/layoutHome.jsf – 2012-03-01 11:55:49

回答

0

這可能是您的PrimeFaces對話框的問題,您有圍繞p:dialogh:form。我注意到當表單元素的子元素時,PrimeFaces對話框無法正常工作。

嘗試在對話框的內容中放置此對話框。

<p:dialog id="clientDialog" header="Client Detail" widgetVar="clientDialog" resizable="false" showEffect="explode" hideEffect="explode"> 
    <h:form id="formdialog" prependId="false"> 
    <h:panelGrid id="display" columns="2" cellpadding="4"> 
    ... 
+0

感謝maple_shaft。我已經嘗試過了。它沒有工作。 – frazkok 2012-03-01 03:36:54

+0

您好maple_shaft,還有其他建議嗎? – frazkok 2012-03-01 12:54:01

+0

@frazkok我可能會嘗試Primefaces佈局只是爲了看看是否有所作爲,但可能並不重要。我建議試圖縮小這個問題。用JUST創建一個測試頁面,並在對話框中查看是否可以用較少的代碼重新創建問題。如果是這樣,請繼續從託管的bean中刪除不必要的代碼,直到問題消失。這會給你提供問題的線索。現在我沒有看到其他任何看起來不正確的東西,但我可能因爲代碼太多而錯過了一些東西。 – 2012-03-01 13:07:19

相關問題