我正在从现有项目构建Web应用程序。在现有项目中,我有一个包含所有对象的类以及我可以用它们做的事情。 我想知道如果我将这个类的实例作为数据成员作为servlet会发生什么:
感谢您的帮助
答案 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;
}
}