您可以使用会话范围的托管bean来保存购物车信息。这里有一个基本的开球例子(复制的产品,不占数量;它只是给的总体思路):
@ManagedBean
@SessionScoped
public class Cart {
private List<Product> products = new ArrayList<Product>();
public void add(Product product) {
products.add(product);
}
public void remove(Product product) {
products.remove(product);
}
public List<Product> getProducts() {
return products;
}
}
(你可以使用一个Map<Product, Integer>
或Map<Product, Order>
跟踪量)
你可以然后显示车如下:
<h:dataTable value="#{cart.products}" var="product">
<h:column>#{product.description}</h:column>
<h:column><h:commandButton value="Remove" action="#{cart.remove(product)}" /></h:column>
</h:dataTable>
您可以将产品添加到购物车从另一个表如下:
<h:dataTable value="#{products.list}" var="product">
<h:column>#{product.description}</h:column>
<h:column><h:commandButton value="Add" action="#{cart.add(product)}" /></h:column>
</h:dataTable>
如果您希望能够通过不同的API /框架或甚至远程客户端在Web应用程序的其他地方使用它,或者想要使用持久性上下文来锁定项目前在购物车中,所以其他顾客不能将其添加到购物车中。 HttpSession
与JSF存储会话范围的托管bean不相关,因此您不希望将JSF封面下的原始Servlet API暴露给外部。
谢谢youuuuu。这几乎就像圣诞节每次你回答我的一个问题 – glasspill
不客气。 – BalusC
如果您遇到类似'javax.faces.component.html.HtmlDataTable'的错误没有属性'description',请更改'var'的名称,因为您可能已经为另一个名称使用了相同的名称其他地方,这是与目前的冲突,你会花时间寻找原因。 – glasspill