Action 直接依賴 HttpServletRequest 等 Servlet API 會導致:
Struts2 提供三個 Map 替代:
request → ActionContext.getContext().getParameters() 或 getSession()session → ActionContext.getContext().getSession()application → ActionContext.getContext().getApplication()public class LoginAction implements Action {
private String username, password;
public String execute() {
if ("1".equals(username) && "1".equals(password)) {
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("uname", username);
return SUCCESS;
}
return LOGIN;
}
// getter/setter 略
}
public class LoginAction implements Action, SessionAware {
private Map<String, Object> sessionMap;
public void setSession(Map<String, Object> map) { this.sessionMap = map; }
public String execute() {
if ("1".equals(username) && "1".equals(password)) {
sessionMap.put("uname", username); // 直接操作注入的 Map
return SUCCESS;
}
return LOGIN;
}
}
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("uname", username);
public class LoginAction implements Action, ServletRequestAware {
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest req) { this.request = req; }
// 後續直接用 request.getSession()
}
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="success">/s.jsp</result>
<result name="login">/login.jsp</result>
</action>
| 方式 | 耦合度 | 測試難度 | 適用場景 |
|---|---|---|---|
| ActionContext Map | 零耦合 | 極易 | 通用業務、單元測試優先 |
| 注入 Map (Aware) | 低 | 易 | 需明確語義的 session/request |
| ServletActionContext | 高 | 難 | 需直接操作 Servlet API 特有功能 |
| 注入 Servlet API | 最高 | 最難 | 極少見,避免使用 |
ActionContext 或 Aware 接口。HttpServletResponse 設定 Header/Cookie 時才考慮耦合方式。