您可以使用會話範圍的託管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