`

《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置

 
阅读更多

21.3  通过注解来实现零配置

21.3.1  概述

在实际开发中,光是简单的通过默认的方式来进行配置,是满足不了实际项目的需要的,这就需要使用注解,来进一步控制程序各个部分的对应关系。

就其实质,就是把原本在struts.xml中的配置信息,通过使用注解来把这些信息搬移到Action类上进行配置。所以零配置并不是不配置,只是不在struts.xml里面配置而已。

21.3.2  HelloWorld

接下来,通过一个示例来看看如何通过注解来实现零配置。

修改刚才的HelloWorldAction类,不再实现execute方法,而是实现一个method1的方法,在这个方法上添加上一个最简单的Action注解,示例代码如下:

 

java代码:
  1. public class HelloWorldAction extends ActionSupport{  
  2.     @Action("/t1")  
  3.     public String method1() throws Exception {  
  4.         System.out.println("now is HelloWorld");  
  5.         return this.SUCCESS;  
  6.     }  
  7. }  

上面示例中的注解“@Action("/t1")”,表示访问Action的这个方法的映射就是t1,也就是说,通过URL:http://localhost:9080/helloworld/t1,就可以访问到HelloWorldAction中的method1方法,执行后返回success。然后到WEB-INF/content文件夹下,优先匹配t1-success.jsp,如果没有,匹配t1.jsp也可以。

       这就可以看得出来,注解的方式明显比完全依靠约定的方式要更灵活,让程序人员有更大的控制力,从而可以实现更复杂的功能。

所有可以引用的注解都在org.apache.struts2.convention.annotation这个包中。接下来,就来一一介绍最常用的几个。

21.3.3  @Action和@Actions

@Action注解可谓是集大成者,可以使用它为Action类指定引用名,也就是在URL中的映射名称,它同时还可以包含其他的注解。

@Action注解有以下属性:

  • value:指定URL中的映射名称。
  • params:指定需要注入到Action的参数。
  • results:指定结果。
  • interceptorRefs:指定拦截器引用。
  • excepitonMappings:声明错误处理。


java代码:
  1. public class HelloWorldAction extends ActionSupport{  
  2.     @Action(value="/annoAction",  
  3.            params={"str","param1","str2","param2"},  
  4.            results={                     
  5.              @Result(name="success",location="/anno/success.jsp"),           @Result(name="another",location="/anno/another.jsp")  
  6.            },         interceptorRefs={@InterceptorRef("timer"),@InterceptorRef("defaultStack")},  
  7.            exceptionMappings={                         @ExceptionMapping(exception="java.lang.NullPointerException",  
  8.     result="nullError"),            @ExceptionMapping(exception="java.lang.Exception",result="error")  
  9.            }  
  10.     )  
  11.     public String method1() throws Exception {  
  12.        System.out.println("now is HelloWorld=="+str+" , str2="+str2);  
  13.        return this.SUCCESS;  
  14.     }  
  15.     private String str,str2;  
  16.     public String getStr() {  
  17.        return str;  
  18.     }  
  19.     public void setStr(String str) {  
  20.        this.str = str;  
  21.     }  
  22.     public String getStr2() {  
  23.        return str2;  
  24.     }  
  25.     public void setStr2(String str2) {  
  26.        this.str2 = str2;  
  27.     }  
  28. }  



这样的注解就相当于在struts.xml中注册:

 

java代码:
  1. <action name="annoAction" class="……">  
  2. <param name="str">param1</param>  
  3. <param name="str2">param2</param>  
  4.         <interceptor-ref name="timer"/>  
  5.         <interceptor-ref name="defaultStack"/>  
  6.         <exception-mapping result="nullError"  
  7.         exception="java.lang.NullPointerException"/>  
  8.         <exception-mapping result="error" exception="java.lang.Exception"/>  
  9.         <result name="success">/anno/success.jsp</result>  
  10.         <result name="another">/anno/another.jsp</result>  
  11. </action>  

特别要注意params的定义:params={"str","param1","str2","param2"},它里面全部用的都是逗号,也就是第一个为参数的key,第二个就为相应的值,而第三个又为参数的key,第四个为相应的值,以此类推。另外参数的key一定要对应Action中的属性,因为这些参数在传递给Action的时候,需要有接收的地方。

而@Actions是可以包含多个@Action的注解,示例如下:

 

java代码:
  1. public class HelloWorldAction extends ActionSupport{  
  2.     @Actions({  
  3.         @Action(value="/annoAction"),  
  4.         @Action(value="/t1")      
  5.     })  
  6.     public String method1() throws Exception {  
  7.         System.out.println("now is HelloWorld");  
  8.         return this.SUCCESS;  
  9.     }  
  10. }  

这样的注解,表明使用如下的URL:“http://localhost:9080/helloworld/t1”或者“http://localhost:9080/helloworld/annoAction”,都能够访问到method1这个方法。

另外要注意:@Action和@Actions都是既可以用在类级,又可以用在方法级上,上面的示例就是在方法级上。

21.3.4  @Result@Results

@Result注解用于声明一个结果,有以下属性:

  • name:指定结果的名字,默认为success。
  • type:指定结果的类型,默认为在<result-types>中定义的默认类型。
  • location:指定结果的页面位置。
  • params:指定结果的可选参数。


java代码:
  1. @Result(name="success",location="/anno/success.jsp")  
  2. public class AnnotationAction extends ActionSupport{  
  3. …  
  4. }  

这样的注解就相当于在struts.xml中注册:


java代码:
  1. <result name =” success”>/ anno /success.jsp</result>  

@Results注解用来声明多个结果,它只有一个value属性,而这个value属性又需要一个@Result数组。

       Java注解规定在同一个语法单元上,同一种注解只能使用一个,因此,如果一个Action可能有多个后继页面的时候,决不能在同一个Action类上使用多个@Result,而是应该使用@Results包含了多个@Result。如:

 

java代码:
  1. @Results({  
  2.         @Result(name="success",location="/anno/success.jsp"),  
  3.         @Result(name="another",location="/anno/another.jsp")  
  4. })  
  5. public class AnnotationAction extends ActionSupport{  
  6. …  
  7. }  

注意:上面的注解出现了一对花括号{},这是表示@Results注解中有两个@Result注解组成的数组,一定要注意。

       这样的注解就相当于在struts.xml中注册:

 

java代码:
  1. <result name="success">/wait/success.jsp</result>  
  2. <result name="another">/wait/another.jsp</result>  

另外要注意:@Result和@Results是用在类级上,不能直接用在方法上,相当于整个Action的全局的Result。当然可以把他们配置在方法级使用的@Action里面,当做局部的result配置。

21.3.5  @Namespace

@Namespace注解用来这个Action类的包命名空间,只有value属性,用来指明包命名空间。

 

java代码:
  1. @Namespace (“/helloworld")  
  2. public class AnnotationAction extends ActionSupport{  
  3. …  
  4. }  

这样的注解就相当于在struts.xml中注册:

 

java代码:
  1. <package namespace="/helloworld">  
  2. <action …>  
  3. </action>  

21.3.6  @InterceptorRef@InterceptorRefs

@Interceptor注解用来为这个Action引用拦截器,只有一个value属性,用来指定拦截器或者是拦截器栈的名字。

 

java代码:
  1. @InterceptorRef("defaultStack")  
  2. public class AnnotationAction extends ActionSupport  

这样的注解就相当于在struts.xml中注册:

 

java代码:
  1. <action …>  
  2.     <interceptor-ref name="defaultStack"/>  
  3. </action>  

@InterceptorRefs注解用来声明多个拦截器引用,它只有一个value属性,而这个value属性又需要一个@InterceptorRef数组。

       注意:@InterceptorRefs和@InterceptorRef的关系与@Results和@Result的关系类似。一个类上也不能同时出现两个@IntercptorRef注解,因此,请读者对比@Results,请写出如何在一个Action上引用两个拦截器。

21.3.7  @ExceptionMapping@ExceptionMappings

@ExceptionMapping注解用来为这个Action声明错误处理,有以下属性:

  • exception:指定处理的例外。
  • result:指定捕获了指定例外之后跳转到哪个结果。
  • params:指定额外的参数。

 

java代码:
  1. @ExceptionMapping(exception="java.lang.Exception",result="error")  
  2. public class AnnotationAction extends ActionSupport  

这样的注解就相当于在struts.xml中注册:

 

java代码:
  1. <action …>  
  2.     <exception-mapping result="error" exception="java.lang.Exception"/>  
  3. </action>  

@ExceptionMappings注解用来声明多个错误处理,它只有一个value属性,而这个value属性又需要一个@ExceptionMapping数组。

       注意:@ExceptionMappings和@ExceptionMapping的关系与@Results和@Result的关系类似。一个类上也不能同时出现两个@ExceptionMapping注解。

21.3.8  @ParentPackage

@ParentPackage注解用来为Action指定父包,它只有一个value属性,用来指定父包的名字。

这听起来有些不可思议,父包都是在包上指定的啊,只有<package>元素才有parent属性来指定父包啊,Action上怎么也能指定呢?零配置的时候,所有的Action都是单独放置的,暂时还没有包这个概念,所以需要在每个Action上指定自己的父包,如果不指定的话默认为struts-default。

21.3.9  用注解来替代struts.xml

到这里,已经把使用注解实现零配置的细节都学完了,您是不是已经欢呼雀跃的说,“我已经会了,不就是用注解来替代struts.xml嘛!”。

但是请注意一点,到现在为止,注解还不能完全替代struts.xml。事实上用注解替代的不是struts.xml文件,而是替代struts.xml中的一些配置信息,主要的是struts.xml中<action>元素部分的配置。

除了<action>元素,struts.xml中还有很多东西,比如:指定全局结果<global-result>;声明一个拦截器<interceptor>等等,到现在为止,注解还做不到。

       因此,请大家注意:注解实现零配置不能完整的替代struts.xml,而是替代了其中Action部分的配置信息。那么,其他部分该怎么办呢?

很简单,让struts.xml和注解实现的零配置共存来解决这个问题。也就能用注解代替的部分写到Action类里面,其他的还是写到struts.xml里面就可以了。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4185.html

欢迎访问http://sishuok.com获取更多内容

7
10
分享到:
评论
5 楼 rongmiao 2013-01-16  
多谢博主分享。但在下一直有个疑问,不知博主能否赐教?在实际生产中,采用注解配置可行不?因为注解是写在类里面的,部署的时候代码已经编译好,想临时切换成另一种方式都不允许。同一个项目分发到不同的单位都需要修改action的配置,此种方式貌似不能实现
4 楼 wolfmaster 2012-11-24  
已经买了这本书。。不错。。
3 楼 cupfish 2012-07-16  
期待《研磨spring3》
2 楼 研磨struts2 2012-07-06  
BigBird2012 写道
楼主,首先感谢您的分享精神,您能否像上次一样,将您的博客做成pdf呢?

多谢关注 会的
1 楼 BigBird2012 2012-07-06  
楼主,首先感谢您的分享精神,您能否像上次一样,将您的博客做成pdf呢?

相关推荐

    研磨Struts2配书视频对应的演示源代码

    9. **表单验证**:Struts2提供了强大的表单验证功能,可以通过注解或XML配置实现。源代码中可能包含验证规则的定义和处理验证失败的示例。 10. **国际化(Internationalization, i18n)**:Struts2支持多语言环境,...

    研磨Struts2

    零配置意味着在某些情况下可以不编写struts.xml配置文件,而是通过注解或者其他方式来配置Action。 #### 15.2 零配置的实现 - **注解配置**:通过在Action类上添加注解来代替配置文件。 - **自动扫描**:Struts2...

    研磨struts2 高清版

    由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。

    《研磨Struts 2》PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于《研磨Struts 2》书籍PDF版本的下载资源。为了更好地理解和概括这份资料所涉及的知识点,我们先来了解一下Struts 2框架及其重要性,然后深入探讨《研磨Struts 2》这...

    研磨Struts2配书视频对应的PPT

    《研磨Struts2》这本书是专门针对Struts2框架的学习指南,通过深入浅出的方式讲解了Struts2的核心概念和技术。其配套的PPT和视频旨在帮助读者更直观地理解书中的理论知识,并将其付诸实践。 在研读《研磨Struts2》...

    研磨struts

    书中详细介绍了如何创建一个简单的Struts2应用,从Servlet+JSP+JavaBean实现MVC模式,然后逐步过渡到使用Struts2框架来简化这一过程。 5. **Struts2架构**:Struts2的系统架构包含ActionServlet、FilterDispatcher...

    研磨Struts2 高清完整版.part2

    研磨Struts2 高清完整版,请和第一部分一起下载啊

    研磨Struts2_12859679_高清完整版.part2.rar

    研磨Struts2_12859679_高清完整版

    研磨Struts2-高清-完整目录-2011年10月

    研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人

    研磨设计模式(完整带书签).part2.pdf

    第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...

    研磨设计模式-part2

    第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...

    研磨设计模式(完整带书签).part1.pdf

    第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...

    研磨设计模式.part2(共4个)

    第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 ...

    研磨设计模式.part2

    研磨设计模式.part2 一定要下载5部分

Global site tag (gtag.js) - Google Analytics