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

ActionServlet 接收請求,根據 struts-config.xml 映射查找 ActionMapping,實例化對應 Action 執行邏輯,最後通過 ActionForward 轉發到視圖。
實現 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 實例 → 只能使用局部變量,嚴禁實例變量。
封裝請求路徑到 Action 類的映射關係,屬性包括:
path:匹配的 URI 路徑(如 /logon)type:Action 類全限定名name:ActionForm Bean 名稱scope:request/sessionvalidate:是否自動校驗input:校驗失敗返回頁面forward:邏輯名到物理頁面映射(局部轉發)可擴展 ActionMapping 增加自定義屬性(如 success/failure),實現 Action 與具體 JSP 解耦。
三種獲取方式:
mapping.findForward("logicalName") 先找局部,再找全局。<action> 內嵌套 <forward>。new ActionForward("/path.jsp") 或帶重定向標誌。<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>
<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。