http://wenku.baidu.com/view/b8b71725bcd126fff7050b3a.html
————————————————————————————————————————————————————————
Struts注解介绍
注解名称 |
备注 |
作用域 |
@Action |
指定一个action |
类,方法,actions注解中 |
@Actions |
给一个action指定多个名称 |
方法 |
@ParentPackage |
指定继承的包(struts2)名 |
包,类 |
@Namespace |
指定action所属的名称空间 |
包,类 |
@Namespaces |
指定一组action所属的名称空间 |
包,类 |
@Result |
定义一个result映射 |
类,Results注解中 |
@Results |
定义一组result映射 |
类,action注解中 |
@InterceptorRef |
一个拦截器 |
类,InterceptorRefs注解中 |
@InterceptorRefs |
一组拦截器集合 |
类,action注解中 |
下面是各注解的具体实现说明:
1.@ParentPackage 注解的参数:
参数 |
类型 |
是否必须 |
默认值 |
描述 |
value |
String |
是 |
无 |
指要继承的父包 |
2.@Namespace注解的参数如下表:
参数 |
类型 |
是否必须 |
默认值 |
描述 |
value |
String |
是 |
无 |
指action所属的名称空间 |
如:@Namespace(value=”/”)或@Namespace(“/list”)。
注意:如果没有给定Namespace选项,会默认为从定义的.package.locators标示开始到包结束的部分,就是hi命名空间,比如:
com.tepia.project.user.userAction的命名空间是:”/user”。
com.tepia.project.user.detail.UserAction的命名空间是:”/user/detail”。
3.@Namespaces用于声明一组命名空间,参数如下表所示:
参数 |
类型 |
是否必须 |
默认值 |
描述 |
value |
Namespace |
否 |
无 |
在里面定义一个Namespace的数组 |
如:
@Namespaces({
@Namespace(“/user”),
@Namespace(“/main”)
})
public class BookAction extends ActionSupport{……}
也就是可以通过发起:/user/book!add.action
/main/book!add.action
两个uri请求都能访问到Action中的方法。
4.@Result注解的参数如下表所示:
参数 |
类型 |
是否必须 |
默认值 |
描述 |
name |
String |
否 |
Action.SUCCESS |
指定result的逻辑名即代码结果 |
location |
String |
是 |
无 |
指定result对应的URL |
type |
String |
否 |
dispatcher |
指定result的类型 |
params |
String |
否 |
{} |
为result传递参数,格式为{key1,value1,key2,value2} |
对应的@Results和@Result可分为全局的与本地的
1.全局的(global)
@Result({
@Result(name=”failure”,location=”/WEB-INF/fail.jsp”)
})
public class HelloWorld extends ActionSupport{
Public String execute(){ return “failure”;}
}
2.本地的(local)
public class HelloWorld extends ActionSupport{
@Action(value=”/other/bar”,results=(
@Result{name=”error”,location=”www.baidu.com”,type=”redirect”)})
public String method1(){return “error”;}
}
5.@Results注解的参数如下表所示:
参数 |
类型 |
是否必须 |
默认值 |
描述 |
value |
Result[] |
是 |
无 |
为action定义一组result映射 |
如:
@Results({
@Result(name=”input”,value=”/input.jsp”),
@Result(name=”success”,value=”/success.jsp”)
})
//上例中定义了两个result映射,一个逻辑名是input,资源位置是/input.jsp;另一个逻辑名是success,资源位置是/success.jsp
public class HelloAction extends ActionSupport{
@Action(“action1”)
public String method1(){……}
@Action(“action2”)
public String method2(){……}
@Action(value=”/user/action3”,
results={
@Result(
name=”viewsuccess”,
location=”/view/showbooks.jsp”),
@Result(
name=”viewinput”,
location=”/view/showbooks.jsp”,
type=”redirectAction”)
},
interceptorRefs={@InterceptorRef(“my defaultStack)}
)
public String method3(){……}
}
//如果采用此种方式,可以使用如下方式访问
method1 /action1!method1.action
method2 /user/action2!method2.action
method3 /user/action3!method3.action
6.@Actions 注解可以为action类定义一组访问的action名称,主要有如下参数:
参数 |
类型 |
描述 |
value |
Action[] |
用于包含一组@Action注解 |
比如:
public class HelloAction extends ActionSupport{
@Actions({
@Action(“/different/url”),
@Action(“/another/url”)
})
public String method1(){……}
}
/different/url!method1.action或/another/url!method1.action来调用method1方法。
public class HelloAction extends ActionSupport {
@Action("/another/url")
public String method1() {...}
}
我们调用method1方法可以通过两种方式:
1 /hello!method1.action
2 /another/url!method1.action
可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。总之,一个方法被@Action或@Actions注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。
7.@InterceptorRef及@InterceptorRefs
可以使用@InterceptorRef来为一个action定义一个拦截器,注意此注解只是在此action上引用拦截器,此拦截器需要在struts.xml中进行定义。此注解可以加在类,InterceptorRefs等上面 。 @DefaultInterceptorRef可以合定义一个默认的拦截器.
参数 |
类型 |
描述 |
value |
String |
用于指定拦截器的名字 |
params |
String[] |
用于指定传递的参数 |
如:
@InterceptorRefs({
@InterceptorRef("mydefaultStack")
})
public class HelloWorld extends ActionSupport {
public String method2() { ...}
}
public class HelloWorld extends ActionSupport {
@Action(“url”,interceptorRefs={
@InterceptorRef{“mystack”},
@InterceptorRef(“logincheck”)
})
public String method2() { ...}
}
使用注解配置Action注意事项
在Struts2中使用注解配置action,有一些需要注意的地方。
- 与action配置相关的4个注解只能用于类级别
- 需要在web.xml文件中为FilterDispatcher过滤器设置actionPackages参数 指定使用注解配置的Action所在包的列表,多个包之间以逗号(,)分隔。这些包和它们的子包都将被扫描,定包中的所有实现了Action接口的类或是以”Action”结尾的类都将被检测。所以后者允许我们编写POJO Action类,而不需要实现Action接口。如果有多个包,则以逗 号(,)分隔。
即:
<filter-name>struts</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<!-- //固定格式-->
<param-name>actionPackages</param-name>
com.struts2.action1,com.struts.action2-->
<param-value>com.struts2.action</param-value>
</init-param>
</filter><!-- action所在的包,如果在多个包中,用逗号隔开- ->
- 包名,名称空间和action名的产生方式如下:
l Action类所在的包作为action包名
l 除了使用Namespace注解指定名称空间外,也可以通过子包名来产生名称空间。如:action所在的包为cn.com.test.action,如果 参数指定的包是cn.com.test,那么“/action”将作为名称空间的名字。
l 通过action的类名来产生action的名字。如类名以“Action”结尾,那么“Action”将被去掉,其余部分将首字母变小写作为action的名字。如:
RegisterAction 将将会产生的action的名字是register。
- 如果想让包继承struts-default包,无须使用ParentPackage注解。在框架内部,会自动让你的包继承struts-default包。
当@Namespace与@Action配合使用注意事项
如果在@Action注解中包括”/”字符地,则意味着该注释覆盖了默认的namespace(这里是’/’),此时访问action就有一些小的改动。如下例:
@Namespace("/other")
public class HelloWorld extends ActionSupport {
public String method1() {...}
@Action("url")
public String method2() { ...}
@Action("/different/url")
public String method3() {... }
}
通过 /other/hello-world!method1.action 访问method1 方法
通过 /other/url!method2.action 访问method2 方法
通过 /different /url!method3.action 访问method3 方法
与@Action 注释不同的是,该注释覆盖了默认的namespace(这里是’/’),此时再用hello!method1.action 已经不能访问method1 了。