從
struts2.1
開始,
struts2
不再推薦使用
Codebehind
作為零配置插件,而是改為使用
Convention
插件來支持零配置,和
Codebehind
相比,
Convention
插件更徹底,該插件完全拋棄配置信息,不僅不需要是使用
struts.xml
文件進行配置,甚至不需要使用
Annotation
進行配置,而是由
struts2
根據約定自動配置。
如何使用
Convention
1.
??????
將
struts-Convention-plugin-2.1.6.jar
文件復制到
WEB-INF/lib
路徑下
2.
??????
對于
Convention
插件而言,它會自動搜索位于
action
,
actions
,
struts
,
struts2
包下的所有
java
類,
Convention
插件會把如下兩種
java
類當成
Action
處理:
1)
?
所有實現了
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
會試圖從中發現
Action
類。
注意:
struts.convention.package.locators
和
struts.convention.action.packages
兩個常量的作用比較微妙,開發者在利用這兩個常量時務必小心。
如:下面
Action
所在包被映射的命名空間如下:
com.fun.actions.LoginAction
映射到
?? /
com.fun.actions.myoffice.CarInfoAction
映射到
/myoffice
com.fun.struts.myoffice.EntINfoAction
映射到
/myofiice
4.
??????
映射
Action
的
name
時,遵循如下兩步規則
:
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
優先考慮使用
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
插件的首頁。
注意:這里不管開發者是否使用
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
插件根據
Action
和
jsp
頁面來動態生成映射的,因此不管是
Acion
的改變,還是
JSP
頁面的改變都需要
Convention
插件重新加載映射。那么只要我們為
struts2
應用配置如下兩個常量就可以了。
<!--
配置
struts2
應用于開發模式
--
!
>
<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
屬性,該屬性是一個字符串數組,用于該
Acion
指定的參數名和參數值。
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"
,
"
這是已經注入的了!
"
}),
??????
@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
這個屬性已經有值,為
str=”
這是已經注入的!
”
返回的視圖是
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
指定參數值。該屬性應滿足
{“name1”,”value1”,”name2”,”value2”}
格式
4)@Result
有以下兩種用法
1 Action
級的
Result
映射:以
@Actions
組合多個
@Action
后修飾的
Action
類。這種
Result
映射對該
Action
里的所有方法都有效。
2
方法級
Result
映射:將多個
@Result
組成數組后作為
@Action
的
results
屬性值。這種
Result
映射僅對被修飾的方法有效。
5
)
@ResultPath
則用于修飾包和
Action
類,用于改變被修飾
Action
所對應的物理視圖資源的根路徑。舉例說:默認情況下,
Convention
都會到
WEB-INF/content
路徑下找物理視圖資源,一旦我們使用
@ResultPath(“/abc”)
修飾該
Action
,系統將回到
abc
目錄下尋找物理視圖資源。舉例:在默認情況下,
Convention
都會到
WEB-INF/content
路徑下需找物理視圖資源,一旦我們使用
@ResultPath(“/abc”)
修飾該
Action
,系統會到
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
組成數組后作為
@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