有关更改视图中信息的初学者问题(而不是转到不同的.xhtml页面)。我的.xhtml显示一个数据表(显示人员列表),但我希望用户能够通过在某个人名称的开头输入一个inputtext然后单击命令按钮来缩小显示的信息量。 commandbutton和datatable都执行相同的bean方法,但是如果inputtext有数据,则sql使用Like(这使用jdbc)。我的表单如下,问题是我得到一个“无法找到与from-view-id匹配的导航案例”,因为我的托管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>
答案 0 :(得分:1)
首先,确保您的托管bean具有ViewScope,因此当您处于同一视图时,只有每个请求都会影响表单值。其次,您可以向<h:commandButton>
添加ajax行为,并使用新值呈现<h:datatable>
。第三,从不将业务逻辑放在属性getter中,因为JSF框架可以对这些getter进行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>
关于此事的更多信息: