Struts2 Convention Plugin(三)

Annotation 参考Convention使用某些注解语句来覆写插件默认的action到url的映射和自动搜索渲染到的页面。此外,你还可以修改action配置文件中定义的父XWORK的包信息

Action annotationConvention 插件可以使用Action注解语句来修改action返回的URL地址。本注解同时也允许包含在Actions语句中,用来使一个action对应于多个URL。在action 方法中使用本注解语句,可以参考以下代码:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.

6.publicclassHelloWorldextendsActionSupport{

7.@Action("/different/url")

8.publicStringexecute(){

9.returnSUCCESS;

10.}

11.}

现在我们action类中将使用 /different/url 来替代默认的 /hello-world,如果未指定@Result(参考下节),result的路径将会使用action的namespace,上面的例子中将会返回一下路径 "/WEB-INF/content/different/url.jsp"。

Action类中的单个方法可以使用Actions 注解来映射多个地址。

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.

7.publicclassHelloWorldextendsActionSupport{

8.@Actions({

9.@Action("/different/url"),

10.@Action("/another/url")

11.})

12.publicStringexecute(){

13.returnSUCCESS;

14.}

15.}

另外的 Action 或 Actions 的使用方法是,在单个action类中定义多个action方法,每个方法对应一个不同的地址。下面是多个action方法的范例:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.

7.publicclassHelloWorldextendsActionSupport{

8.@Action("/different/url")

9.publicStringexecute(){

10.returnSUCCESS;

11.}

12.

13.@Action("url")

14.publicStringdoSomething(){

15.returnSUCCESS;

16.}

17.}

前面的例子中,第二个URL地址是不推荐的,上面url将使用java 包名作为namespace,而不会直接使用Action注解的地址。Interceptor 和 interceptor stacks 同样可以使用interceptorRefs 注解来指定。下例演示了在action中同时添加"validation"和"defaultStack"拦截器。

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.

7.publicclassHelloWorldextendsActionSupport{

8.@Action(interceptorRefs={@InterceptorRef("validation"),@InterceptorRef("defaultStack")})

9.publicStringexecute(){

10.returnSUCCESS;

11.}

12.

13.@Action("url")

14.publicStringdoSomething(){

15.returnSUCCESS;

16.}

17.}

可以通过params属性来将参数传递给结果。属性的值是一个偶数个元素的String的数组,由形如{"key0", "value0, "key1", "value1" ... "keyN", "valueN"}所组成,举个例子:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.

7.publicclassHelloWorldextendsActionSupport{

8.@Action(interceptorRefs=@InterceptorRef(value="validation",params={"programmatic","false","declarative","true}))

9.publicStringexecute(){

10.returnSUCCESS;

11.}

12.

13.@Action("url")

14.publicStringdoSomething(){

15.returnSUCCESS;

16.}

17.}

如果未指定interceptors,将会使用默认的。

InterceptorRef annotationInterceptors 可以在方法级进行指定,使用Action 注解或在类上使用InterceptorRefs注解。Class级别的拦截会被应用到类包含的所有action上。可以参考下面例子:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.

7.@InterceptorRefs({

8.@InterceptorRef("interceptor-1"),

9.@InterceptorRef("defaultStack")

10.})

11.publicclassHelloWorldextendsActionSupport{

12.@Action(value="action1",interceptorRefs=@InterceptorRef("validation"))

13.publicStringexecute(){

14.returnSUCCESS;

15.}

16.

17.@Action(value="action2")

18.publicStringdoSomething(){

19.returnSUCCESS;

20.}

21.}

下面的拦截机将会应用到“action1”中:"interceptor-1","defaultStack"中的所有拦截机, "validation""defaultStack"中的所有拦截机也会对”action2”生效

Result annotationConvention 允许action类为每个action定义不同的results,results分为两类,全局的(global)和本地的(local),全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。本地results只能在action方法上进行声明。下面是两种results注解的例子:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.importorg.apache.struts2.convention.annotation.Result;

7.importorg.apache.struts2.convention.annotation.Results;

8.

9.@Results({

10.@Result(name="failure",location="fail.jsp")

11.})

12.publicclassHelloWorldextendsActionSupport{

13.@Action(value="/different/url",

14.results={@Result(name="success",location="http://struts.apache.org",type="redirect")}

15.)

16.publicStringexecute(){

17.returnSUCCESS;

18.}

19.

20.@Action("/another/url")

21.publicStringdoSomething(){

22.returnSUCCESS;

23.}

24.}

参数同样可以在results中通过params属性进行传递,和上面一样,由形如{"key0", "value0, "key1", "value1" ... "keyN", "valueN"}所组成。可参考下例:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Actions;

6.importorg.apache.struts2.convention.annotation.Result;

7.importorg.apache.struts2.convention.annotation.Results;

8.

9.publicclassHelloWorldextendsActionSupport{

10.@Action(value="/different/url",

11.results={@Result(name="success",type="httpheader",params={"status","500","errorMessage","InternalError"})}

12.)

13.publicStringexecute(){

14.returnSUCCESS;

15.}

16.

17.@Action("/another/url")

18.publicStringdoSomething(){

19.returnSUCCESS;

20.}

21.}

Namespace annotationnamespace注解允许action使用指定的路径替代默认的以package包名作为路径。本注解可以在action类或Java 包中的package-info.java类中进行设置。设置在action类中的namespace注解,对本action类中所有的action都有效,这是不完全合乎规范的action URL处理地址。设置在package-info.java中的namespace注解,将会改变本java包下所有的action的默认namespace。下面是此注解的例子:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.Namespace;

6.

7.@Namespace("/custom")

8.publicclassHelloWorldextendsActionSupport{

9.@Action("/different/url")

10.publicStringexecute(){

11.returnSUCCESS;

12.}

13.

14.@Action("url")

15.publicStringdoSomething(){

16.returnSUCCESS;

17.}

18.}

在上例中的action 会对2个不同的地址响应:/different/url  和 /custom/url下面是一个在package-info.java中使用namespace注解的例子:

 

1.@org.apache.struts2.convention.annotation.Namespace("/custom")

2.packagecom.example.actions;

@org.apache.struts2.convention.annotation.Namespace("/custom")

packagecom.example.actions;

这会改变com.example.actions包下所有action的默认namespace。请注意一点,本注解不会应用到子一级的包中。

ResultPath annotationResultPath 注解用来更改默认的results存储路径,注解可以放到action的类中,也可以放到package-info.java 文件夹中。参考下例:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.ResultPath;

6.

7.@ResultPath("/WEB-INF/jsps")

8.publicclassHelloWorldextendsActionSupport{

9.publicStringexecute(){

10.returnSUCCESS;

11.}

12.}

上面的result将以 WEB-INF/jsps 替换默认的 WEB-INF/content

ParentPackage annotationParentPackage注解用来定义具体action类的父XWork包或java包,下面例子演示了在action类上使用本注解:

 

1.packagecom.example.actions;

2.

3.importcom.opensymphony.xwork2.ActionSupport;

4.importorg.apache.struts2.convention.annotation.Action;

5.importorg.apache.struts2.convention.annotation.ParentPackage;

6.

7.@ParentPackage("customXWorkPackage")

8.publicclassHelloWorldextendsActionSupport{

9.publicStringexecute(){

10.returnSUCCESS;

11.}

12.}

ExceptionMapping AnnotationExceptionMapping 注解用来影射action抛出的异常。可以参考exception mapping documentation 获得详细信息。注解用类级别,在这种情况下,注解会应用到类里面的所有action

 

1.@ExceptionMappings({

2.@ExceptionMapping(exception="java.lang.NullPointerException",result="success",params={"param1","val1"})

3.})

4.publicclassExceptionsActionLevelAction{

5.

6.publicStringexecute()throwsException{

7.returnnull;

8.}

9.}

可以在ExceptionMapping注解中使用params 属性来传递具体值给结果渲染页。ExceptionMapping注解同样可以在action级别进行设置:

 

1.publicclassExceptionsMethodLevelAction{

2.@Action(value="exception1",exceptionMappings={

3.@ExceptionMapping(exception="java.lang.NullPointerException",result="success",params={"param1","val1"})

4.})

5.publicStringrun1()throwsException{

6.returnnull;

7.}

8.}

Actions in jar files默认情况下,Convention 插件不会从jar文件中寻找action。如果想实现这一功能,jar文件必须被struts.convention.action.includeJars 所定义的正则 匹配到。在例子中 myjar1.jar和 myjar2.jar 将被插件检测到:

 

1.<constantname="struts.convention.action.includeJars"value=".*/myjar1.*?jar(!/)?,.*/myjar2*?jar(!/)?"/>

<constantname="struts.convention.action.includeJars"value=".*/myjar1.*?jar(!/)?,.*/myjar2*?jar(!/)?"/>

提示:正则表达式只针对jar文件的路径进行匹配,而不是文件名。jar的URL应该包含jar文件的路径并以"!/"结尾。

Automatic configuration reloadingConvention插件可以自动重新加载配置的功能,无需重启容器,就可以刷新类中包含的action。这自动加载automatic xml 配置文件类似。你必须在struts.xml 中添加以下代码来启用本功能:

 

1.<constantname="struts.devMode"value="true"/>

2.<constant name="struts.convention.classes.reload" value="true" />

此功能没有在所有容器中进行过测试,强力建议不要在生产环境中使用。

相关推荐