从
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