Model 是處理業務邏輯、封裝資料狀態的核心組件。Struts 採用 ActionForm(表單資料封裝)+ Action(控制流程)+ JavaBean/EJB(業務實體)三層 Model 結構。
| 作用域 | 生命週期 | 可見範圍 | Servlet API 對應 |
|---|---|---|---|
| page | 單一 JSP 請求 | 當前頁面 | service 方法區域變數 |
| request | 單一請求(含 forward/include) | 當前請求鏈 | Request 屬性 |
| session | 用戶會話期間 | 同用戶所有請求 | Session 屬性 |
| application | Web 應用生命週期 | 所有用戶、所有頁面 | ServletContext 屬性 |
// Servlet 存入 request 範圍
MyBean bean = new MyBean();
request.setAttribute("bean", bean);
// JSP 取出使用
<jsp:useBean id="bean" scope="request" class="com.example.MyBean"/>
reset()、validate(),不含業務邏輯validate() 執行,複雜業務驗證移至 Action 或 Service 層public class UserForm extends ActionForm {
private String username;
private String email;
// 標準 getter/setter
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
// 重置表單預設值
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.username = "";
this.email = "";
}
// 表單驗證
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (username == null || username.trim().length() == 0) {
errors.add("username", new ActionMessage("error.username.required"));
}
if (email != null && !email.matches(".+@.+\\..+")) {
errors.add("email", new ActionMessage("error.email.invalid"));
}
return errors;
}
}
<form-bean name="userForm" type="com.example.UserForm"/>
<action path="/saveUser" type="com.example.SaveUserAction"
name="userForm" scope="request" validate="true" input="/userForm.jsp">
<forward name="success" path="/success.jsp"/>
</action>
代表應用運行時狀態,如購物車、用戶會話資訊、庫存快照。小型系統可直接保持完整狀態;大型系統通常對應資料庫實體,按需載入/釋放。Entity EJB 亦屬此類。
封裝核心業務規則、運算、工作流。Struts Action 僅作為薄委派層,將請求轉交給業務 Bean:
public class OrderService {
public Order createOrder(Cart cart, User user) {
// 1. 業務驗證
// 2. 庫存檢查
// 3. 計算價格、稅費
// 4. 持久化訂單
// 5. 發送確認通知
return order;
}
}