我正在构建一个来自现有项目的Web应用程序。在现有的项目中,我有一个包含所有对象和我可以用它们做的事情的类。 我在想,如果我有这个类的一个实例,一个servlet作为数据成员会发生什么:Servlet数据成员保持会话吗?
- 当同一会话相同的用户定向到包含这个类将它保持它的servlet的数据或者每次都会重新生成?
- 是否每个用户/会话都有该成员的不同副本或共享?
- 如果servlet中的数据成员不保持同一会话的状态,那么您推荐什么?也许积极地将它添加到会话?
感谢您的帮助
我正在构建一个来自现有项目的Web应用程序。在现有的项目中,我有一个包含所有对象和我可以用它们做的事情的类。 我在想,如果我有这个类的一个实例,一个servlet作为数据成员会发生什么:Servlet数据成员保持会话吗?
感谢您的帮助
Servlet的 - 因而它们的数据成员 - 在服务器上的所有会话之间共享。因此
当具有相同会话的同一用户被引导到包含此类的servlet时,它会保存它的数据还是每次都会重新生成数据?
数据将被保留(对所有用户),直到您重新启动Web应用程序。
是否每个用户/会话都有该成员的不同副本或共享?
它是共享的。
如果servlets中的数据成员不保持同一会话的状态,那么您推荐什么?也许积极地将它添加到会话?
会话特定数据应存储在HttpSession
中。
为了确保这种行为,我写了一点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;
}
}
只是为了确保我理解正确:如果我有一个持续的错误文本为一个用户一个String类型的servlet的数据成员,如果另一个人会从不同的浏览器,他将连接得到相同的错误文本?我的印象是,由于servlet用于动态页面,每个用户都有自己的版本... – Ran
@Ran,是的,另一个用户将得到相同的错误文本。每个Web应用程序只有一个servlet实例,为所有*请求提供服务(在不同的线程中),并且servlet甚至不是线程安全的。见例如[这个线程](http://stackoverflow.com/questions/2183974/difference-each-instance-of-servlet-and-each-thread-of-servlet-in-servlets)的更多细节。 –