1

私はJavaEEにかなり慣れておらず、MavenWebアプリケーションを使用して単純なWebショップを構築しています。ステートフルセッションBeanに問題があります。私はネットを検索してさまざまなソリューション(ほとんどはサーブレットを使用するためのもの)を試しましたが、うまくいかないようです。

とにかく、私の問題は、セッション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";
    }
 }

フェイスレット

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

1 に答える 1

1

管理対象Beanは、セッション中に存続するためにSessionScopeである必要があります。

あなたの場合、リクエストごとに常に新しいProductController Beanを作成します。そのため、常に異なるCartSessionBeanを注入します(同じSessionBeanをRequestScopeマネージドBeanに注入する必要があることをコンテナが知る方法はありません)。

于 2012-06-04T11:20:58.567 に答える