2017-04-25 80 views
0

我正在与JEE一起购物车上工作。我的web应用程序由一个有状态会话bean和两个带有相应JSP页面的servlet组成。一个servlet允许将新项目添加到购物车,另一个允许列出购物车的内容。如何使用状态会话Bean在不同页面之间保持数据持久性?

有状态会话bean应该保存跨页面的购物车状态,但购物车总是显示为空。你能帮我找出我的代码有什么问题,并解释为什么当前的实现是不够的?

Servlet来一个新的项目添加到购物车:

package my.servlet; 

import my.entity.BookEntity; 
import my.entity.ItemEntity; 
import my.session.BookBean; 
import my.session.CartBean; 

import javax.ejb.EJB; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import java.io.IOException; 

@WebServlet("/item") 
public class ItemServlet extends HttpServlet { 

    @EJB 
    private BookBean bookBean; 

    @EJB 
    private CartBean cartBean; 

    @PersistenceContext(unitName = "book-pu") 
    private EntityManager bookManager; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
    ServletContext ctx = getServletContext(); 
    long book = Long.parseLong(request.getParameter("book"), 10); 
    RequestDispatcher dispatcher = ctx.getRequestDispatcher("/jsp/item.jsp"); 
    request.setAttribute("book", bookManager.find(BookEntity.class, book)); 
    request.setAttribute("item", null); 
    dispatcher.forward(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
    ServletContext ctx = getServletContext(); 
    int qty = Integer.parseInt(request.getParameter("qty"), 10); 
    long book = Long.parseLong(request.getParameter("book"), 10); 
    RequestDispatcher dispatcher = ctx.getRequestDispatcher("/jsp/item.jsp"); 
    ItemEntity item = new ItemEntity(bookManager.find(BookEntity.class, book), qty); 
    request.setAttribute("book", bookManager.find(BookEntity.class, book)); 
    request.setAttribute("item", item); 
    cartBean.addItem(item); 
    dispatcher.forward(request, response); 
    } 
} 

Servlet来列出车的内容:

package my.servlet; 

import my.session.CartBean; 

import javax.ejb.EJB; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

@WebServlet("/cart") 
public class CartServlet extends HttpServlet { 

    @EJB 
    private CartBean cartBean; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
    ServletContext ctx = getServletContext(); 
    RequestDispatcher dispatcher = ctx.getRequestDispatcher("/jsp/cart.jsp"); 
    request.setAttribute("items", cartBean.getAllItems()); 
    dispatcher.forward(request, response); 
    } 
} 

有状态会话Bean:

package my.session; 

import java.util.ArrayList; 
import java.util.Collection; 

import javax.annotation.PostConstruct; 
import javax.ejb.LocalBean; 
import javax.ejb.Remove; 
import javax.ejb.Stateful; 
import javax.ejb.StatefulTimeout; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import java.util.concurrent.TimeUnit; 
import my.entity.ItemEntity; 

@LocalBean 
@Stateful 
@StatefulTimeout(unit = TimeUnit.MINUTES, value = 30) 
public class CartBean implements CartItf { 

    private Collection<ItemEntity> items; 

    @PersistenceContext(unitName = "book-pu") 
    private EntityManager itemManager; 

    @PostConstruct 
    public void initialize() { 
    items = new ArrayList<ItemEntity>(); 
    } 

    @Override 
    public void addItem(ItemEntity item) 
    { 
    items.add(item); 
    } 

    @Override 
    public Collection<ItemEntity> getAllItems() 
    { 
    return items; 
    } 

    @Remove 
    @Override 
    public void confirmOrder() 
    { 
    for (ItemEntity item : items) { 
     itemManager.persist(item); 
    } 
    } 
} 

回答

1

你需要确保每次都重用相同的有状态而不是新实例(每个servlet)。你有多种选择:

  1. 添加@SessionScoped并用@Inject替代@EJB
  2. 查找程序的bean实例(新的InitialContext()),并把它在HttpSession
+0

我花了几个在这个问题上几个小时,你的解决方案的作品,非常感谢你! – leaf

相关问题