2012-07-27 64 views
0

有关在视图中更改信息(而不是转到其他.xhtml页面)的初级问题。我的.xhtml显示一个datatable(显示人员列表),但我希望用户能够通过在输入文本中输入某人姓名的开头,然后单击commandbutton来缩小显示的信息量。 commandbutton和datatable都执行相同的bean方法,但是如果inputtext有数据,sql使用Like(这使用jdbc)。我的表单在下面,问题是我得到一个“无法找到匹配的导航案例与从视图ID”,因为我的管理bean返回的对象列表,而不是“成功”或“失败”。而且,整个表格看起来效率低下。这似乎是一个相当常见的情况 - 调用托管bean的方法返回对象而不是导航指令。我如何摆脱错误信息?有一个更好的方法吗?当bean返回对象时导航

这里是代码:

<h:head> 
    <h:outputStylesheet library="css" name="table-style.css" /> 
</h:head> 

<h:body> 

    <h1>MavenWeb</h1> 

    <h:form> 
     <h:panelGrid columns="3"> 
      Select a customer: 

      <h:inputText id="listName" value="#{customer.listName}" 
       size="20" > 
      </h:inputText> 
      <h:commandButton value="Submit" 
             action="#customer.getCustomerList()}" /> 

     </h:panelGrid> 



    <h:dataTable value="#{customer.getCustomerList()}" var="c" 
      styleClass="order-table" 
      headerClass="order-table-header" 
      rowClasses="order-table-odd-row,order-table-even-row" 
     > 

     <h:column> 
      <f:facet name="header"> 
       Customer ID 
      </f:facet> 
       #{c.customerID} 
     </h:column> 

     <h:column> 
      <f:facet name="header"> 
       Name 
      </f:facet> 
       #{c.name} 
     </h:column> 

     <h:column> 
      <f:facet name="header"> 
       Address 
      </f:facet> 
       #{c.address} 
     </h:column> 

     <h:column> 
      <f:facet name="header"> 
       Created Date 
      </f:facet> 
       #{c.created_date} 
     </h:column> 

    </h:dataTable> 
</h:form> 
</h:body> 

回答

1

首先,确保你的管理bean拥有ViewScope,所以只有形式的值将在每次请求,而你在同一视图是会受到影响。其次,您可以将ajax行为添加到您的<h:commandButton>,并使用新值呈现<h:datatable>。第三,从不把业务逻辑放在你的属性获取器中,因为JSF框架可以对这些获取器(取决于你的设计)进行2次或多次调用。

利用这些规则,你可以改造你的代码是这样的:

@ViewScoped 
@ManagedBean 
public class Customer { 
    private String listName; 
    private List<CustomerDTO> customerList; 

    public Customer() { 
     listName = ""; 
     customerList = null; //maybe you can initialize your list here 
    } 

    //getters and setters... 

    //look that this method returns a void (no need to return a navigation rule) 
    public void fillCustomerList() { 
     //your method/way to fill the customerList goes here... 
     //I'll just put a code example 
     customerList = new ArrayList<CustomerDTO>(); 
     customerList.add(new CustomerDTO(1, "Luiggi Mendoza", "Lima", new Date()); 
     customerList.add(new CustomerDTO(2, "StackOverflow", "Web", new Date()); 
    } 

} 

的代码片段为您的网页

<h:form> 
    <h:panelGrid columns="3"> 
     Select a customer: 
     <h:inputText id="listName" value="#{customer.listName}" size="20" /> 
     <h:commandButton value="Submit" action="#customer.fillCustomerList}"> 
      <f:ajax execute="@this" render="dtMyDataTable" /> 
     </h:commandButton> 
    </h:panelGrid> 

    <h:dataTable id="dtMyDataTable" value="#{customer.customerList}" var="c" 
     styleClass="order-table" 
     headerClass="order-table-header" 
     rowClasses="order-table-odd-row,order-table-even-row"> 
     <h:column> 
      <f:facet name="header"> 
       Customer ID 
      </f:facet> 
      #{c.customerID} 
     </h:column> 
     <h:column> 
      <f:facet name="header"> 
       Name 
      </f:facet> 
      #{c.name} 
     </h:column> 
     <h:column> 
      <f:facet name="header"> 
       Address 
      </f:facet> 
      #{c.address} 
     </h:column> 
     <h:column> 
      <f:facet name="header"> 
       Created Date 
      </f:facet> 
      #{c.created_date} 
     </h:column> 
    </h:dataTable> 
</h:form> 

关于此事的更多信息:

+0

谢谢Luiggi。我做了更改,但得到:malformed xml无法获取属性值removechild对象为null或未定义。有任何想法吗? – Dave 2012-07-27 15:19:18

+0

这是一个非常奇怪的错误。试着通过评论部分代码来检测你的xhtml的哪一部分给你这个错误,然后取消注释(也许错误不在我发布的代码片段中)。当你发现真正的错误时,更新你的问题,并留下评论,给你一个更好的指导。 – 2012-07-27 15:25:19

+0

从互联网上我发现它与f:ajax声明有关。我将其删除,异常消失。顺便说一句,我正在Eclipse中查看页面,而不是IE9。 – Dave 2012-07-27 15:36:51