我想知道是否有方法在兩個或多個Servlet之間共享變量或對象,我的意思是一些「標準」方式。我想這不是一個好的做法,但是可以更簡單地構建原型。如何在兩個或多個Servlet之間共享變量或對象?
我不知道這是否取決於所使用的技術,但我會用Tomcat 5.5
我想分享一個簡單的類的對象(只是公共屬性,一個字符串vector,整數等)。我的意圖是有一個像DB中的靜態數據,當Tomcat停止時顯然會丟失。 (它只是用於測試)
我想知道是否有方法在兩個或多個Servlet之間共享變量或對象,我的意思是一些「標準」方式。我想這不是一個好的做法,但是可以更簡單地構建原型。如何在兩個或多個Servlet之間共享變量或對象?
我不知道這是否取決於所使用的技術,但我會用Tomcat 5.5
我想分享一個簡單的類的對象(只是公共屬性,一個字符串vector,整數等)。我的意圖是有一個像DB中的靜態數據,當Tomcat停止時顯然會丟失。 (它只是用於測試)
我認爲你要找的是請求,會話或應用程序數據。
在一個servlet可以作爲一個屬性對象添加到請求對象,會話對象或servlet上下文對象:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
String shared = "shared";
request.setAttribute("sharedId", shared); // add to request
request.getSession().setAttribute("sharedId", shared); // add to session
this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}
如果你把它放在請求對象將是提供給的servlet,被轉發,直到請求完成:
request.getAttribute("sharedId");
如果你把它放在會議也將提供給所有servlet向前發展,但該值將被捆綁到用戶:
request.getSession().getAttribute("sharedId");
直到會話基於用戶的不活動而到期。
是由您重置:在應用程序運行時
request.getSession().removeAttribute("sharedId");
如果你把它放在servlet上下文也將可用:
request.getSession().invalidate();
或者一個servlet的從範圍中刪除
this.getServletConfig().getServletContext().getAttribute("sharedId");
直到你刪除它:
this.getServletConfig().getServletContext().removeAttribute("sharedId");
難道你不能只把對象放在HttpSession中,然後通過它在每個servlet中的屬性名來引用它?
e.g:
getSession().setAttribute("thing", object);
...然後在另一個servlet:
Object obj = getSession.getAttribute("thing");
doesnt對象必須是可序列化的才能工作? – Jus12 2013-09-06 16:56:04
取決於預期的數據的使用範圍。
如果數據僅用於每個用戶,如用戶登錄信息,頁面訪問次數等,請使用會話對象 (httpServletRequest.getSession().get/setAttribute(String [,Object]) )
如果跨多個用戶(總網頁命中,工作線程等)的數據相同,則使用ServletContext屬性。 getServletContext()。get/setAttribute(String [,Object]))這隻會在同一個war文件/ web應用程序中工作。請注意,這些數據在重新啓動時也不會持久。
如果你不小心,使用ServletContext可能很容易讓你陷入麻煩。例如,您無法使用它以簡單的方式實現頁面命中計數:從上下文獲取當前頁面命中數,將其增加並將值設置爲上下文。多線程殺死了這個解決方案。 – JavadocMD 2008-09-23 21:06:49
把它放在3個不同的範圍之一。
要求 - 持續的請求生命
會議 - 持續的用戶會話的生命
應用 - 一直持續到applciation關閉
您可以通過HttpServletRequest的變量是訪問所有這些作用域傳入的方法延伸從HttpServlet class
另一個選項,共享數據之間的上下文...
share-data-between-servlets-on-tomcat
<Context path="/myApp1" docBase="myApp1" crossContext="true"/>
<Context path="/myApp2" docBase="myApp2" crossContext="true"/>
在myApp1:
ServletContext sc = getServletContext();
sc.setAttribute("attribute", "value");
在myApp2:
ServletContext sc = getServletContext("/myApp1");
String anwser = (String)sc.getAttribute("attribute");
這裏是我是如何做到這與碼頭。
https://stackoverflow.com/a/46968645/1287091
使用服務器上下文中,其中一個單是一個嵌入式Jetty服務器的啓動過程中寫入和共享服務器的生活中的所有web應用中。假設在上下文中只有一個編寫器 - 也可以用來在webapps之間共享對象/數據 - 否則您需要注意併發性。
它很大程度上取決於它是什麼樣的對象/變量。變量是否屬於一個類,並且您只需要訪問?這是一個常數嗎?一個例子會很好。 – Swati 2008-09-23 20:34:14
我希望這有助於:) – 2008-09-23 20:43:24