【问题标题】:Stateful Session Bean updates(?) on buttonclick单击按钮时有状态会话 Bean 更新(?)
【发布时间】:2023-04-05 15:29:01
【问题描述】:

我是 Java EE 的新手,我正在使用 maven web application 构建一个简单的网上商店。我的有状态会话 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>

【问题讨论】:

    标签: java ejb javabeans facelets enterprise


    【解决方案1】:

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

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

    【讨论】:

    • 哦,好吧。感谢您的帮助。你怎么做呢。如果您至少可以引导我朝着正确的方向前进,那就太好了,因为我在尝试在线搜索时完全迷失了方向。
    • 只需将托管 Bean(ProductController) 从 RequestScoped 更改为 SessionScoped 即可:-)
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2013-08-02
    • 2011-01-02
    相关资源
    最近更新 更多