会话范围的托管 bean、有状态 bean、httpsession

发布于 2024-12-16 10:32:44 字数 377 浏览 4 评论 0原文

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

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

这是我第一次接触 javaee、jsf、ejb,我不知道哪一个是最好的方法。我已经阅读了有关不同选项的信息,我觉得两种方法都可以,所以我可能会错过一些东西。

我很感激有人为我指出正确的方向。

i need a way to save a user chosen configuration composed of different parts. each part is chosen on a separate page, from a list supplied by a managed bean (one per part type).

now the fun part. i have a datatable, always visible, same for all pages that i inserted with <ui:include> in the template for all the above mentioned pages. i want this datatable to reflect the choices or changes in choice that users make for the parts. maybe save such a configuration to the db as well, but that's not my priority now. it's sort of a shopping cart, but i haven't got different users(it's only a prototype), so no login necessary.

this being my first encounter with javaee, jsf, ejb, I don't know which would be the best approach. I have read about the different options, and I feel like either way would work, so I may be missing something.

I would appreciate someone pointing me in the right direction.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘和柠 2024-12-23 10:32:44

您可以使用会话范围的托管 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;
    }

}

(您可以使用 MapMap 来跟踪数量)

然后您可以按如下方式显示购物车:

<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,并且您不希望将原始 Servlet API 从 JSF 的底层暴露到外部。

You can use a session scoped managed bean to hold the cart information. Here's a basic kickoff example (duplicate products and quantity not accounted; it's just to give the overall idea):

@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;
    }

}

(you could use a Map<Product, Integer> or Map<Product, Order> to track the quantity)

You could then display the cart as follows:

<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>

You could add products to the cart from another table as follows:

<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>

A stateful EJB is only interesting if you want to be able to use it elsewhere in the webapp by different APIs/frameworks or even in remote clients, or when you want to make use of persistence context to lock the items currently in the cart, so that other customers can't add it to the cart. The HttpSession is not relevant as JSF stores session scoped managed beans in there anyway and you don't want to expose raw Servlet API from under the covers of JSF to outside.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文