会话作用域管理bean vs有状态bean vs httpsession



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

现在是有趣的部分。我有一个数据表,总是可见的,相同的所有页面,我与<ui:include>在模板中插入的所有上述页面。我希望这个数据表能够反映用户对部件所做的选择或更改。也许可以将这样的配置保存到数据库中,但这不是我现在的首要任务。它有点像购物车,但我没有不同的用户(它只是一个原型),所以不需要登录。

这是我第一次接触javaee, jsf, ejb,我不知道哪个是最好的方法。我已经阅读了不同的选择,我觉得两种方法都可以,所以我可能错过了什么。

如果有人给我指指方向,我会很感激的。

您可以使用一个会话作用域的托管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>

有状态EJB只有在您希望能够通过不同的api/框架甚至远程客户端在web应用程序的其他地方使用它时才有意义,或者当您希望使用持久性上下文来锁定当前在购物车中的项目时,以便其他客户无法将其添加到购物车中。HttpSession是不相关的,因为JSF在那里存储会话作用域的托管bean,无论如何,您不想从JSF的掩护下向外部公开原始Servlet API。

最新更新