2011-11-16 69 views
6

我需要一種方法來保存用戶選擇的不同部分組成的配置。每個部分都在單獨的頁面上從託管bean(每個部分類型一個)提供的列表中選擇。會話範圍的託管bean vs有狀態的bean vs httpsession

現在很有趣的一部分。我有一個數據表,總是可見的,對於我在<ui:include>插入所有上述頁面的模板中插入的所有頁面都是一樣的。我希望這個數據表可以反映用戶爲零件選擇的選擇或變化。也許可以將這樣的配置保存到數據庫中,但那不是我現在的首要任務。這是一種購物車,但我沒有不同的用戶(它只是一個原型),所以不需要登錄。

這是我第一次遇到javaee,jsf,ejb,我不知道哪個是最好的方法。我已經閱讀了不同的選項,並且我覺得任何一種方式都行得通,所以我可能會錯過一些東西。

我希望有人指出我在正確的方向。

回答

11

您可以使用會話範圍的託管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暴露給外部。

+1

謝謝youuuuu。這幾乎就像聖誕節每次你回答我的一個問題 – glasspill

+0

不客氣。 – BalusC

+0

如果您遇到類似'javax.faces.component.html.HtmlDataTable'的錯誤沒有屬性'description',請更改'var'的名稱,因爲您可能已經爲另一個名稱使用了相同的名稱其他地方,這是與目前的衝突,你會花時間尋找原因。 – glasspill

相關問題