2008-09-23 79 views
39

我想知道是否有方法在兩個或多個Servlet之間共享變量或對象,我的意思是一些「標準」方式。我想這不是一個好的做法,但是可以更簡單地構建原型。如何在兩個或多個Servlet之間共享變量或對象?

我不知道這是否取決於所使用的技術,但我會用Tomcat 5.5


我想分享一個簡單的類的對象(只是公共屬性,一個字符串vector,整數等)。我的意圖是有一個像DB中的靜態數據,當Tomcat停止時顯然會丟失。 (它只是用於測試)

+0

它很大程度上取決於它是什麼樣的對象/變量。變量是否屬於一個類,並且您只需要訪問?這是一個常數嗎?一個例子會很好。 – Swati 2008-09-23 20:34:14

+0

我希望這有助於:) – 2008-09-23 20:43:24

回答

74

我認爲你要找的是請求,會話或應用程序數據。

在一個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"); 
1

難道你不能只把對象放在HttpSession中,然後通過它在每個servlet中的屬性名來引用它?

e.g:

getSession().setAttribute("thing", object); 

...然後在另一個servlet:

Object obj = getSession.getAttribute("thing"); 
+0

doesnt對象必須是可序列化的才能工作? – Jus12 2013-09-06 16:56:04

7

取決於預期的數據的使用範圍。

如果數據僅用於每個用戶,如用戶登錄信息,頁面訪問次數等,請使用會話對象 (httpServletRequest.getSession().get/setAttribute(String [,Object]) )

如果跨多個用戶(總網頁命中,工作線程等)的數據相同,則使用ServletContext屬性。 getServletContext()。get/setAttribute(String [,Object]))這隻會在同一個war文件/ web應用程序中工作。請注意,這些數據在重新啓動時也不會持久。

+0

如果你不小心,使用ServletContext可能很容易讓你陷入麻煩。例如,您無法使用它以簡單的方式實現頁面命中計數:從上下文獲取當前頁面命中數,將其增加並將值設置爲上下文。多線程殺死了這個解決方案。 – JavadocMD 2008-09-23 21:06:49

8

把它放在3個不同的範圍之一。

要求 - 持續的請求生命

會議 - 持續的用戶會話的生命

應用 - 一直持續到applciation關閉

您可以通過HttpServletRequest的變量是訪問所有這些作用域傳入的方法延伸從HttpServlet class

2

另一個選項,共享數據之間的上下文...

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"); 
0

這裏是我是如何做到這與碼頭。

https://stackoverflow.com/a/46968645/1287091

使用服務器上下文中,其中一個單是一個嵌入式Jetty服務器的啓動過程中寫入和共享服務器的生活中的所有web應用中。假設在上下文中只有一個編寫器 - 也可以用來在webapps之間共享對象/數據 - 否則您需要注意併發性。

相關問題