我正在从现有项目构建Web应用程序 . 在现有项目中,我有一个包含所有对象的类以及我可以用它们做的事情 . 我想知道如果我将这个类的实例作为数据成员作为servlet会发生什么:
当具有相同会话的同一用户被定向到包含该类的servlet时,它将保留其数据还是每次都重新生成?
每个用户/会话是否都有此成员的不同副本或是否已共享?
如果servlet中的数据成员不保持同一会话的状态,那么您建议什么?也许激活地将它添加到会话中?
谢谢你的帮助
Servlet - 因此它们的数据成员 - 在服务器上的所有会话之间共享 . 从而
数据将保留(对所有用户),直到您重新启动Web应用程序 .
每个用户/会话是否都有该成员的不同副本或是否共享?
它是共享的 .
会话特定数据应存储在 HttpSession 中 .
HttpSession
为了确保这种行为,我写了一点 TestingServlet - 我将向您展示servlet及其成员的生命周期 . 还提供;如何使用会话变量
TestingServlet
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; } }
2 回答
Servlet - 因此它们的数据成员 - 在服务器上的所有会话之间共享 . 从而
数据将保留(对所有用户),直到您重新启动Web应用程序 .
它是共享的 .
会话特定数据应存储在
HttpSession
中 .为了确保这种行为,我写了一点
TestingServlet
- 我将向您展示servlet及其成员的生命周期 . 还提供;如何使用会话变量