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

Struts 框架 Controller 組件構建全解析

     編輯:Java 相關知識

Struts 採用 MVC Model 2 架構,Controller 核心是 ActionServlet,業務邏輯由 Action、ActionMapping、ActionForward 協作完成。

Controller 架構圖解

Struts Controller 組件示意圖

ActionServlet 接收請求,根據 struts-config.xml 映射查找 ActionMapping,實例化對應 Action 執行邏輯,最後通過 ActionForward 轉發到視圖。

核心組件開發

1. Action 實現

實現 Action 接口(或繼承 Action 基類),重寫 execute()(Struts 1.1+)或 perform()(1.0):

public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    // 1. 檢查用戶會話
    // 2. 校驗表單數據
    // 3. 調用業務邏輯 Bean
    // 4. 更新請求/會話屬性
    // 5. 返回 ActionForward
    return mapping.findForward("success");
}

線程安全鐵律:ActionServlet 單例,所有請求共享同一 Action 實例 → 只能使用局部變量,嚴禁實例變量。

2. ActionMapping 配置

封裝請求路徑到 Action 類的映射關係,屬性包括:

  • path:匹配的 URI 路徑(如 /logon)
  • type:Action 類全限定名
  • name:ActionForm Bean 名稱
  • scope:request/session
  • validate:是否自動校驗
  • input:校驗失敗返回頁面
  • forward:邏輯名到物理頁面映射(局部轉發)

可擴展 ActionMapping 增加自定義屬性(如 success/failure),實現 Action 與具體 JSP 解耦。

3. ActionForward 使用

三種獲取方式:

  1. 全局轉發:mapping.findForward("logicalName") 先找局部,再找全局。
  2. 局部轉發:在 <action> 內嵌套 <forward>。
  3. 動態創建:new ActionForward("/path.jsp") 或帶重定向標誌。

4. struts-config.xml 示例

<action-mappings>
  <forward name="logon" path="/logon.jsp"/> <!-- 全局轉發 -->
  <action path="/logon"
          type="org.apache.struts.example.LogonAction"
          name="logonForm"
          scope="request"
          input="/logon.jsp"
          validate="true">
    <forward name="success" path="/mainMenu.jsp"/> <!-- 局部轉發 -->
  </action>
</action-mappings>

5. web.xml 配置

<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern> <!-- 擴展映射 -->
</servlet-mapping>

擴展映射 *.do 比前綴映射 /execute/* 更常用,URL 如 /logon.do。

設計最佳實踐

  • 業務邏輯委託給 Service/DAO,Action 僅做控制流轉。
  • 捕獲所有異常並記錄日誌,避免拋到容器導致 500 頁面。
  • 避免大而全的 Action,拆分細粒度 Action。
  • 利用邏輯轉發名解耦視圖路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved