首页 文章

Servlet数据成员保持会话?

提问于
浏览
0

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

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

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

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

谢谢你的帮助

2 回答

  • 3

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

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

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

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

    它是共享的 .

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

    会话特定数据应存储在 HttpSession 中 .

  • 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;
        }
    
    }
    

相关问题