Struts2常用的几个注解

简介:

开始Struts2最常用的几个注解的学习吧。

@Action


  • 使用@Action注解改变Convention plug约定的action与url之间的映射关系。

废话少说代码说事儿。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package  com.ponpon.actions;  
  
import  org.apache.struts2.convention.annotation.Action;  
   
import  com.opensymphony.xwork2.ActionSupport;  
   
public  class  myAction  extends  ActionSupport {  
   
   
     @Action ( "/v1/url" )  
     public  String execute() {  
   
         return  SUCCESS;  
     }  
}

本例***赟tring execute()方法上使用了@Action("/v1/url"),它改变了Action 与Action URL之间的映射关系,而这种改变并不是“OverWrite”而是在原来约定的基础上增加了另外一种调用方式。


原本在没有@Action("/v1/url")注解的情况下,我们可以在浏览器中输入:http://应用服务器ip:端口/应用/myaction,即可访问到com.ponpon.actions.myAction,并最终显示http://应用服务器ip:端口/应用/myaction.jsp页面。(当然这里也可能是html等页面)。

在@Action("/v1/url")注解的情况下,除了上述的访问方式外,我们还可以在浏览器中输入:http://应用服务器ip:端口/应用

/v1/url,也可访问到com.ponpon.actions.myaction,但最终显示http://应用服务器ip:端口/应用/v1/url.jsp页面。

  • 使用@Action注解解决一个ACTION中的一个方法,响应多个不同的URL.

实际项目开发过程中有很大的几率碰到Action的处理相同,但是最终跳转的页面不同的情况。将@Actions和@Action组合起来用即可解决这样的需求。

还是先上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package  com.ponpon.actions;  
   
import  org.apache.struts2.convention.annotation.Action;  
import  org.apache.struts2.convention.annotation.Actions;  
   
import  com.opensymphony.xwork2.ActionSupport;  
   
public  class  myaction1  extends  ActionSupport {  
   
     private  String message;  
   
     public  String getMessage() {  
         return  message;  
     }  
   
     @Actions ( {  @Action ( "/one/url" ),  @Action ( "/another/url" ) })  
     public  String execute() {  
         message =  "myaction1 execute()" ;  
         return  SUCCESS;  
     }  
}


本例***赟tring execute()方法上使用了@Actions和@Action注解。其中@Actions注解包含@Action("/one/url")和@Action("/another/url")注解。这样的注解除了可以通过http://应用服务器ip:端口/应用/myaction1访问com.ponpon.actions.myaction1,并最终显示http://应用服务器ip:端口/应用/myaction.jsp之外,还有两种访问方式:


即:

通过http://应用服务器ip:端口/应用/one/url,访问com.ponpon.actions.myaction1,并最终显示http://应用服务器ip:端口/应用/one/url.jsp

通过http://应用服务器ip:端口/应用/another/url,访问com.ponpon.actions.myaction1,并最终显示http://应用服务器ip:端口/应用/another/url.jsp
这样就达到了一个ACTION中的一个方法,响应多个不同的URL的效果。



  • 使用@Action注解解决一个ACTION中的多个方法,其中每个方法响应不同的URL.

这是实际项目开发过程中最常用的。
再上一个代码示例:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package  com.ponpon.actions;  
   
import  org.apache.struts2.convention.annotation.Action;  
   
import  com.opensymphony.xwork2.ActionSupport;  
   
public  class  myaction2  extends  ActionSupport {  
   
     private  String message;  
   
     public  String getMessage() {  
         return  message;  
     }  
   
     @Action ( "/v1/url" )  
     public  String execute() {  
         message =  "myaction2 execute()!" ;  
         return  SUCCESS;  
   
     }  
   
     @Action ( "url" )  
     public  String doSomething() {  
         message =  "myaction2 doSomething()!" ;  
         return  SUCCESS;  
     }  
}



本例***赟tring execute()方法上使用了@Action("v1/url")注解。在StringdoSomething()方法中使用了@Action("url")。前者可以通过http://应用服务器ip:端口/应用/v1/url访问com.ponpon.actions.mycation2中的execute()方法,并最终显示http://应用服务器ip:端口/应用/v1/url.jsp。后者是通过http://应用服务器ip:端口/应用/url来访问com.ponpon.actions.myaction2中的doSomething()方法,并最终显示http://应用服务器ip:端口/应用/url.jsp


这个例子里面需要注意的是@Action("/v1/url")和@Action("url")的不同,在“url”前并没有“/”这意味着"url"是基于myaction2的命名空间的。假设myaction2所在的包是com.ponpon.actions.aaa,那么,只有通过http://应用服务器ip:端口/应用/aaa/url才可以访问到com.ponpon.actions.aaa.myaction2,并最终显示http://应用服务器ip:端口/应用/aaa/url.jsp而“/v1/url”是基于“/”命名空间的。


在上文中,对于结果页面采用Convention Plugin的约定,但是这一节需要利用@Results和@Result改变一下这种约定。以及@Results和@Result对类和方法进行注解后所产生的效果。
还是先看一段代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package  com.ponpon.actions;  
   
import  org.apache.struts2.convention.annotation.Action;  
import  org.apache.struts2.convention.annotation.Result;  
import  org.apache.struts2.convention.annotation.Results;  
   
import  com.opensymphony.xwork2.ActionSupport;  
   
@Results ( {  @Result (name =  "global" , location =  "/global.jsp" ) })  
public  class  myaction3  extends  ActionSupport {  
   
     @Action (value =  "/v1/url" , results = {  @Result (name = SUCCESS, location =  "/v1/success.jsp" ),  
             @Result (name =  "failure" , location =  "/v1/fail.jsp" ) })  
     public  String execute() {  
         if  (System.currentTimeMillis() %  3  ==  0 ) {  
             return  "failure" ;  
         else  if  (System.currentTimeMillis() %  3  ==  1 ) {  
             return  SUCCESS;  
         else  {  
             return  "global" ;  
         }  
     }  
   
     @Action ( "globalTest" )  
     public  String global() {  
         return  "global" ;  
     }  
   
     @Action (value =  "globalOverWrite" , results = {  @Result (name =  "global" , location =  "/v1/globalOverWrite.jsp" ) })  
     public  String globalOverWrite() {  
         return  "global" ;  
     }  
   
}
  • 使用@Result注解改变Convention Plugin的约定跳转页面。

在代码的String execute()方法上进行了    @Action(value = "/v1/url", results = { @Result(name = SUCCESS, location = "/H5/success.jsp"),
            @Result(name = "failure", location = "/H5/fail.jsp") })注解。如果@Action(...)没有results = { @Result(name = SUCCESS, location = "/v1/success.jsp"),
            @Result(name = "failure", location = "/H5/fail.jsp") }
,那么依据Convention Plugin的约定,结果页面会是/v1/url.jsp。加上红色字体的部分后,execute()方法执行后,会根据红色字体的配置,将结果跳转到对应的页面。

  • 对Action类添加@Result注解,@Result将被Action类中的所有方法所共享。

仔细观察上述代码,在HelloWorld5上进行了@Results( { @Result(name = "global", location = "/global.jsp") })注解。这意味着该类及其子类的所有方法都可以返回一个名字为“global”的结果页面。而这个页面是"/global.jsp"。这就使得不用在每个需要跳转到"/global.jsp"的方法都进行@Result(name = "global", location = "/global.jsp")注解。这在实际工作中也是非常常见的一种情况。可以仔细观察的execute()方法和global()方法。他们都可能跳转到名字为“global”的结果页面(即location属***定义的“/global.jsp”页面)。

  • 对Action类中的方法添加@Result注解,@Result将只作用于被添加的方法。Action类方法上添加的@Result优先级高于Action类上添加的@Result。(前者覆盖后者)

再仔细观察上述代码的globalOverWrite()方法,该方法也跳转到名字为“global”的页面。但是在该方法上使用了@Action(value = "globalOverWrite", results = { @Result(name = "global", location = "/v1/globalOverWrite.jsp") })注解。并且其中@Result(...)注解中也有一个名字为“global”的结果页面定义。此时,该方法的结果页面就会跳转到/H5/globalOverWrite.jsp页面而不是在类上进行注解时候的“/global.jsp”页面。










本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1424355,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
自然语言处理 数据管理 数据库
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发
DMS MCP+通义灵码的梦幻组合,标志着研发流程从“工具堆砌”向“智能闭环”的跃迁。通过统一数据管理、自然语言交互与自动化代码生成,开发者可专注于业务创新,而无需被琐碎的数据库操作所束缚。
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发
|
4月前
|
缓存 网络协议
(问题日志)解决因代理设置导致的npm包ECONNREFUSED下载错误
在AIoT-IDE中使用`npm i`安装依赖时,若出现长时间无响应及ECONNREFUSED错误,可能是网络配置或代理冲突导致。通过指定镜像源与日志排查,确认为旧代理配置遗留问题。解决步骤包括:验证镜像源可用性、清除npm缓存、检查并更新代理配置。最终重新设置正确代理端口后,依赖安装恢复正常。
132 2
|
机器学习/深度学习 存储 算法
Python 机器学习算法交易实用指南(一)(2)
Python 机器学习算法交易实用指南(一)
372 2
|
Java
JDK1.8的安装及环境变量的配置(超详细)2
JDK1.8的安装及环境变量的配置(超详细)2
208 0
|
JSON Rust API
【Rust 实战】抖音短视频解析工具
【Rust 实战】抖音短视频解析工具
3037 0
【Rust 实战】抖音短视频解析工具
|
机器学习/深度学习 自然语言处理 搜索推荐
基于Windows环境下CPU和GPU版本Tensorflow详细安装过程
基于Windows环境下CPU和GPU版本Tensorflow详细安装过程
750 0
基于Windows环境下CPU和GPU版本Tensorflow详细安装过程
Idea: 集成本地三方软件-以Typora打开Markdown文件为例
Idea: 集成本地三方软件-以Typora打开Markdown文件为例
Idea: 集成本地三方软件-以Typora打开Markdown文件为例
|
SQL 关系型数据库 数据库连接
【笔记】错误码
本文档列出了PolarDB-X返回的常见错误码及解决方法。
927 0