session scoped managed bean vs stateful bean vs httpsession

时间:2011-11-16 14:26:08

标签: jsf-2 ejb javabeans managed-bean

我需要一种方法来保存由不同部分组成的用户选择的配置。每个部分都在一个单独的页面上从托管bean提供的列表中选择(每个部分类型一个)。

现在是有趣的部分。对于我在所有上述页面的模板中使用<ui:include>插入的所有页面,我都有一个始终可见的数据表。我希望这个数据表能够反映用户为部件做出的选择或更改。也许将这样的配置保存到数据库中,但现在这不是我的优先事项。它是一种购物车,但我没有不同的用户(它只是一个原型),因此无需登录。

这是我第一次遇到javaee,jsf,ejb,我不知道哪种方法最好。我已经阅读了不同的选项,我觉得无论哪种方式都有用,所以我可能会遗漏一些东西。

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

1 个答案:

答案 0 :(得分: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 /框架甚至远程客户端在webapp中的其他位置使用它,或者当您想要使用持久性上下文来锁定当前位于购物车,以便其他客户无法将其添加到购物车。 HttpSession无关紧要,因为JSF在那里存储了会话作用域的托管bean,你不希望将原始的Servlet API从JSF的外壳公开到外部。