我对Java EE相当陌生,并且正在使用maven Web应用程序构建一个简单的网上商店。我的状态会话Bean有问题。我一直在网上搜索并尝试了不同的解决方案(大多数解决方案都使用servlet),但它似乎不起作用。

无论如何,我的问题是我试图使用会话bean来跟踪购物车中的内容。我正在使用arrayList存储项目。但是,当我添加新项目时,它只是替换了旧项目,而不是将其添加到列表中。我猜测会话bean会以某种方式更新或创建它的新实例,但是我似乎找不到任何解决方案或有关此信息。

有状态会话bean

@Stateful
@LocalBean
public class CartSessionBean{
    private List contents;

    public CartSessionBean(){
        contents= new ArrayList();
    }

    public List getContents() {
        return contents;
    }

    public void addProduct(String title) {
        contents.add(title);
    }
 }


托管豆

@ManagedBean
@RequestScoped
public class ProductController {

    private List cartList = new ArrayList();
    private int nrOfCartItems=0;
    @EJB private CartSessionBean cart;


    public String doAddCart(String title)
    {
        cart.addProduct(title);
        setCartList(cart.getContents());
        setNrOfCartItems(cart.getContents().size());
        return "products.xhtml";
    }
 }


小面

<h:form>
<p>
    your cart contains <h:outputLabel class="" value="#{productController.nrOfCartItems}" /> items.
    <ui:repeat value="#{productController.cartList}" var="cart">
        <h:outputLabel value="#{cart}" />
    </ui:repeat>
    <h:commandButton value="go to checkout"/>
</p>
</h:form>

<h:form>
<h:dataTable value="#{productController.productList}" var="pr" border="0">
    <h:column>
        <h:graphicImage value="images/#{pr.picture}" />
    </h:column>
    <h:column>
        <h2><h:outputText value="#{pr.product_name}"/></h2>
        <p> in stock: <h:outputText value="#{pr.stock}"/><br/>
        price: <h:outputText value="#{pr.price}"/> SEK<br/><br/>
        <h:outputText value="#{pr.description}"/><br/></p>
        <h:commandButton value="add to cart" action="#{productController.doAddCart(pr.product_name)}"/>
    </h:column>
</h:dataTable>
</h:form>

最佳答案

您的托管bean应该是SessionScope才能在会话期间运行。

在您的情况下,您总是为每个请求创建新的ProductController Bean,因此,您总是注入不同的CartSessionBean(容器无法知道它应该将相同的SessionBean注入到您的RequestScope Managed Bean中)。

10-07 18:55
查看更多