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 → 領域模型
<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>
<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>
ActionServlet.init() → 解析 struts-config.xml 構建 ActionMapping、FormBean 配置對象樹,存入 ServletContext。login.do → 容器匹配 *.do → 轉發給 ActionServlet。ActionServlet.service() → 根據 HTTP 方法調用 doGet/doPost → 統一調用 process() 核心方法。process() → processPath() 截取請求路徑 /login → processMapping() 在配置中查找對應 ActionMapping。processActionForm() → 實例化 LoginActionForm → 將請求參數 name、password 自動設置到 FormBean 屬性(自動類型轉換)。LoginAction → 調用 execute(mapping, form, request, response) → 業務邏輯驗證用戶 → 返回 ActionForward(如 mapping.findForward("success"))。ActionServlet 根據 ActionForward 類型:
redirect=false(默認):RequestDispatcher.forward() 服務端轉發,地址欄不變redirect=true:response.sendRedirect() 客戶端重定向,地址欄改變| 類/接口 | 核心職責 |
|---|---|
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")(需在配置中定義) → 轉發錯誤頁展示信息。
ActionServlet、RequestProcessor、ActionMapping 三大核心組件協作,有助於深入掌握 DispatcherServlet、HandlerMapping、HandlerAdapter 的設計哲學下篇將結合源碼與流程圖進行更深層次剖析。