struts2-convention-plugin Annotation(零配置)

本文详细解析了Struts2框架中@Action和@Actions注解的使用方式,包括它们如何与方法交互,如何指定调用路径和映射路径,以及如何通过@Namespace注释覆盖默认命名空间。此外,还介绍了@Results和@Result注解在全局和本地作用域内的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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注释
对如下例子:

Java代码 收藏代码
  1. packagecom.example.web;
  2. importcom.opensymphony.xwork2.Action;
  3. importcom.opensymphony.xwork2.ActionSupport;
  4. publicclassHelloActionextendsActionSupport{
  5. @Action("action1")
  6. publicStringmethod1(){
  7. returnSUCCESS;
  8. }
  9. @Action("/user/action2")
  10. publicStringmethod2(){
  11. returnSUCCESS;
  12. }
  13. }
方法名默认调用路径默认映射路径
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注释

Java代码 收藏代码
  1. packagecom.example.web;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importorg.apache.struts2.convention.annotation.Action;
  4. importorg.apache.struts2.convention.annotation.Actions;
  5. publicclassHelloActionextendsActionSupport{
  6. @Actions({
  7. @Action("/different/url"),
  8. @Action("/another/url")
  9. })
  10. publicStringmethod1(){
  11. return“error”;
  12. }

我们可以通过:/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注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:

Java代码 收藏代码
  1. packagecom.example.web;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importorg.apache.struts2.convention.annotation.Action;
  4. importorg.apache.struts2.convention.annotation.Actions;
  5. publicclassHelloActionextendsActionSupport{
  6. @Action("/another/url")
  7. publicStringmethod1(){
  8. return“error”;
  9. }


我们调用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 注释

Java代码 收藏代码
  1. packagecom.example.web;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importorg.apache.struts2.convention.annotation.Action;
  4. importorg.apache.struts2.convention.annotation.Actions;
  5. @Namespace("/other")
  6. publicclassHelloWorldextendsActionSupport{
  7. publicStringmethod1(){
  8. return“error”;
  9. }
  10. @Action("url")
  11. publicStringmethod2(){
  12. return“error”;
  13. }
  14. @Action("/different/url")
  15. publicStringmethod3(){
  16. return“error”;
  17. }
  18. }

通过/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类上使用注解进行声明。

Java代码 收藏代码
  1. packagecom.example.actions;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importorg.apache.struts2.convention.annotation.Action;
  4. importorg.apache.struts2.convention.annotation.Actions;
  5. importorg.apache.struts2.convention.annotation.Result;
  6. importorg.apache.struts2.convention.annotation.Results;
  7. @Results({
  8. @Result(name="failure",location="/WEB-INF/fail.jsp")
  9. })
  10. publicclassHelloWorldextendsActionSupport{
  11. publicStringmethod1(){
  12. return“failure”;
  13. }
  14. @Action("/different/url")
  15. publicStringmethod2(){
  16. return“failure”;
  17. }
  18. }


当我们访问/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方法上进行声明。

Java代码 收藏代码
  1. packagecom.example.actions;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importorg.apache.struts2.convention.annotation.Action;
  4. importorg.apache.struts2.convention.annotation.Actions;
  5. importorg.apache.struts2.convention.annotation.Result;
  6. importorg.apache.struts2.convention.annotation.Results;
  7. publicclassHelloWorldextendsActionSupport{
  8. @Action(value="/other/bar",results={@Result(name="error",location="www.baidu.com",type="redirect")})
  9. publicStringmethod1(){
  10. return“error”;
  11. }
  12. }


当我们调用/hello-world!method1.action时,返回/WEB-INF/content/hello-error.jsp
当我们调用/other/bar!method1.action时,返回www.baidu.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值