Apache Struts 作為早期 Java Web 開發的標杆框架,完整實現了 Model-View-Controller (MVC) 設計模式,將業務邏輯、頁面展示與請求調度清晰分離。本指南系統梳理 Struts 1.x 的核心組件、開發流程與最佳實踐,助您快速構建可維護的企業級應用。
Model 層由 JavaBeans 構成,分為系統狀態 Bean(如購物車、用戶信息)與業務邏輯 Bean(封裝具體操作,如結帳、庫存扣減)。Struts 建議將「做什麼」(業務邏輯)與「決定做什麼」(Action 類)分離,支持普通 JavaBeans、EJB 或 Spring 管理的服務對象。
視圖層以 JSP 為主,結合 Struts 提供的豐富自定義標籤庫(HTML 表單標籤、邏輯標籤、Bean 標籤等)實現國際化、表單自動回顯與驗證錯誤顯示。頁面中僅包含模板文本與標籤,動態數據由框架自動注入。
核心控制器 ActionServlet 接收所有請求,根據 struts-config.xml 中的 <action> 映射,實例化對應的 Action 類執行業務邏輯,最後通過 ActionForward 轉發至目標視圖。映射支持邏輯名稱(如 success、failure),實現控制邏輯與具體頁面路徑的解耦。
Web 應用中 Bean 可存放於四種作用域:page、request、session、application。理解生命週期與可見性對正確共享數據至關重要。例如,購物車宜置於 session;只讀配置數據適合 application。
ActionForm 接口,僅包含屬性 Getter/Setter,不含業務邏輯。<jsp:setProperty property="*">) → 傳遞給 Action.perform()。狀態 Bean 映射數據庫記錄(如 CustomerBean 對應 CUSTOMERS 表),可為自容器管理或需外部持久化。業務邏輯 Bean 封裝具體操作(如 checkout()),設計時避免依賴 Servlet API,以便復用於非 Web 環境(批處理、Swing 客戶端等)。
load-on-startup) 初始化連接池,存入 ServletContext (application 作用域)。Connection 參數,不自行獲取連接,實現環境無關性。基於 java.util.ResourceBundle 與 Struts MessageResources,通過 ApplicationResources.properties 及語言變體文件(如 _zh_TW.properties)管理文案。JSP 中使用 <struts:message key="..."/> 動態取值,用戶切換語言只需變更 Session 中的 Locale。
對比傳統 <input value="<%=bean.getProp()%>">,Struts 標籤 <struts:text name="prop"/> 自動綁定 FormBean 屬性,極大簡化頁面開發。完整示例見 logon.jsp:<struts:form> 關聯 logonForm,<struts:text>/password 自動回顯,<struts:errors/> 統一展示錯誤。
ValidatingActionForm,重寫 validate() 返回錯誤鍵值數組,框架自動轉回輸入頁並顯示 <struts:errors>。iterate 遍歷集合、link 自動維護 Session ID、property 唯讀顯示等。使用 <jsp:include page="..." flush="true"/> 實現運行時動態組裝(如門戶頁的搜索框、新聞區、郵件提醒),支持條件包含;靜態片段用 <%@ include file="..." %>。圖表生成可採用 Servlet 輸出圖片流或 Applet 方案。
public ActionForward perform(ActionServlet servlet,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException;
核心職責:檢查登錄態 → 表單驗證(若未自動驗證) → 調用業務 Bean → 更新請求/會話屬性 → 返回 ActionForward。關鍵原則:
servlet.log()),轉向友好錯誤頁。內建 ActionMappingBase 滿足基本需求;若需額外屬性(如例子中的 success/failure 邏輯視圖名),可繼承並配置於 struts-config.xml,框架自動注入屬性值。
<action-mappings>
<forward name="logon" path="/logon.jsp"/>
<action path="/logon"
actionClass="org.apache.struts.example.LogonAction"
formAttribute="logonForm"
formClass="org.apache.struts.example.LogonForm"
inputForm="/logon.jsp">
<forward name="success" path="/mainMenu.jsp"/>
</action>
</action-mappings>
<forward> 定義邏輯視圖名,Action 中通過 mapping.findForward("success") 獲取,實現頁面重命名不影響 Java 代碼。
config (映射文件)、application (資源包基類)、mapping (自定義 Mapping 類)、debug、load-on-startup 等初始化參數。*.do) 或 前綴匹配 (/execute/*)。<taglib> 指向 /WEB-INF/struts.tld。struts.jar 放入 WEB-INF/lib,struts.tld 放入 WEB-INF。Struts 通過嚴格的 MVC 分層、標準化的控制器調度、強大的標籤庫與國際化支持,為早期 Java Web 開發確立了工程化規範。雖然現代框架 (Spring MVC, Struts2) 已演進,但其核心思想——關注點分離、配置驅動、標籤封裝——仍值得深入理解與借鑑。