2012-06-04 4 views
1

Я довольно новичок в Java EE, и я создаю простой интернет-магазин, используя веб-приложение maven. У меня проблема с моей сессионной сессией. Я искал сеть и пробовал разные решения (большинство из них использовало сервлеты), но, похоже, это не работает.Обновления с учетом состояния сеанса (?) On buttonclick

В любом случае, моя проблема заключается в том, что я пытаюсь использовать свой сеансовый компонент, чтобы отслеживать, что находится в корзине покупок. Я использую arrayList для хранения элементов. Однако, когда я добавляю новый элемент, он просто заменяет старый элемент, а не добавляет его в список. Я предполагаю, что компонент сеанса каким-то образом обновляется или создается новый экземпляр, но я просто не могу найти никакого решения или информации об этом.

сессионного компонента

@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

Ваш управляемый компонент должен быть SessionScope для жизни во время сеанса.

В вашем случае вы всегда создаете новый компонент ProductController для каждого запроса, и из-за этого вы всегда добавляете другой CartSessionBean (нет способа узнать, как контейнер должен вводить тот же SessionBean в ваш управляемый компонент RequestScope).

+0

О, ладно. Спасибо вам за помощь. Как вы это делаете? Было бы здорово, если бы вы могли хотя бы направить меня в правильном направлении, потому что я чувствую себя совершенно потерянным, пытаясь найти этот онлайн. –

+1

Просто измените свой управляемый компонент (ProductController) с RequestScoped на SessionScoped и вот он :-) –

+0

Просто хотел сказать спасибо. Это решило мою проблему :) –

Смежные вопросы