收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


struts2的笔记
状态: 离线
人气:610050
访问用户量:854
笔记经验:
总积分:567
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(5)
ta的所有交流贴(5)
ta的全部笔记
全部笔记(89)
未分类笔记(3)
研磨struts2(86)
存档
2012-04(85)
2012-03(4)

2012-04-26 09:58:07
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
浏览(7988)|评论(0)   交流分类:Java|笔记分类: 研磨struts2

21.3  通过注解来实现零配置

21.3.1  概述

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

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

21.3.2  HelloWorld

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

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

 

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

上面示例中的注解“@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代码:
public class HelloWorldAction extends ActionSupport{
    @Action(value="/annoAction",
           params={"str","param1","str2","param2"},
           results={                   
             @Result(name="success",location="/anno/success.jsp"),           @Result(name="another",location="/anno/another.jsp")
           },         interceptorRefs={@InterceptorRef("timer"),@InterceptorRef("defaultStack")},
           exceptionMappings={                         @ExceptionMapping(exception="java.lang.NullPointerException",
    result="nullError"),            @ExceptionMapping(exception="java.lang.Exception",result="error")
           }
    )
    public String method1() throws Exception {
       System.out.println("now is HelloWorld=="+str+" , str2="+str2);
       return this.SUCCESS;
    }
    private String str,str2;
    public String getStr() {
       return str;
    }
    public void setStr(String str) {
       this.str = str;
    }
    public String getStr2() {
       return str2;
    }
    public void setStr2(String str2) {
       this.str2 = str2;
    }
}



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

 

java代码:
   <action name="annoAction" class="……">
			<param name="str">param1</param>
			<param name="str2">param2</param>
        	<interceptor-ref name="timer"/>
        	<interceptor-ref name="defaultStack"/>
        	<exception-mapping result="nullError"
 				exception="java.lang.NullPointerException"/>
        	<exception-mapping result="error" exception="java.lang.Exception"/>
        	<result name="success">/anno/success.jsp</result>
        	<result name="another">/anno/another.jsp</result>
   </action>

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

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

 

java代码:
public class HelloWorldAction extends ActionSupport{
	@Actions({
		@Action(value="/annoAction"),
		@Action(value="/t1")	
	})
	public String method1() throws Exception {
		System.out.println("now is HelloWorld");
		return this.SUCCESS;
	}
}

这样的注解,表明使用如下的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代码:
@Result(name="success",location="/anno/success.jsp")
public class AnnotationAction extends ActionSupport{
…
}

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


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

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

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

 

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

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

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

 

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

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

21.3.5  @Namespace

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

 

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

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

 

java代码:
<package namespace="/helloworld">
<action …>
</action>

21.3.6  @InterceptorRef@InterceptorRefs

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

 

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

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

 

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

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

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

21.3.7  @ExceptionMapping@ExceptionMappings

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

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

 

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

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

 

java代码:
        <action …>
        	<exception-mapping result="error" exception="java.lang.Exception"/>
        </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获取更多内容

相关笔记推荐
精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

struts2结合jFreeChat视频教程
深入浅出的讲解Struts2结合JFreechart来展示图表的功能

struts2防重复提交视频教程
深入浅出的讲解在Struts2开发中,如何防止页面的重复提交

struts2验证器框架视频教程
深入浅出的讲解Struts2的验证器框架,包括:预定义验证器和自定义开发验证器

浏览(7988)|评论(0)   交流分类:Java|笔记分类: 研磨struts2

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网