2011-11-16 116 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