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