我是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);
}
}
受管Bean
@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";
}
}
Facelet
<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>
答案 0 :(得分:1)
您的托管bean应该是会话期间的SessionScope。
在你的情况下,你总是为每个请求创建新的ProductController bean,因此你总是注入不同的CartSessionBean(容器怎么可能知道它应该将相同的SessionBean注入到你的RequestScope受管Bean中)。