Бин с состоянием сессии - проблема потери состояния - PullRequest
1 голос
/ 03 января 2012

У меня есть код сервлета, который вызывает код сессионного компонента с сохранением состояния и увеличивает его значение int. Но когда я в следующий раз вызываю сервлет и соответствующий ему боб, бин теряет свое состояние и снова начинает с начала увеличения. Кто-нибудь может мне помочь, как решить эту проблему. Мой код ниже:

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();
       }
   }

}

Ответы [ 3 ]

4 голосов
/ 03 января 2012

В своем коде вы создаете новый 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, не похоже на то, что вы вводите компонент с состоянием.Для меня это выглядит как обычный объект Java.

0 голосов
/ 06 января 2012

Это не проблема EJB.Вы создаете POJO, а не EJB.Вызов новой функции каждый раз инициирует новый объект.Это не бобовая инъекция.

0 голосов
/ 03 января 2012

Похоже, в вашем сервлете вы не пытаетесь вспомнить, с какой 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.

...