Struts 2 的 Action 採用低侵入式設計:不需繼承基類、不需實現介面、不與 Servlet API 直接耦合。Action 本質上是一個 POJO,通常包含無參數的 execute() 方法,可定義多個業務方法並通過配置映射為獨立 Action,實現代碼複用。
public class UserAction {
private String username, password;
// getter/setter 省略
public String execute() throws Exception { return "success"; }
public String regist() throws Exception { return "success"; }
public String login() throws Exception { return "success"; }
}
getContext().getSession() → 模擬 HttpSessiongetContext().getApplication() → 模擬 ServletContextgetContext().getParameters() → 模擬 Request 參數ServletContextAware、ServletRequestAware、ServletResponseAware<action name="loginAction" class="example.UserAction" method="login">
<result name="success">/success.jsp</result>
</action>
<action name="registAction" class="example.UserAction" method="regist">
<result name="success">/success.jsp</result>
</action>
<!-- 單層通配符:*Action → method={1} -->
<action name="*Action" class="example.UserAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
<!-- 雙層通配符:*_* → class=example.{1}Action, method={2} -->
<action name="*_*" class="example.{1}Action" method="{2}"> ... </action>
{1} 匹配第一個 *,{2} 匹配第二個 *。
需額外引入 struts2-convention-plugin。struts.xml 仍需存在(可僅保留常量配置)。
| 註解 | 作用 |
|---|---|
@ParentPackage | 指定繼承的父包(如 "struts-default") |
@Namespace | 定義命名空間(對應 URL 路徑前綴) |
@Action | 標註在方法上,value 為訪問路徑 |
@Result | 定義結果視圖映射 |
@Results | 多結果陣列 |
@ExceptionMapping | 異常映射處理 |
@ParentPackage("struts-default")
@Namespace("/user")
@Results({
@Result(name="success", location="/msg.jsp"),
@Result(name="error", location="/error.jsp")
})
@ExceptionMappings({
@ExceptionMapping(exception="java.lang.RuntimeException", result="error")
})
public class LoginAction extends ActionSupport {
private String loginname, pwd;
@Action(value="login")
public String login() {
if ("qq".equals(loginname) && "123".equals(pwd)) return SUCCESS;
return ERROR;
}
@Action(value="add", results={@Result(name="success", location="/index.jsp")})
public String add() { return SUCCESS; }
// getter/setter 省略
}
註解式配置適合中小型專案,大型專案建議集中管理 XML 配置以便維護。