常有這樣的夢:不知何來一本似乎是無字天書,而其中的字句卻是慢慢地、漸 顯可辨。同時現實中的自己完全能察覺這是一個夢,極怕即刻醒來,想多記取那 些天外之語。但總不能如願,醒來時還留有某些字句痕跡,再過後就全然忘卻。 仿佛進入的是一個太虛幻境。
1. 動態 Action:<action ../> 元素的一個前所未有的特性是,name 屬性可以用通配符,class 和 method 屬性中可以用 name 中的匹配參數,{0}/ {1} 的形式。舉兩個例子說明:
① <action name="*Action" class="com.unmi.LoginRegistAction" method="{1}">
URL 是 registAction.action 時,會執行 LoginRegistAction 類實例的 regist() 方法
② <action name="*_*" class="actions.{1}Action" method="{2}">
URL 是 Book_save.action 時,會執行 actions.BookAction 類實例的 save () 方法
說明:{1},{2}是用來匹配 name 屬性中的 *,這和正則表達式一樣的,{0} 表示的完整的 name 屬性值。這也是托 Struts2 的每請求產生新的 Action 的實 例才能這麼用的,試想一下,Struts1 是沒法針對通配符來預先加載好所有的 Action 實例的。
可由此定義一個能用的 Action,<result> 裡也能用參數。
<action name="*">
<result>/ {1}.jsp</result>
</action>
2. 關於在 <action .../> 中使用通配符時的校驗文件命名規則。校驗 文件的搜索規則是:
① <ActionClassName>-<ActionAliasName>-validation.xml <ActionAliasName> 為 name 屬性值
② <ActionClassName>-validation.xml
同時有這兩個文件時,後面的規則能與前面的規則疊加或覆蓋,例如 ① 中有 name域的校驗,② 中有password域的校驗,這兩個文件同時存在 <ActionClassName>所在路徑時,會同時校驗name和password域。
例如對於 <action name="*Action" class="com.unmi.LoginRegistAction" method="{1}">
URL 是 registAction.action 時,會搜索校驗文件 LoginRegistAction- registAction-validation.xml 和 LoginRegistAction-validation.xml。
3. 使用通配符就會涉及到 URL 與哪個 Action 匹配的問題。例如匹配有name 為 "*"、"*Action"、"LoginAction" 的 <action .../>,如果 URL 與某 個 Action 的 name 完全相同(如 LoginAction.action),否則按順序來匹配, 而不是按匹配度來對應。如 abcAction.action 會匹配到 "*",而不是 "*Action"。
4. 可配置默認的 Action,URL 匹配不到對應的 Action 時就用它,用 <default-action-ref ../> 配置在 <package .../> 中。
5. Struts2 支持兩種 <result ../>,配置在 <action .../> 中的局部 result,配置在 <global-results .../> 中的全局 result。 <result .../> 默認的 name 屬性是 "success";默認的 type 屬性是 "dispatcher",即使 JSP 類型。
6. <result .../> type="plaintext" 的 <result .../> 會顯 示頁面的源文件,如果其中有中文一般會產生亂碼,這時候可設置它的 charSet 屬性為 "GBK",用 <param .../> 標記。
7. <result .../> 的 dispatcher 和 redirect 類型的區別就是一個 是轉發(帶請求參數、屬性、址址欄不變)和重定向(丟失請求參數、屬性、重新產 生請求,所以地址欄會變)。
8. redirect-action 類型是重定(不是轉發)向到一個 Action 上,那麼要為 <result .../> 指定兩個參數 actionName 和 namespace。簡寫為 <result name="..." rediect-action">actionName</result>。這 種類型相當於在 Struts1 中的 <forward name="..." redirect="true">/anotherAction.do</forward> 寫法。當然在 Struts2 中也可以用 redirect 類型寫成相同的形式。
9. 動態結果資源有兩種,根據 <action .../> 的 name 屬性的模式匹 配後的參數和請求參數決定結果。
① <action name="crud_*" class="com.unmi.CrudAction" method="{1}">
<result>/ {1}.jsp</result>
</action>
URL 為 crud_delete.action 處理成功後會轉到 delete.jsp 頁。
② <action name="..." class="com.unmi.ShowAction">
<result>/show${user.type}</result>
</action>
要在 ShowAction 的設置了屬性 ${user.type}。例如 ${user.type} 設 置為 "admin",就會轉到 showadmin.jsp 頁。
10. Struts2 的 <result .../>、<global-result .../>意義與 效果完全對應於 Struts1 的 <forward .../>、<global-forward .../> 。