我正在構建一個來自現有項目的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)的更多細節。 –