Servlet数据成员保持会话?

时间:2011-07-22 08:33:53

标签: java session servlets

我正在从现有项目构建Web应用程序。在现有项目中,我有一个包含所有对象的类以及我可以用它们做的事情。 我想知道如果我将这个类的实例作为数据成员作为servlet会发生什么:

  1. 当具有相同会话的同一用户被定向到包含该类的servlet时,它会保留它的数据还是每次都重新生成?
  2. 每个用户/会话是否都拥有该成员的不同副本或是否已共享?
  3. 如果servlet中的数据成员不保持同一会话的状态,那么您建议什么?也许会激活地将它添加到会话中?
  4. 感谢您的帮助

2 个答案:

答案 0 :(得分:3)

Servlet - 因此它们的数据成员 - 在服务器上的所有会话之间共享。因此

  

当具有相同会话的同一用户被定向到包含该类的servlet时,它会保留它的数据还是每次都重新生成?

数据将保留(对于所有用户),直到您重新启动Web应用程序。

  

每个用户/会话是否都拥有该成员的不同副本或是否已共享?

分享。

  

如果servlet中的数据成员不保持同一会话的状态,那么您建议什么?也许激活地将它添加到会话中?

会话特定数据应存储在HttpSession

答案 1 :(得分:0)

为了确保这种行为,我写了一点TestingServlet - 我将向您展示servlet及其成员的生命周期。还提供;如何使用会话变量

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Basic servlet for lifecycle testing
 * 
 * @author powermicha
 * 
 */
public class TestingServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 4020575563844924588L;

    private Logger logger;

    private int requestCounter;

    @Override
    public void init() throws ServletException {
        logger = Logger.getLogger("TestingServlet_" + System.currentTimeMillis());
        logger.log(Level.INFO, "TestingServlet initialized");

        requestCounter = 0;
    }

    @Override
    public void destroy() {
        logger.log(Level.INFO, "TestingServlet destroyed");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        int requestsPerSession = incrementRequestsPerSession(req);

        String logMessage = "TestingServlet was called " + (++requestCounter) + " times. " 
                + requestsPerSession + " times from the same session (ID:"
                + req.getSession().getId() + ")";

        logger.log(Level.INFO, logMessage);

        // send it to the browser
        PrintWriter writer = resp.getWriter();
        writer.write(logMessage);
        writer.close();
    }

    private int incrementRequestsPerSession(HttpServletRequest req) {

        Integer counter = (Integer) req.getSession().getAttribute("requestsPerSession");
        if (counter == null) {
            counter = 1;
        } else {
            counter++;
        }

        req.getSession().setAttribute("requestsPerSession", counter);

        return counter;
    }

}