Struts 2 引入 WebWork 配置機制,大幅提升靈活度。本文系統梳理 struts.properties、struts.xml 的核心配置要素。
struts.properties(WEB-INF/classes):系統級常數struts.xml:Action、Result、攔截器等應用配置web.xml Filter 參數:部署層級覆蓋三者可相互覆蓋,例如 struts.i18n.encoding=UTF-8 三處皆可設定。
<package> 將相關 Action、Result、攔截器分組,支援繼承:
<package name="default" extends="struts-default" namespace="/">
<action name="foo" class="mypackage.SimpleAction">
<result>greeting.jsp</result>
</action>
</package>
| 屬性 | 必填 | 說明 |
|---|---|---|
| name | 是 | Package 識別名,供繼承引用 |
| extends | 否 | 繼承父 Package 行為 |
| namespace | 否 | URL 前綴,預設 / |
| abstract | 否 | 抽象 Package,不定義 Action |
解析順序自上而下,父 Package 必須在子 Package 之前定義。
/:根命名空間,直接對應 Context 路徑""(空字串):預設命名空間,找不到時回退/barspace:URL 需包含前綴 /barspace/actionName查找順序:指定 namespace → 根 namespace → 預設 namespace。Struts 標籤可指定 namespace 提交不同模組 Action。
<action name="Logon" class="tutorial.Logon" method="execute">
<result type="redirect-action">Menu</result>
<result name="input">/tutorial/Logon.jsp</result>
</action>
name:與 namespace 組合唯一標識class:Action 實現類,預設 ActionSupportmethod:指定執行方法,支援通配符
<action name="*Crud" class="example.Crud" method="{1}"/>
<!-- editCrud → edit(), deleteCrud → delete() -->
<action name="Crud_*" class="example.Crud" method="{1}"/>
<!-- Crud_input → input(), Crud_delete → delete() -->
<!-- 無 class 時使用 ActionSupport -->
<action name="Hello"/>
<!-- 找不到 Action 時回退 -->
<default-action-ref name="UnderConstruction"/>
<!-- 通配符映射到同名 JSP -->
<action name="*">
<result>/{1}.jsp</result>
</action>
五大預設結果名:success、none、error、input、login。
<result-types>
<result-type name="dispatcher" class="..." default="true"/>
</result-types>
簡寫形式:<result>/ThankYou.jsp</result>(預設 name=success, type=dispatcher)。
<global-results>
<result name="error">/Error.jsp</result>
<result name="login" type="redirect-action">Logon_input</result>
</global-results>
<action name="fragment" class="FragmentAction">
<result name="next" type="redirect-action">${nextAction}</result>
</action>
Action 中 getNextAction() 決定導向目標。
預設攔截器堆疊已含 exception 攔截器。配置範例:
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="SQLException"/>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>
<action name="DataAccess" class="com.company.DataAccess">
<exception-mapping exception="com.company.SecurityException" result="login"/>
<result name="SQLException" type="chain">SQLExceptionAction</result>
<result>/DataAccess.jsp</result>
</action>
<interceptors>
<interceptor name="security" class="com.jpleasure.security.SecurityInterceptor"/>
<interceptor-stack name="secureStack">
<interceptor-ref name="security"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="secureStack"/>
Action 可覆蓋堆疊:<interceptor-ref name="defaultComponentStack"/>。攔截器鏈按定義順序執行。
<struts>
<include file="Home.xml"/>
<include file="Hello.xml"/>
<include file="/util/POJO.xml"/>
</struts>
支援相對/絕對路徑,便於大型專案拆分維護。