首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Struts 框架核心:Controller 組件構建詳解

     編輯:Java 程式設計入門

一、概述

在 Struts 架構中,Controller 主要由 ActionServlet 擔任,但業務邏輯操作則由 Action、ActionMapping、ActionForward 協同完成。其中 Action 扮演真正業務邏輯實現者,ActionMapping 與 ActionForward 指定不同業務流程的執行方向。

應用程式的 Controller 部分專注於:接收客戶端請求(通常是瀏覽器用戶)、決定執行何種商業邏輯功能、將生成下一步用戶介面的責任委派給適當的 View 組件。在 Struts 中,Controller 基礎組件是 ActionServlet 類別的 Servlet。該 Servlet 透過一組映射(由 Java 介面 ActionMapping 描述)配置。每個映射定義一個與請求 URI 相匹配的路徑,以及一個 Action 類別(實作 Action 介面)的完整類名,負責執行預期商業邏輯,再將控制權分派給適當的 View 組件產生回應。

Struts 也支援擴充 ActionMapping 類別以包含標準屬性以外的額外屬性,允許保存應用專屬資訊同時享用框架其餘特性。此外,Struts 允許定義控制重導向的邏輯名,行為方法可請求「主選單」頁面而不需知道對應 JSP 實際檔名,極大分離控制邏輯(下一步做什麼)與顯示邏輯(頁面名稱)。圖 1 為 Struts Controller 組件示意圖。

二、建立 Controller 組件

Struts 包含一個實現「請求 URI 映射至 Action 類別」主要功能的 Servlet。我們與 Controller 相關的主要職責:

  1. 為每個可能接收的邏輯請求撰寫一個 Action 類別(實作 Action 介面)。
  2. 撰寫定義類名與各映射相關資訊的 ActionMapping 類別(實作 ActionMapping 介面)。
  3. 編寫 Action 映射配置檔(XML)配置 Controller Servlet。
  4. 更新 Web 應用部署描述符(XML)以包含必要 Struts 組件。

1. Action 實作

Action 介面定義單一必須實作的方法:

public ActionForward perform(ActionServlet servlet,
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException;

Action 類別目標:處理請求,返回標識 JSP 頁面的 ActionForward 物件,控制應重導向該 JSP 生成回應。Struts 架構對每個 Action 類別僅建立一個實例,服務所有用戶請求,故必須確保 Action 類別在多執行緒環境下正確運作。圖 2 顯示 execute() 方法如何被存取。

注意:自訂 Action 子類別必須覆寫 execute() 方法,因預設返回 null。

Model 2 設計模式下典型 Action 邏輯

  1. 驗證用戶 Session 狀態(如檢查登入)。若無有效 Session,重導向至登入頁(用戶可能從書籤進入或 Session 逾時)。
  2. 若未經驗證(未用 ValidatingActionForm),驗證 Form Bean 屬性。發現問題則儲存錯誤訊息鍵值至請求屬性,重導向回輸入表單修正。
  3. 執行請求處理(如資料庫寫入)。可內嵌代碼,但通常調用商業邏輯 Bean 方法執行。
  4. 更新將用於生成下一個用戶介面的伺服器端物件(通常是 request 或 session 範圍 Bean)。
  5. 返回適當的 ActionForward 物件,基於新近更新的 Bean。通常透過接收的 ActionMapping 調用 findForward() 取得(邏輯名局部於映射),或在 Controller Servlet 上調用(全域邏輯名)。

Action 類別編程設計要點

  • Controller Servlet 僅建立一個 Action 實例服務所有請求,需編寫執行緒安全的程式碼,如同編寫 Servlet service() 方法。
  • 最重要原則:Action 類別僅使用區域變數而非實例變數。區域變數建立於各請求執行緒的堆疊,無共享風險。
  • 代表 Model 層的 Bean 仍可能拋出例外,應在 perform() 中捕獲所有這類例外,並記錄至應用日誌(含堆疊追蹤)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved