我需要一种方法来保存由不同部分组成的用户选择的配置。每个部分都在一个单独的页面上从托管bean提供的列表中选择(每个部分类型一个)。
现在是有趣的部分。对于我在所有上述页面的模板中使用<ui:include>
插入的所有页面,我都有一个始终可见的数据表。我希望这个数据表能够反映用户为部件做出的选择或更改。也许将这样的配置保存到数据库中,但现在这不是我的优先事项。它是一种购物车,但我没有不同的用户(它只是一个原型),因此无需登录。
这是我第一次遇到javaee,jsf,ejb,我不知道哪种方法最好。我已经阅读了不同的选项,我觉得无论哪种方式都有用,所以我可能会遗漏一些东西。
我希望有人指出我正确的方向。
答案 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的外壳公开到外部。