【发布时间】:2017-09-15 18:51:45
【问题描述】:
我已经编写了有状态会话 bean:
@Stateful
public class SessionBean {
List<Integer> list = new ArrayList<>();
public void addItem(int s) {
list.add(s);
}
public int getItemsCount() {
return list.size();
}
}
并在我的 servlet 中使用它:
@WebServlet("/add")
public class AddServlet extends HttpServlet {
@Inject
SessionBean sessionBean;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int i = sessionBean.getItemsCount();
resp.getWriter().write(i + " ");
sessionBean.addItem(i + 1);
}
}
它按预期工作,列表保存状态,我可以在下一个请求中使用它。 但是,如果我在@Stateless 上更改@Stateful,我希望不存储bean 的状态,并进入每个请求的干净列表,但它总是保存先前请求的状态并显示新的数字。那么无状态和有状态有什么区别呢?怎么看?如我所见,它们的工作方式相同。 我想看到一个例子,它会显示类似的东西——这里我们使用有状态的,它保存状态,在这里我们改变无状态,它的工作方式不同,而不是保存状态。请告诉我不同之处。
【问题讨论】:
-
Web servlet 正在存储会话 bean 的状态。如果每个会话都需要一个新的
SessionBean,则必须手动创建它并将其存储在 http 会话中。更多信息请参考this thread。 -
见过一些情况,其中 SLSB 的行为类似于 SFSB。 IE SLSB 注入单例。在这种情况下,使用了相同的 SLSB 实例。我相信在您的情况下,同一个 bean 实例也已从池中重用。您是否尝试过多次并发调用 servlet URL?我相信如果你这样做了,这种伪状态效应就不会再出现了。
标签: java ejb stateless stateful