2010-04-28 61 views
0

我已经创建了一个简单的购物车。它存储一个项目确定,我可以返回页面,项目仍然存在,但只要我将另一个项目添加到购物车,它会重置并只存储该项目。有任何想法吗?有状态EJB不保留信息

由于

@Stateful(name="CartSessionBean") 
@Remote(CartSession.class) 
public class CartSessionBean implements CartSession, java.io.Serializable { 

    private Cart items; 

    @Init 
    public void create() { 
     items = new Cart(); 
    } 

    public void add(Book item, int qty) { 

     items.addItem(item, qty); 

    } 

Cart.java

@Entity 

@Table(名称= “购物车”) 公共类车实现java.io.Serializable {

@Id @GeneratedValue 
@Column(name="id") 
private int id; 

@Column(name = "total") 
private Double total; 

@OneToMany(mappedBy="cart") 
private Set<Item> items; 

public Cart(){ 
    // not valid? 

} 

//setters and getters 

public int getOrder(){ 
    return id; 
} 

public void setOrder(int order){ 
    this.id = order; 
} 

public Double getTotal(){ 
    return total; 
} 

public void setTotal(Double q){ 
    this.total = q; 
} 

public Set<Item> getItems(){ 
    return this.items; 
} 

public void setItems(Set<Item> i){ 
    this.items = i; 
} 

public void addItem(Book b, int qty) { 

    if(items == null) { 
     items = new HashSet(); 
    } 

    Item i = new Item(); 
    i.setBook(b); 
    i.setQty(qty); 

    this.items.add(i); 
} 

public void removeItem(Item id) { 
    this.items.remove(id); 
} 

public void emptyCart() { 
    this.items.clear(); 
} 

}

Servlet的

public class ServletCart extends HttpServlet { 

    private Set<Item> items; 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 

     // NO need. 

     // DO WE HAVE A REMOVE REQUEST?? 

     if (items == null) { 

      try { 
       InitialContext context = new InitialContext(); 
       CartSession cartitems = (CartSession) context.lookup("CartSessionBean/remote"); 
       items = cartitems.getItems(); 
      } catch (NamingException e) { 
       throw new ServletException("JNDI problem", e); 
      } 

     } 

     RequestDispatcher view = request.getRequestDispatcher("cart.jsp"); 
     request.setAttribute("items", items); 
     request.setAttribute("size", items.size()); 
     view.forward(request, response); 
    } 

    @Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 

     // Add a book :s/ 

     String isbn = request.getParameter("isbn"); // Does this ISBN exsit? 
     int quantity = Integer.parseInt(request.getParameter("qty")); // Is this a number ? 

     Book bk; 

     try { 
      InitialContext context = new InitialContext(); 
      BookSession guestbookSession = (BookSession) context.lookup("BookSessionBean/remote"); 
      bk = guestbookSession.getBook(isbn); 

      CartSession cartitems = (CartSession) context.lookup("CartSessionBean/remote"); 
      cartitems.add(bk, quantity); 

      this.items = cartitems.getItems(); 

     } catch (NamingException e) { 
      throw new ServletException("JNDI problem", e); 
     } 

     request.setAttribute("response", bk.getBookTitle() + " Added."); 

     doGet(request, response); 

    } 
} 
+0

购物车类是什么样的? 你可以在“create/init”方法中加入一些日志代码来查看你的购物车是否正在重新初始化?更新了 – 2010-04-28 16:14:42

+0

。谢谢 – 2010-04-28 16:15:56

+0

每次添加书籍时,都会调用create/init。导致重置。 – 2010-04-28 16:26:40

回答

0

没有与代码的几个问题所呈现:

  1. 你不能在一个servlet实例变量存储不同步。所有对servlet的请求都共享同一个实例,所以实例变量将被共享。
  2. CartSession.getItems是一个远程方法调用,所以返回的项目列表被复制并按值传递。看起来你可能一直试图解决这个问题?
  3. 每次调用context.lookup(“CartSessionBean/remote”)将创建一个有状态会话bean的新实例。

你需要做的是这样的:找到,或从HttpServletRequest中创建一个HttpSession,找到或创建的会话推车实例,然后用手推车会话bean工作。