我有一个servlet代码,它调用有状态会话bean代码并增加它的int值。但是,当我下次调用servlet及其相应的bean时,bean会丢失它的状态,并再次从开始递增开始。任何人都可以帮我解决这个问题。我的代码如下:
public class CounterServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Counter counter = new Counter() ;
HttpSession clientSession = request.getSession(true);
clientSession.setAttribute("myStatefulBean", counter);
counter.increment() ;
// go to a jsp page
} catch (Exception e) {
out.close();
}
}
}
答案 0 :(得分:4)
在您的代码中,每次请求进入时都会创建新的Counter
,然后将新的Counter
保存到客户端的会话中。因此,您的计数器始终从头开始递增。
在给他一个新客户之前,你应该检查客户是否已经有Counter
。这将是以下内容:
HttpSession clientSession = request.getSession();
Counter counter = (Counter) clientSession.getAttribute("counter");
if (counter == null) {
counter = new Counter();
clientSession.setAttribute("counter", counter);
}
counter.increment();
此外,在本主题的名称中,您提到了Stateful session bean
。但是,注入新Counter
的方式看起来并不像是在注入有状态bean。它对我来说看起来像普通的Java对象。
答案 1 :(得分:0)
在您的servlet中,您似乎并未尝试记住第一个请求所服务的SFSB。因此,下次请求进入时,您将创建一个没有状态的新SFSB。
基本上你需要做的是(伪代码)
Session x = httpRequest.getSession
if (!mapOfSfsb.contains(x) {
Sfsb s = new Sfsb();
mapOfSfsb.put(x,s);
}
Sfsb s = mapOfSfsb.get(x);
s.invokeMethods();
即:获取http请求并查看是否附加了会话。如果是,请检查此会话是否已存在SFSB并使用它。否则,创建一个新的SFSB并将其粘贴到会话中。
您还需要添加一些代码来清除旧的不再使用的SFSB。
答案 2 :(得分:0)
这不是EJB问题。您正在创建POJO而不是EJB。每次调用新函数都会启动一个新的对象。它不是Bean注入。