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

Struts 1 運行流程全解析:從請求攔截到結果視圖渲染

     編輯:C++ 入門

Struts 1 核心運行流程深度剖析:ActionServlet 中央控制器模式詳解

Struts 1 作為經典 MVC 框架,其核心是 ActionServlet 中央控制器。本文通過完整的登錄示例,詳細闡述從請求發起到視圖返回的完整流程,為理解現代 MVC 框架(Spring MVC 等)奠定基礎。

示例項目結構

Login.jsp          → 登錄頁面
web.xml            → 配置 ActionServlet、*.do 映射、啟動加載
struts-config.xml  → FormBean、ActionMapping、Global Forwards 配置
LoginAction.java   → 業務邏輯處理、返回 ActionForward
LoginActionForm.java → 表單數據封裝 JavaBean
UserManager.java   → 業務服務層、拋出自定義異常
User.java          → 領域模型

核心配置文件

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> <!-- 所有 .do 請求進入 -->
</servlet-mapping>

struts-config.xml

<struts-config>
    <form-beans>
        <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
    </form-beans>
    <action-mappings>
        <action path="/login" type="com.bjpowernode.struts.LoginAction" name="loginForm" scope="request" input="/Login.jsp">
            <forward name="success" path="/login_success.jsp"/>
            <forward name="error" path="/login_error.jsp"/>
        </action>
    </action-mappings>
    <global-forwards>
        <forward name="success" path="/login_success.jsp"/>
        <forward name="error" path="/login_error.jsp"/>
    </global-forwards>
</struts-config>

七大核心執行步驟

  1. 初始化階段:容器啟動 → ActionServlet.init() → 解析 struts-config.xml 構建 ActionMapping、FormBean 配置對象樹,存入 ServletContext。
  2. 請求攔截:用戶提交 login.do → 容器匹配 *.do → 轉發給 ActionServlet。
  3. 方法分發:ActionServlet.service() → 根據 HTTP 方法調用 doGet/doPost → 統一調用 process() 核心方法。
  4. 路徑匹配與 ActionMapping 查找:process() → processPath() 截取請求路徑 /login → processMapping() 在配置中查找對應 ActionMapping。
  5. FormBean 自動裝填:processActionForm() → 實例化 LoginActionForm → 將請求參數 name、password 自動設置到 FormBean 屬性(自動類型轉換)。
  6. Action 業務執行:實例化 LoginAction → 調用 execute(mapping, form, request, response) → 業務邏輯驗證用戶 → 返回 ActionForward(如 mapping.findForward("success"))。
  7. 結果視圖轉發:ActionServlet 根據 ActionForward 類型:
    • redirect=false(默認):RequestDispatcher.forward() 服務端轉發,地址欄不變
    • redirect=true:response.sendRedirect() 客戶端重定向,地址欄改變
    最終渲染 JSP 頁面返回瀏覽器。

關鍵類職責速覽

類/接口核心職責
ActionServlet中央控制器、請求分發、配置管理、生命周期控制
ActionMapping封裝單個 Action 配置:path、type、name、forwards 等
ActionForm表單數據載體、自動裝填、驗證(validate())、重置(reset())
Action業務邏輯入口、execute() 返回 ActionForward
ActionForward封裝轉發目標:path、name、redirect 模式
RequestProcessor核心處理鏈(process()),可覆蓋自定義流程

異常處理流程

示例中 UserManager.ValidateUser() 拋出 UserNotFoundException、PasswordErrorException → LoginAction 捕獲 → 設置 request.setAttribute("message", e.getMessage()) → 返回 mapping.findForward("fail")(需在配置中定義) → 轉發錯誤頁展示信息。

總結與現代對比

  • Struts 1 採用 Pull-MVC:Action 從 Request/Session 拉取數據,邏輯與視圖耦合度較高
  • 現代 Spring MVC 採用 Push-MVC:Controller 方法參數綁定、返回 ModelAndView/字符串,解耦更徹底
  • 理解 Struts 1 的 ActionServlet、RequestProcessor、ActionMapping 三大核心組件協作,有助於深入掌握 DispatcherServlet、HandlerMapping、HandlerAdapter 的設計哲學

下篇將結合源碼與流程圖進行更深層次剖析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved