一、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。
通过@Action注释
对如下例子:
- package com.example.web;
- import com.opensymphony.xwork2.Action;
- import com.opensymphony.xwork2.ActionSupport;
- public class HelloAction extends ActionSupport{
- @Action ( "action1" )
- public Stringmethod1(){
- return SUCCESS;
- }
- @Action ( "/user/action2" )
- public Stringmethod2(){
- return SUCCESS;
- }
- }
方法名 | 默认调用路径 | 默认映射路径 |
method1 | /hello!method1.action . | /WEB-INF/content/hello.jsp |
method2 | /hello!method2.action. | /WEB-INF/content/hello.jsp |
通过@Action注释后
方法名 | @Action注释后调用路径 | @Action注释后映射路径 |
method1 | /action1!method1.action. 或简写 /action1 | /WEB-INF/content/action1.jsp |
method1 | /user/action2!method2.action或 /user/action2 | /WEB-INF/content/user/action2.jsp |
注:
@Action(
"/user"
)则是
/user,对应的映射路径是
/WEB-INF/content/action3.jsp,
该注释覆盖了默认的namespace(“/”)
通过@Actions注释
- package com.example.web;
- import com.opensymphony.xwork2.ActionSupport;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Actions;
- public class HelloAction extends ActionSupport{
- @Actions ({
- @Action ( "/different/url" ),
- @Action ( "/another/url" )
- })
- public Stringmethod1(){
- return “error”;
- }
我们可以通过:
/different/url!method1.action(
/different/url
)
或
/another/url!method1.action
来调用
method1
方法。
对应的映射路径分别是
/WEB-INF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsp
可能误导了大家,一个方法被@Action注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:
- package com.example.web;
- import com.opensymphony.xwork2.ActionSupport;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Actions;
- public class HelloAction extends ActionSupport{
- @Action ( "/another/url" )
- public Stringmethod1(){
- return “error”;
- }
我们调用method1方法可以通过两种方式:
1
/hello!method1.action
映射
url:
/WEB-INF/content/hello-error.jsp
2
/another/url!method1.action
映射
url:
/WEB-INF/content/another/url-error.jsp
可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。
通过@Namespace 注释
- package com.example.web;
- import com.opensymphony.xwork2.ActionSupport;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Actions;
- @Namespace ( "/other" )
- public class HelloWorld extends ActionSupport{
- public Stringmethod1(){
- return “error”;
- }
- @Action ( "url" )
- public Stringmethod2(){
- return “error”;
- }
- @Action ( "/different/url" )
- public Stringmethod3(){
- return “error”;
-
}
- }
通过
/other/hello-world!method1.action
访问
method1
方法。
通过
/other/url!method2.action
访问
method2
方法
映射
url:
/WEB-INF/content/
/other/
url/
hello-error.jsp
通过
/different /url!method3.action
访问
method3
方法
与@Action 注释不同的是,该注释覆盖了默认的namespace(这里是’/’),此时再用
hello!method1.action
已经不能访问
method1
了.
@Results和@Result
1 全局的(global)。
全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。
- package com.example.actions;
- import com.opensymphony.xwork2.ActionSupport;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Actions;
- import org.apache.struts2.convention.annotation.Result;
- import org.apache.struts2.convention.annotation.Results;
- @Results ({
- @Result (name= "failure" ,location= "/WEB-INF/fail.jsp" )
- })
- public class HelloWorld extends ActionSupport{
- public Stringmethod1(){
- return “failure”;
- }
- @Action ( "/different/url" )
- public Stringmethod2(){
- return “failure”;
- }
- }
当我们访问
/hello
-world
!method1.action
时,返回
/WEB-INF/fail.jsp
当我们访问
/hello
-world
!method2.action
时,返回
/WEB-INF/fail.jsp
当我们访问
/different/url!method2.action
时,返回
/WEB-INF/fail.jsp
2 本地的(local)。
本地results只能在action方法上进行声明。
- package com.example.actions;
- import com.opensymphony.xwork2.ActionSupport;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Actions;
- import org.apache.struts2.convention.annotation.Result;
- import org.apache.struts2.convention.annotation.Results;
- public class HelloWorld extends ActionSupport{
- @Action (value= "/other/bar" ,results={ @Result (name= "error" ,location= "www.baidu.com" ,type= "redirect" )})
- public Stringmethod1(){
- return “error”;
- }
- }
当我们调用
/hello
-world
!method1.action
时,返回
/WEB-INF/content/hello-error.jsp
当我们调用
/other/bar!method1.action
时,返回
www.baidu.com