簡述STRUTS2 Convention零配置
從 struts2.1 開始, struts2 不再推薦使用 Codebehind 作為零配置插件,而是改為使用 Convention 插件來支持零配置,和 Codebehind 相比, Convention 插件更徹底,該插件完全拋棄配置信息,不僅不需要是使用 struts.xml 文件進行配置,甚至不需要使用 Annotation 進行配置,而是由 struts2 根據(jù)約定自動配置。
如何使用 Convention
1. ?????? 將 struts-Convention-plugin-2.1.6.jar 文件復制到 WEB-INF/lib 路徑下
2. ?????? 對于 Convention 插件而言,它會自動搜索位于 action , actions , struts , struts2 包下的所有 java 類, Convention 插件會把如下兩種 java 類當成 Action 處理:
1) ? 所有實現(xiàn)了 com.opensymphony.xwork2.Action 的 java 類
2) ? 所有類名以 Action 結尾的 java 類
3. ?????? Convention 插件還允許設置如下三個常量:
1) ? struts.Convention.exclude.packges: 指定不掃描哪些包下的 java 類,位于這些包結構下的 java 類將不會自動映射成 Action ;
2) ? struts.convention.package.locators:Convention 插件使用該常量指定的包作為搜尋 Action 的根包。對于 actions.fore.LoginAction 類,按約定原本應映射到 /fore/login; 如果將該常量設為 fore ,則該 Action 將會映射到 /login
3) ? struts.convention.action.packages:Convention 插件以該常量指定包作為根包來搜索 Action 類。 Convention 插件除了掃描 action,actions,struts,struts2 四個包的類以外,還會掃描該常量指定的一個或多個包, Convention 會試圖從中發(fā)現(xiàn) Action 類。
注意: struts.convention.package.locators 和 struts.convention.action.packages 兩個常量的作用比較微妙,開發(fā)者在利用這兩個常量時務必小心。
如:下面 Action 所在包被映射的命名空間如下:
com.fun.actions.LoginAction 映射到 ?? /
com.fun.actions.myoffice.CarInfoAction 映射到 /myoffice
com.fun.struts.myoffice.EntINfoAction 映射到 /myofiice
4. ?????? 映射 Action 的 name 時,遵循如下兩步規(guī)則 :
1) ? 如果該 Action 類名包含 Action 后綴,將該 Action 類名的 Action 后綴去掉。否則不做任何處理。
2) ? 將 Action 類名的駝峰寫法(每個單詞首字母大寫、其他字母小寫的寫法)轉成中畫線寫法(所有字母小寫,單詞與單詞之間以中畫線隔開)
如: LoginAction 映射的 Acion 的 name 屬性為 login , GetBooks 映射的 Action 的 name 的屬性為 get-books , AddEmployeeAction 映射的 Action 的 name 屬性為 add-employee
5. ?????? 默認情況下。 Convention 總會到 WEB 應用的 WEB-INF/content 路徑下定位物理資源 ,定位資源的約定是: actionRUL+resultCODE+suffix 。當某個邏輯視圖找不到對應的試圖資源時, Convention 會自動視圖使用 ActionURL+suffix 作為物理視圖資源。
???? ?? 如: actions.fore.LoginAction 返回 success 字符串時, Convention 優(yōu)先考慮使用 WEB-INF/content/fore 目錄下的 login-success.jsp 作為視圖資源。如果找不到該文件, login.jsp 也可作為對應的試圖資源。如果返回 input 字符串, Convention 會將 WEB-INF/content/fore 里面查找 login-input.jsp
6. ?????? 為了看到 struts2 應用里的 Action 等各種資源的影射情況, struts2 提供了 Config Browser 插件。 使用方法,將 struts2-config-browser-plugin-2.1.6.jar 文件復制到 struts2 應用的 WEB-INF\lib 目錄中。
打開首頁地址: http://localhost:8080/ 應用名字 /config-browser/actionNames.action 這里可以看到 Config Browser 插件的首頁。
注意:這里不管開發(fā)者是否使用 struts.xml 文件進行配置,一樣可以看到 struts 的配置信息。
7.Action 鏈的約定
如果希望一個 Action 處理結束后不是進入一個試圖頁面,而是進行另一個 Action 形成的 Action 鏈。通過 Convention 插件則只需遵守如下三個約定即可。
1) ? 第一個 Action 返回的邏輯視圖字符串沒有對應的視圖資源
2) ? 第二個 Action 與第一個 Action 處在同一個包下
3) ? 第二個 Action 影射的 URL 為: firstActionURL+resultCODE
如,第一個 Action 為 OneAction ,里面有個方法返回為“ two ” , 那么就得保證, WEB-INF/content/ 下沒有 one.jsp 或 one-two.jsp 對于第二個 action 它的名字應該是 OneTwoAction ,而對應的 url 應該是:“ one-two.action ”
注意:由于 Convention 插件根據(jù) Action 和 jsp 頁面來動態(tài)生成映射的,因此不管是 Acion 的改變,還是 JSP 頁面的改變都需要 Convention 插件重新加載映射。那么只要我們?yōu)?/span> struts2 應用配置如下兩個常量就可以了。
<!-- 配置 struts2 應用于開發(fā)模式 -- ! >
<constant name=”struts.devMode” value=”true”/>
<!— 配置 Convention 插件自動重加載映射 -- ! >
<constant name=”struts.convention.classes.reload” value=”true”/>
幾個重要的常量
struts.convention.action.disableJarScanning--- 是否從包中搜索 Action
struts.convention.action.package--------Convention 插件以該常量指定包作為根包
struts.convention.result.path --- 設置 Convention 插件定位視圖資源的根路徑。默認值為 /WEB-INF/content
struts.convention.result.flatLayout— 如果是為 false 則可以將試圖放置 Action 對應的目錄下,無需放入 WEB-INF/content
7. ?????? Convention 的 Annotation
1) ? 與 Action 相關的兩個 Annotation 是 @Action 和 @Actions
2) ? @Action 中可指定一個 value 屬性。類似于指定 <action name=””/> 屬性值
3) ? @Action 中還可以指定一個 params 屬性,該屬性是一個字符串數(shù)組,用于該 Acion 指定的參數(shù)名和參數(shù)值。 params 屬性應遵守如下格式: {“name1”,”value1”,”name2”,”value2”}
4) ? @Actions 也用于修飾 Action 類里的方法,用于將該方法映射到多個 URL.@Actions 用于組織多個 @Action. 因此它可將一個方法映射成多個邏輯 Action 。
如:
package com.fun.actions;
?
?
?
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
?
import com.fun.service.LoginService;
import com.opensymphony.xwork2.ActionSupport;
?
public class LoginAction extends ActionSupport {
??? private String str ;
??? @Actions ({
?????? @Action (value= "login1" ,params={ "str" , " 這是已經(jīng)注入的了! " }),
?????? @Action (value= "login2" )
??????
??? })
??? public String login(){
?????? return "str" ;
??? }
??? @Action (value= "ggg" )
??? public String abc(){
?????? return "abc" ;
??? }
??? public String getStr() {
?????? return str ;
??? }
??? public void setStr(String str) {
?????? this . str = str;
??? }
???
}
我們可以通過 /login1.action 訪問,而在訪問時, str 這個屬性已經(jīng)有值,為 str=” 這是已經(jīng)注入的! ” 返回的視圖是 login1-str.jsp
當我們用 /login2.action 訪問時, str 的值為 null 。返回的視圖為 login2-str.jsp
而我們通過 /ggg.action 調用的是 abc ()方法,返回的視圖為 /ggg-abc.jsp
8. ?????? 與 Result 配置相關的 Annotation
1 ) @ResultPath @Result 和 Results
2 ) @Results 用于組織多個 @Result 因此它只需指定一個 value 屬性值,該 value 屬性值為多個 @Result
3 ) @Result 相當于 struts.xml 文件中的 <result/> 元素的做喲歐諾個。使用 @Result 必須指定一個 name 屬性,相當于 <result name=””/> 另外,它還有幾個可選的屬性。
??? ? ☆ type 相當于 <result type=””/> 指定返回視圖資源的類型
???? ☆ location 相當于 <result>…..</result> 中間部分,用于指定實際視圖位置
???? ☆ params :該屬性相當于 <result/> 元素里多個 <param../> 子元素的作用,用于為該 Result 指定參數(shù)值。該屬性應滿足 {“name1”,”value1”,”name2”,”value2”} 格式
4)@Result 有以下兩種用法
1 Action 級的 Result 映射:以 @Actions 組合多個 @Action 后修飾的 Action 類。這種 Result 映射對該 Action 里的所有方法都有效。
2 方法級 Result 映射:將多個 @Result 組成數(shù)組后作為 @Action 的 results 屬性值。這種 Result 映射僅對被修飾的方法有效。
5 ) @ResultPath 則用于修飾包和 Action 類,用于改變被修飾 Action 所對應的物理視圖資源的根路徑。舉例說:默認情況下, Convention 都會到 WEB-INF/content 路徑下找物理視圖資源,一旦我們使用 @ResultPath(“/abc”) 修飾該 Action ,系統(tǒng)將回到 abc 目錄下尋找物理視圖資源。舉例:在默認情況下, Convention 都會到 WEB-INF/content 路徑下需找物理視圖資源,一旦我們使用 @ResultPath(“/abc”) 修飾該 Action ,系統(tǒng)會到 abc 目錄下尋找物理視圖資源。
?
9 與包和命名空間相關的 Annotation :
?? @Namespace :修飾 Action 類或其所在的包。該 Annotation 中指定一個 value 屬性值,用于指定被修飾的 Action 所在的命名空間
? @Namespaces :修飾 Action 類或其所在的包,用于組合多個 @Namespace
? @ParentPackage: 用于指定被修飾的 Action 所在包的夫包。
10 異常處理相關的 Annotation
? @ExceptionMappings 用于組織多個 @ExceptionMapping ,因此它只需指定一個 value 屬性值,該 value 屬性值為多個 @ExceptionMapping 。
?@ExceptionMapping 用于定義異常類和物理視圖之間的對應關系,也相當于 struts.xml 文件里 <exception-mapping../> 元素的作用 使用時,必須注意以下兩個屬性:
? exception: 用于指定異常類
? result : 用于指定邏輯視圖
@ExceptionMpping 有如下兩種用法
?? Action 級的異常定義 : 以 @ExceptionMappings 組合多個 @ExceptionMapping 后修飾的 Action 類。這種異常定義對 Action 中的所有方法有效
? 方法級的異常定義: 將多個 @ExceptionMapping 組成數(shù)組后作為 @Action 的 exceptionMappings 屬性值,這種異常定義僅對被修飾的方法有效。
?
11. 攔截器配置相關的 Annotation
? 與攔截器配置的 Annotation 有 @InterceptorRef 、 @InterceptorRefs 和 @DefaultInterceptorRef
@InterceptorRefs 用于組織多個 @InterceptorRef ,因此它只需要指定一個 value 屬性值,該 value 屬性值為多個 @InterceptorRef
@InterceptorRef
用于為指定
Action
引用
lanjieq
或者是攔截器棧。也就相當于
strut.xml
中位于
<action../>
元素內部的
<interceptor-ref../>
子元素的作用。使用
@InterceptorRefAnnotation
時,必須制定一個
value
屬性,用于指定所引用的攔截器或攔截器棧的名字。相當于
<interceptor-ref../>
子元素里
name
屬性的作用。
轉自: http://blog.csdn.net/Beacher_Ma/archive/2009/10/27/4733227.aspx
posted on 2010-11-23 21:02 duansky 閱讀(640) 評論(0) 編輯 收藏 所屬分類: Java