【发布时间】:2023-03-12 16:35:02
【问题描述】:
我正在尝试使用 Stateful Session bean 对 EJB 3.1 进行编程。 我应该很清楚什么是 EJB 以及有状态、无状态和单例之间的区别。
但是我的有状态 bean 有一个奇怪的行为。它表现为单身! 我的意思是从几个客户端/浏览器/机器调用下面的 servlet (ShoppingCartServlet)...,返回相同的 bean 并且每次都增加相同的值。 “count”值是从客户端共享的,因为 bean 是一个单例。
请帮我理解!!
这里是代码。
Servlet 代码
@WebServlet(name="ShoppingCartServlet", urlPatterns="/shoppingCart")
public class ShoppingCartServlet extends HttpServlet {
private static final long serialVersionUID = 2789580260930727133L;
@EJB
private ShoppingCart shoppingCart;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int count = shoppingCart.increaseCount();
HttpSession session = request.getSession();
session.setAttribute("count", count);
String nextJSP = "/shoppingCart.jsp";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
dispatcher.forward(request, response);
}
}
EJB 代码
@Stateful
@LocalBean
public class ShoppingCart {
private int count;
public int increaseCount() {
count++;
return count;
}
}
Servlet 打包在一个 WAR 文件中,而 EJB 打包在一个 JAR 文件中。两者都部署在一个唯一的 EAR 文件中。
编辑:我尝试如下更改我的 servlet 代码,但现在每次调用都会创建一个新的 Stateful Bean。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Context ctx = new InitialContext();
ShoppingCart shoppingCart = (ShoppingCart) ctx.lookup("java:global/jeeapp/jeeapp-business/ShoppingCart!org.madbit.jeeapp.shopping.ejb.ShoppingCart");
int count = shoppingCart.increaseCount();
HttpSession session = request.getSession();
session.setAttribute("count", count);
String nextJSP = "/shoppingCart.jsp";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
dispatcher.forward(request, response);
}
【问题讨论】:
-
也许您可以使用 JAX-RS 代替 servlet?
标签: ejb-3.1 stateful stateful-session-bean