關於這項作業
此資訊與程式碼撰寫範例 SessionSample.java 相結合,提供了一個程式設計模型,可在您自己的 Servlet 中實作階段作業。
程序
- 取得 HttpSession 物件。
如果要取得階段作業,請在 Java™ Servlet 3.0 API 中使用 javax.servlet.http.HttpServletRequest 物件的 getSession 方法。
當您第一次取得 HttpSession 物件時, Session Management 機能會使用三種方式之一來建立階段作業的追蹤 :Cookie、URL 重新編寫或 Secure Sockets Layer (SSL) 資訊。
已淘汰特性: WebSphere® Application Server 7.0 版中已淘汰使用 SSL ID 的階段作業追蹤。 您可以將階段作業追蹤配置成使用 Cookie ,或修改應用程式來使用 URL 重新編寫特性
假設「階段作業管理」機能使用 Cookie。 在這種情況下,「階段作業管理」機能會建立唯一的階段作業 ID ,並通常以 Cookie將它傳回瀏覽器。 此使用者 (在相同瀏覽器中) 的每一個後續要求都會傳遞包含階段作業 ID 的 Cookie ,「階段作業管理」機能會使用此 ID 來尋找使用者現有的 HttpSession 物件。
在程式碼範例的步驟 1 中,布林 (建立) 設為 true
,因此如果 HttpSession 物件不存在,則會建立該物件。 (在 Servlet 2.3 API 以及更新版本中,沒有布林的 javax.servlet.http.HttpServletRequest.getSession () 方法預設為 true
,如果這個使用者還沒有階段作業,則會建立一個階段作業。)
- 儲存並擷取階段作業中使用者定義的資料。
建立階段作業之後,您可以將使用者定義資料新增及擷取至階段作業。 HttpSession 物件具有類似 java.util.Dictionary 中用來新增、擷取及移除任意 Java 物件的方法。
在程式碼範例的步驟 2 中, Servlet 會從 HttpSession 讀取整數物件,增加它,並將它寫回。 您可以使用任何名稱來識別 HttpSession 物件中的值。 程式碼範例使用名稱 sessiontest.counter。
因為 HTTP 階段作業物件在使用者可能存取的 Servlet 之間共用,所以請考慮採用整個網站的命名慣例,以避免衝突。
- 選用項目: 輸出包含來自 HttpSession 物件之資料的 HTML 回應頁面。
- 提供意見給使用者,指出在階段作業期間已採取動作。 您可能想要將 HTML 程式碼傳遞至用戶端瀏覽器,指出已發生動作。
例如,在程式碼範例的步驟 3 中, Servlet 會產生傳回給使用者的網頁,且每次使用者在階段作業期間造訪該網頁時都會顯示 sessiontest.counter 的值。
- 選用項目: 通知接聽器。
當階段作業準備結束並失效時,會通知儲存在實作 javax.servlet.http.HttpSessionBindingListener 介面的階段作業中的物件。 此通知可讓您執行階段作業後處理,包括將階段作業期間所做的資料變更永久儲存至資料庫。
附註: 為了與 Java Platform, Enterprise Edition 7 相容,當階段作業失效時,階段作業管理機能必須移除階段作業的屬性。 這項需求可能導致呼叫 HttpSessionBindingListener.valueUnbound()
方法兩次。 若要避免這些重複的呼叫,請在階段作業失效之前,明確地移除應用程式內的階段作業屬性。
- 結束階段作業。
您可以結束階段作業:
- 如果階段作業在指定時間內處於非作用中狀態,則會自動使用「階段作業管理」機能。 管理者提供一種方法來指定階段作業失效之前的時間量。
- 編寫 Servlet 來呼叫階段作業物件上的 invalidate () 方法。
範例
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SessionSample extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Step 1: Get the Session object
boolean create = true;
HttpSession session = request.getSession(create);
// Step 2: Get the session data value
Integer ival = (Integer)
session.getAttribute ("sessiontest.counter");
if (ival == null) ival = new Integer (1);
else ival = new Integer (ival.intValue () + 1);
session.setAttribute ("sessiontest.counter", ival);
// Step 3: Output the page
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Session Tracking Test</title></head>");
out.println("<body>");
out.println("<h1>Session Tracking Test</h1>");
out.println ("You have hit this page " + ival + " times" + "<br>");
out.println ("Your " + request.getHeader("Cookie"));
out.println("</body></html>");
}
}