Apache Struts 1.x 是早期 Java Web 開發的經典 MVC 框架。雖然已停止維護,但理解其核心機制有助於掌握現代框架(如 Spring MVC)的設計思想。本文通過一個完整的用戶登錄案例,詳細拆解 Struts 的配置流程、核心組件協作及表單處理器 ActionForm 的進階用法。
創建 Java Web 項目,將 Struts 1.2.9 lib 目錄下的所有 JAR 包複製到項目的 WEB-INF/lib 目錄下。
在 web.xml 中配置 ActionServlet 作為前端控制器,攔截所有 *.do 請求。
<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>
<init-param>
<param-name>debug</param-name>
<param-value>2</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>
創建 LoginActionForm 繼承 ActionForm,屬性對應 JSP 表單字段,提供 Getter/Setter。
public class LoginActionForm extends ActionForm {
private String username;
private String password;
// Getter/Setter 方法省略...
// 可選:覆寫 validate() 實現服務端校驗
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (username == null || username.trim().isEmpty()) {
errors.add("username", new ActionMessage("error.username.required"));
}
return errors;
}
}
LoginAction 繼承 Action,覆寫 execute 方法,處理業務邏輯並返回轉向。
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginActionForm loginForm = (LoginActionForm) form;
String username = loginForm.getUsername();
String password = loginForm.getPassword();
UserManager userManager = new UserManager();
try {
userManager.login(username, password); // 業務邏輯驗證
request.setAttribute("username", username);
return mapping.findForward("success"); // 跳轉成功頁
} catch (UserNotFoundException e) {
request.setAttribute("msg", "用戶不存在: " + username);
} catch (PasswordErrorException e) {
request.setAttribute("msg", "密碼錯誤");
}
return mapping.findForward("error"); // 跳轉失敗頁
}
}
struts-config.xml 將 Action、FormBean、Forward 關聯起來。
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.example.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<action path="/login"
type="com.example.struts.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/login.jsp">
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp"/>
</action>
</action-mappings>
</struts-config>
使用 Struts HTML 標簽庫綁定表單數據。login.jsp、login_success.jsp、login_error.jsp。
struts-config.xml 中聲明屬性,無需編寫 Java 類,靈活適合頻繁變動的表單,但失去編譯期類型檢查。<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
</form-beans>
在 Action 中使用:
DynaActionForm dynaForm = (DynaActionForm) form;
String username = (String) dynaForm.get("username");
Integer age = (Integer) dynaForm.get("age");
name 屬性完全一致。validate() 方法實現服務端數據校驗,失敗時自動返回 input 指定頁面並回顯數據。Struts 1.x 通過 ActionServlet 統一入口,配合 struts-config.xml 解耦請求映射、表單封裝、業務邏輯與視圖轉向。ActionForm 作為表單數據的載體,極大簡化了 request.getParameter 的繁瑣操作,並內建驗證與數據回顯機制,是早期 MVC 模式在 Java Web 中的經典落地。