在 Servlet 中開發階段作業管理

關於這項作業

此資訊與程式碼撰寫範例 SessionSample.java 相結合,提供了一個程式設計模型,可在您自己的 Servlet 中實作階段作業。

程序

  1. 取得 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 ,如果這個使用者還沒有階段作業,則會建立一個階段作業。)

  2. 儲存並擷取階段作業中使用者定義的資料。

    建立階段作業之後,您可以將使用者定義資料新增及擷取至階段作業。 HttpSession 物件具有類似 java.util.Dictionary 中用來新增、擷取及移除任意 Java 物件的方法。

    在程式碼範例的步驟 2 中, Servlet 會從 HttpSession 讀取整數物件,增加它,並將它寫回。 您可以使用任何名稱來識別 HttpSession 物件中的值。 程式碼範例使用名稱 sessiontest.counter。

    因為 HTTP 階段作業物件在使用者可能存取的 Servlet 之間共用,所以請考慮採用整個網站的命名慣例,以避免衝突。

  3. 選用項目: 輸出包含來自 HttpSession 物件之資料的 HTML 回應頁面。
  4. 提供意見給使用者,指出在階段作業期間已採取動作。 您可能想要將 HTML 程式碼傳遞至用戶端瀏覽器,指出已發生動作。
    例如,在程式碼範例的步驟 3 中, Servlet 會產生傳回給使用者的網頁,且每次使用者在階段作業期間造訪該網頁時都會顯示 sessiontest.counter 的值。
  5. 選用項目: 通知接聽器。
    當階段作業準備結束並失效時,會通知儲存在實作 javax.servlet.http.HttpSessionBindingListener 介面的階段作業中的物件。 此通知可讓您執行階段作業後處理,包括將階段作業期間所做的資料變更永久儲存至資料庫。
    附註: 為了與 Java Platform, Enterprise Edition 7 相容,當階段作業失效時,階段作業管理機能必須移除階段作業的屬性。 這項需求可能導致呼叫 HttpSessionBindingListener.valueUnbound() 方法兩次。 若要避免這些重複的呼叫,請在階段作業失效之前,明確地移除應用程式內的階段作業屬性。
  6. 結束階段作業。
    您可以結束階段作業:
    • 如果階段作業在指定時間內處於非作用中狀態,則會自動使用「階段作業管理」機能。 管理者提供一種方法來指定階段作業失效之前的時間量。
    • 編寫 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>");    
   }
}