2012-06-04 35 views
1

我對Java EE相當陌生,我正在使用maven web應用程序構建一個簡單的webshop。我的狀態會話Bean有問題。我一直在尋找網絡,並嘗試了不同的解決方案(其中大部分是使用servlet),但似乎並不奏效。Stateful Session Bean在按鈕上更新(?)

無論如何,我的問題是我試圖使用我的會話bean來跟蹤購物車中的內容。我正在使用arrayList來存儲項目。但是,當我添加一個新項目時,它只是替換舊項目,而不是將其添加到列表中。我猜想session 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> 

回答

1

你受管bean應該是SessionScope在會話期間生存。

在你的情況下,你總是爲每個請求創建新的ProductController bean,因爲你總是注入不同的CartSessionBean(沒有辦法如何容器知道它應該注入相同的SessionBean到你的RequestScope Managed Bean中)。

+0

噢好吧。感謝您的幫助。儘管如此,你怎麼去做。如果你至少能夠把我引向正確的方向,那將是非常好的,因爲我完全失去了嘗試在網上搜索這個東西的感覺。 –

+1

只需將您的託管Bean(ProductController)從RequestScoped更改爲SessionScoped,就是這樣:-) –

+0

只是想說謝謝。這解決了我的問題:) –