2012-02-29 48 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

相关问题