请阅读到最后,有很多编辑
我有这段 JSF 代码:
<h:form>
<h:dataTable class="table-striped" var="_product"
value="#{productManager.products}"
border="1"
binding="#{productManager.table}">
<h:column>
<f:facet name="header">Product</f:facet>
#{_product.name}
</h:column>
<h:column>
<f:facet name="header">Available Units</f:facet>
#{_product.stock}
</h:column>
<h:column>
<f:facet name="header">Category</f:facet>
#{_product.category}
</h:column>
<h:column>
<f:facet name="header">Price</f:facet>
#{_product.price}
</h:column>
<h:column>
<f:facet name="header">Description</f:facet>
#{_product.description}
</h:column>
<h:column>
<f:facet name="header">Select</f:facet>
<h:commandButton class="btn btn-primary" value="Select"
action="#{productManager.selectProduct}"/>
</h:column>
</h:dataTable>
</h:form>
<h:form>
<h:outputLabel for="productName">Selected Product: </h:outputLabel>
<h:inputText value="#{productManager.selectedDesiredCategory}"/>
<h:commandButton value="Filter category" action="#{productManager.filterProductsByCategory}"/>
<h:outputText id="productName" value="#{productManager.selectedName}"/><br/>
<h:outputLabel for="units">Units: </h:outputLabel>
<h:inputText id="units" value="#{productManager.selectedUnits}"/>
<h:commandButton value="Add to basket" action="#{productManager.addToBasket(accountManager.username)}"/><br/>
<h:outputText rendered="#{productManager.availableMessages}"
value="#{productManager.message}"/>
</h:form>
#{productManager.filterProductsByCategory}
命令按钮重定向到这个 java 方法:
public void filterProductsByCategory() {
this.products = controller.obtainProductListByCategory(selectedDesiredCategory);
showMessage("Filtered by selected category");
}
在这里,我products
使用按类别过滤的新产品集更新列表的内容,以在视图中显示它们。问题是页面没有重新加载以显示新内容。这是如何实现的?
编辑: showMessage 方法实际上是在视图中显示,所以页面正在重新加载,但由于某种原因,表没有更新。也许这是查询返回的数据有问题,我实际上正在研究。
编辑:查询返回了良好的结果,正如我的调试过程所证实的那样,但网页没有正确地重新加载表中的数据。
编辑:我发现了一些非常奇怪的东西。这是 JSF 页面引用的代码:
public void filterProductsByCategory()
{
filtered = true;
products = controller.obtainProductListByCategory(selectedDesiredCategory);
showMessage("Filtered by selected category");
}
我现在使用布尔值来实际知道何时必须提供过滤列表(请参阅下面的代码中的原因)这是getter
列表products
:
public List<Product> getProducts()
{
if(filtered)
{
filtered = false;
return products;
}
products = controller.obtainProductList();
return products;
}
如果这是真的,它应该只发送实际的过滤products
变量。但由于某种原因,它在方法内一次又一次地循环(即使在return
if 内的语句之后),并再次将所有产品发送到视图。为什么会发生这种情况?