Struts 2 支援動態結果配置,減少重複 <result> 宣告。兩大核心機制:通配符映射與Action 屬性驅動視圖。
test_* 模式)利用 {1} 佔位符捕獲通配符匹配部分,同時作為方法名與視圖資源名。
<action name="test_*" class="testAction.TestAction" method="{1}">
<result name="error">error.jsp</result>
<result>{1}.jsp</result>
</action>
test_success.action 匹配 test_*。{1} 捕獲 success。success() 方法。success 映射至物理視圖 success.jsp。${property} 語法)視圖資源路徑由 Action 實例的屬性值動態決定。
public class Test1Action extends ActionSupport {
private String name; // 對應表單輸入欄位
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String execute() {
return "jiagoushi".equals(name) ? SUCCESS : ERROR;
}
}
<form action="test1" method="post">
<input type="text" name="name">
<input type="submit" value="提交">
</form>
建立 jiagoushi.jsp、error.jsp 等對應頁面。
<action name="test1" class="testAction.Test1Action">
<result name="error">error.jsp</result>
<result>${name}.jsp</result> <!-- 動態解析 name 屬性 -->
</action>
jiagoushi 送出表單。name 注入 Action 屬性。execute() 回傳 SUCCESS。${name}.jsp 解析為 jiagoushi.jsp。${} 內支援完整 OGNL 運算式:
${name}:直接屬性值。${name.toUpperCase()}:方法呼叫。${user.profile.theme}:巢狀屬性導航。${(status == 'ok') ? 'success' : 'error'}:三元運算。Action 執行之後,屬性值必須在 execute() 前已注入完畢。