2011-07-22 56 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; 
    } 

}