2011-07-22 30 views
0

我正在构建一个来自现有项目的Web应用程序。在现有的项目中,我有一个包含所有对象和我可以用它们做的事情的类。 我在想,如果我有这个类的一个实例,一个servlet作为数据成员会发生什么:Servlet数据成员保持会话吗?

  1. 当同一会话相同的用户定向到包含这个类将它保持它的servlet的数据或者每次都会重新生成?
  2. 是否每个用户/会话都有该成员的不同副本或共享?
  3. 如果servlet中的数据成员不保持同一会话的状态,那么您推荐什么?也许积极地将它添加到会话?

感谢您的帮助

回答

3

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

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

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

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

它是共享的。

如果servlets中的数据成员不保持同一会话的状态,那么您推荐什么?也许积极地将它添加到会话?

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

+0

只是为了确保我理解正确:如果我有一个持续的错误文本为一个用户一个String类型的servlet的数据成员,如果另一个人会从不同的浏览器,他将连接得到相同的错误文本?我的印象是,由于servlet用于动态页面,每个用户都有自己的版本... – Ran

+0

@Ran,是的,另一个用户将得到相同的错误文本。每个Web应用程序只有一个servlet实例,为所有*请求提供服务(在不同的线程中),并且servlet甚至不是线程安全的。见例如[这个线程](http://stackoverflow.com/questions/2183974/difference-each-instance-of-servlet-and-each-thread-of-servlet-in-servlets)的更多细节。 –

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

}