2009-11-04 108 views
1

我有幾個.jsp頁面和幾個servlet。如何在jsp頁面和servlet之間共享數據

我需要保存一些信息到會話變量。在JSP頁面中我只是指

session.get...() 

session.set...() 

沒有明確聲明HttpSession對象。

但是在servlet中,正確的編程規則適用,我必須先創建一個對象。

我擔心的是,如果我創建這樣

HttpSession session = new HttpSession(); 

,然後一個物體使用這樣

session.setAttribute("files",fileList); 

我關心的事情是,我不寫同一會話對象寫入它那在.jsp文件中被引用。

我該怎麼做才能在任何jsp或servlet中寫入同一個對象。

回答

6

您需要通過調用HttpServletRequest.getSession()方法來獲取HttpSession。

將HttpServletRequest傳遞給您的doGet()方法。如果此請求沒有到位,則getSession()將創建一個。如果一個會話已經就緒並且與這個請求相關聯,那麼getSession()將取回現有的會話。如果您使用此標準機制,那麼您將自動共享您的JSP和servlet之間的相同會話。

您不應該直接嘗試構建HttpSession,因爲它由容器管理。事實上,你不能通過調用新的HttpSesion()來創建一個新的,因爲HttpSession只是一個接口,不能實例化。

5

要預處理數據,請使用Servlet的doGet()方法。

Data data = dataDAO.load(); 
request.setAttribute("data", data); 
request.getRequestDispatcher("page.jsp").forward(request, response); 

要訪問數據在JSP,使用EL(其搜索在頁面,請求,會話和應用範圍在此爲了使具有給定名稱的屬性)。

<br>Plain object: ${data} 
<br>A property: ${data.property} 
<br>Explicitly search in request scope: ${requestScope.data} 

要將數據從JSP發送到servlet,通常使用由客戶端控制的請求參數。最常用的HTML表單已被用於此。或者,您也可以使用JavaScript來向服務器端發出異步請求。

任何在一定範圍內的東西都可以用於任何生活在同一範圍內的東西。請求範圍從客戶端發起請求(通過單擊鏈接,按鈕,書籤或在地址欄中輸入URL)開始,直到服務器發送最後一位響應爲止。您通常將請求特定數據存儲在那裏,例如表單數據。會話範圍從客戶端第一次請求網頁並且尚未創建HttpSession的那一刻起開始,直到HttpSession超時之後纔可以在web.xml中配置,或者代碼使用HttpSession#invalidate()明確超時。您通常將用戶特定的數據存儲在那裏,例如登錄用戶和用戶首選項等。應用程序範圍從服務器啓動到服務器關閉(或重新啓動)的那一刻都存在。您通常會在其中存儲應用程序範圍的數據,如靜態下拉數據,DAO工廠,web應用程序配置數據等。

該請求可以通過Servlet類中的HttpServletRequest參數訪問。
會話可以通過Servlet類中的HttpServletRequest#getSession()訪​​問。
應用程序可以通過Servlet類中的繼承的getServletContext()方法訪問。
他們都有一個get/setAttribute()方法。

要了解有關JSP/Servlet/EL的更多信息,我可以向您推薦Sun Java EE 5 tutorial part II chapters 1-8

祝你好運。

+0

我想你所說的是我使用servlet不是直接保存到會話對象,而是將數據傳遞給保存到會話對象的jsp。這聽起來很公平。 – Ankur 2009-11-04 14:52:06

+2

您不應該在JSP中使用scriptlet。該邏輯屬於Java類,如servlet/dao/bean/utilclass /等。僅在JSP中使用taglibs/EL。祝你好運。 – BalusC 2009-11-04 15:00:38