早期 JSP 常將資料存取、業務邏輯、流程控制與 HTML 混雜在單一頁面,導致強耦合、難測試、難維護。Struts 作為 MVC Model 2 的開源實作,透過 ActionServlet (Controller)、ActionForm (表單狀態)、Action (業務包裝) 三大核心類別,配合 struts-config.xml 集中管理流程,實現關注點分離。
Client Browser
│ HTTP Request
▼
ActionServlet (Front Controller)
│ 依 struts-config.xml 映射
├──→ ActionForm (自動填入表單資料、驗證)
│
└──→ Action (業務邏輯薄包裝)
│ 呼叫 Business Layer (EJB/POJO/Service)
▼
ActionForward (決定下一個視圖)
│
▼
JSP View (僅含 Struts 標籤、EL、JSTL)
| 類別 | 角色 | 關鍵特性 |
|---|---|---|
| ActionServlet | Command 模式實作,唯一前端控制器 | 啟動時載入 struts-config.xml,將請求分派給對應 Action |
| ActionForm | 表單資料載體 (Request/Session Scope) | 自動對應 request.getParameter(),提供 validate() 鉤子 |
| Action | Adapter 模式,包裝實際業務邏輯 | execute() 回傳 ActionForward,不應包含業務細節 |
| ActionMapping | 單一請求映射資訊容器 | 包含 path、type、name、input、forwards 等屬性 |
<html:form> 自動產生 action、focus、JavaScript 驗證腳本。<bean:write>、<logic:iterate> 替代 Scriptlet。<bean:message key="..."/> 支援國際化 (i18n)。<html:errors/> 自動渲染 ActionErrors。<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:form action="/join" focus="email">
<html:text property="email" size="30" maxlength="30"/>
<html:submit property="submit" value="Submit"/>
</html:form>
<html:errors/>
<action path="/join"
name="joinForm"
type="web.mailinglist.JoinAction"
scope="request"
input="/joinMVC.jsp"
validate="true">
<forward name="success" path="/welcome.html"/>
</action>
| 優點 | 缺點/限制 |
|---|---|
| 標準化 MVC、集中式流程控制、豐富標籤庫、開源社群 | 框架本身複雜度高、學習曲線陡峭、早期版本變動大 |
| 關注點分離、頁面設計師與開發者並行作業 | 僅適用 Web 層、Action 為類而非介面、客戶端驗證/工作流支援較弱 |
現代建議:新專案優先考慮 Spring MVC、Spring Boot 或 Jakarta EE (JSF, JAX-RS)。Struts 1.x 已停止維護,僅供維護舊系統參考。