Model-View-Controller (MVC) 模式早已成為 Web 應用架構的標準。Apache Struts 作為最早、最成熟的 Java MVC 框架,提供高度可配置、可擴展的組件模型,讓開發者專注於業務邏輯而非基礎設施代碼。本文從 MVC 理論出發,通過手寫簡易框架對比,深度解析 Struts 核心組件與最佳實踐。

圖 1:Model 2 / MVC 架構
login.jsp:輸入用戶名/密碼,表單提交到 Controller,攜帶 action=login 參數welcome.jsp:從 Session 讀取 UserBean,顯示歡迎信息ControllerServlet:根據 action 參數分發到對應 Action 類Action 接口:execute(Request, Response) : String 返回下一頁路徑LoginAction:驗證用戶,創建 UserBean 放入 Session,返回 /welcome.jspUserBean:簡單 JavaBean,封裝用戶屬性,無持久化邏輯Struts 1.1 (2001) 成為 Apache Jakarta 項目,廣泛應用於電信、電商等領域。其核心優勢:
ActionServlet 作為前端控制器,統一請求分發struts-config.xml 管理 Action 映射、表單驗證、頁面流轉html, bean, logic) 簡化 JSP 開發,支持國際化、表單自動綁定、錯誤顯示ActionForm 作為表單數據載體,自動填充、驗證,屬 Controller 組件而非 Model<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html>
<body>
<html:errors/>
<html:form action="/logon">
<html:text property="username"/>
<html:password property="password"/>
<html:submit/>
</html:form>
</body>
</html:html>
無 Scriptlet 混雜,表單自動綁定 ActionForm,<html:errors> 自動顯示驗證錯誤。
// ActionForm:表單數據載體,僅含 getter/setter
public class LoginForm extends ActionForm {
private String username, password;
// getter/setter...
}
// Action:業務處理入口
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) {
LoginForm f = (LoginForm) form;
if ("sam".equalsIgnoreCase(f.getUsername()) && "password".equals(f.getPassword())) {
return mapping.findForward("success"); // 對應 struts-config.xml 定義
}
return mapping.findForward("failure");
}
// 表單驗證(可選)
public ActionErrors validate(ActionMapping mapping, HttpServletRequest req) {
ActionErrors errors = new ActionErrors();
if (getUsername() == null || getUsername().length() == 0)
errors.add("name", new ActionError("error.name.required"));
return errors;
}
}
Struts 不綁定 Model 實現技術,可用 EJB、Hibernate、JDO、簡單 JavaBean。建議 Model 與 ActionForm 分離,便於復用。
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.example.LoginForm"/>
</form-beans>
<action-mappings>
<action path="/Login" forward="/login.jsp"/>
<action path="/Welcome" forward="/welcome.jsp" name="loginForm" scope="request"/>
<action path="/ProcessLogin" type="com.example.LoginAction"
name="loginForm" scope="request" validate="true" input="/Login.do">
<forward name="success" path="/Welcome.do"/>
<forward name="failure" path="/Login.do"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/> <!-- 國際化資源 -->
</struts-config>
<html:form action="/ProcessLogin">
<html:errors/>
<html:text property="username"/>
<html:password property="password"/>
<html:submit/>
</html:form>
<bean:write name="loginForm" property="username"/>
validate="true" 啟用 ActionForm.validate()input="/Login.do" 驗證失敗返回頁面<message-resources> 綁定屬性文件,錯誤碼如 error.name.required 映射到具體文本


Struts 將 MVC 模式工程化、標準化,通過配置而非代碼控制流程,大幅提升開發效率與可維護性。雖然後續 Spring MVC、Struts 2 等框架更先進,但理解 Struts 1.x 的核心設計(前端控制器、ActionForm、聲明式配置)對掌握現代 Web 框架本質極有幫助。