《研磨struts2》之通过注解来实现零配置

问题描述

21.3通过注解来实现零配置21.3.1概述在实际开发中,光是简单的通过默认的方式来进行配置,是满足不了实际项目的需要的,这就需要使用注解,来进一步控制程序各个部分的对应关系。就其实质,就是把原本在struts.xml中的配置信息,通过使用注解来把这些信息搬移到Action类上进行配置。所以零配置并不是不配置,只是不在struts.xml里面配置而已。21.3.2HelloWorld接下来,通过一个示例来看看如何通过注解来实现零配置。修改刚才的HelloWorldAction类,不再实现execute方法,而是实现一个method1的方法,在这个方法上添加上一个最简单的Action注解,示例代码如下:java代码:查看复制到剪贴板打印publicclassHelloWorldActionextendsActionSupport{@Action("/t1")publicStringmethod1()throwsException{System.out.println("nowisHelloWorld");returnthis.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代码:查看复制到剪贴板打印publicclassHelloWorldActionextendsActionSupport{@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")})publicStringmethod1()throwsException{System.out.println("nowisHelloWorld=="+str+",str2="+str2);returnthis.SUCCESS;}privateStringstr,str2;publicStringgetStr(){returnstr;}publicvoidsetStr(Stringstr){this.str=str;}publicStringgetStr2(){returnstr2;}publicvoidsetStr2(Stringstr2){this.str2=str2;}}这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<actionname="annoAction"class="……"><paramname="str">param1</param><paramname="str2">param2</param><interceptor-refname="timer"/><interceptor-refname="defaultStack"/><exception-mappingresult="nullError"exception="java.lang.NullPointerException"/><exception-mappingresult="error"exception="java.lang.Exception"/><resultname="success">/anno/success.jsp</result><resultname="another">/anno/another.jsp</result></action>特别要注意params的定义:params={"str","param1","str2","param2"},它里面全部用的都是逗号,也就是第一个为参数的key,第二个就为相应的值,而第三个又为参数的key,第四个为相应的值,以此类推。另外参数的key一定要对应Action中的属性,因为这些参数在传递给Action的时候,需要有接收的地方。而@Actions是可以包含多个@Action的注解,示例如下:java代码:查看复制到剪贴板打印publicclassHelloWorldActionextendsActionSupport{@Actions({@Action(value="/annoAction"),@Action(value="/t1")})publicStringmethod1()throwsException{System.out.println("nowisHelloWorld");returnthis.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")publicclassAnnotationActionextendsActionSupport{…}这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<resultname=”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")})publicclassAnnotationActionextendsActionSupport{…}注意:上面的注解出现了一对花括号{},这是表示@Results注解中有两个@Result注解组成的数组,一定要注意。这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<resultname="success">/wait/success.jsp</result><resultname="another">/wait/another.jsp</result>另外要注意:@Result和@Results是用在类级上,不能直接用在方法上,相当于整个Action的全局的Result。当然可以把他们配置在方法级使用的@Action里面,当做局部的result配置。21.3.5@Namespace@Namespace注解用来这个Action类的包命名空间,只有value属性,用来指明包命名空间。java代码:查看复制到剪贴板打印@Namespace(“/helloworld")publicclassAnnotationActionextendsActionSupport{…}这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<packagenamespace="/helloworld"><action…></action>21.3.6@InterceptorRef和@InterceptorRefs@Interceptor注解用来为这个Action引用拦截器,只有一个value属性,用来指定拦截器或者是拦截器栈的名字。java代码:查看复制到剪贴板打印@InterceptorRef("defaultStack")publicclassAnnotationActionextendsActionSupport这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<action…><interceptor-refname="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")publicclassAnnotationActionextendsActionSupport这样的注解就相当于在struts.xml中注册:java代码:查看复制到剪贴板打印<action…><exception-mappingresult="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里面就可以了。私塾在线原创

解决方案

本帖最后由 u013213257 于 2013-12-19 13:43:58 编辑
解决方案二:
好久没用过了、、
解决方案三:
还是配置文件比较好
解决方案四:
感觉这种方式维护起来很困难。不知道是不是用得太少了。。

时间: 2024-11-03 21:26:58

《研磨struts2》之通过注解来实现零配置的相关文章

关于struts2零配置的问题

问题描述 今天突然发现struts2零配置的一个问题,就是比如我有个文件在WEB-INF/content/content.jsp 然后我可以通过输入localhost:8080/项目名/content可以直接访问到这个jsp页面,这样不是很不安全吗?有什么配置可以关掉这种直接访问WEB-INF下资源文件的方式? 解决方案 第一种方式是将所有的jsp页面都放入到web-inf目录下,然后在action的配置中将forward指向目录为/web-inf/jsp...这样就可以了.还有一种方式是在定义

Dwr3.0纯注解(纯Java Code配置)配置与应用浅析三之后端反向调用前端_java

在前两篇中我们已经介绍了Dwr零配置文化化和前端调用后端的方法,想必大家应该已经会熟练掌握了,下来我们主要探讨一下后端怎么反向调用前端的js方法: 就如前两篇说到了用Dwr注册了两个Service组件,一个是remote,另外一个是页面使用到的controller,这个remote是在页面一加载进来就会被调用的,这样就使得会话和页面ScriptSession建立了绑定的关系,方便我们后面使用它的scriptSessionId进行页面定向推送: 下面是建立会话和页面ScriptSession的方法

java-SSH中的strut2零配置怎么配置

问题描述 SSH中的strut2零配置怎么配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"&g

Spring Web工程web.xml零配置即使用Java Config + Annotation

摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式: 在开始之前,我们需要注意一下,要基于Java Config实现无web.xml的配置,我们的工程的Servlet必须是3.0及其以上的版本: 1.我们要实现无web.xml的配置,只需要关注实现WebApplicationInitializer这个

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

Win8系统中无线零配置服务开发方法教程

  现在我们的生活根本离不开无线网络,这已经成为我们生活的一部分,所以一旦电脑的无线网连不上,很多网络依赖患者就会暴跳如雷,完全影响我们正常的生活.有时候我们检查网卡的设置.路由器的开启情况,都想去解决不能上网的问题,其实我们忽略到一点,就是win8系统中有个无线零配置服务,是无线网络自动配置的服务,对于我们网络的正常运行很重要,如果我们平时没有开启的话,win8网络就无法使用,所以赶紧跟随小编来学习下win8如何启用无线零配置服务把! Win8启用无线零配置服务方法 第一步:我们需要进入系统服

零配置WZC服务在win8中启动方法

现在所有安装win8系统的笔记本电脑中都配备了无线网卡,无线网络让我们连接网线变的简单易操作,而很多用户在win8系统中连接无线的时候遇上零配置服务没有启动的问题,导致无线连接失败,零配置WZC服务是自动配置无线网络的一个重要服务,如果没有启动的话我们就不能正常的使用无线了,如何启动零配置WZC服务呢? 在win8系统中是这样操作的: 1.按WIN+R 打开运行界面,然后输入services.msc 确定; 2.这时会打开win8的本地服务列表,我们在列表中找到"Wireless Zero Co

傲天动联真正实现零配置操控,上电自动配置自动升级

近几年来,宽带网络快速发展,个人及家庭用户的需求成为市场主要热点,并且伴随终端的更新换代和不断推新在不断变化,直接导致各种新业务也层出不穷,各类运营商都必须大力发展基于家庭网络的业务,通过家庭网关将电信网络提供的各种业务和应用延伸到家庭范围内,这也成为运营商进行转型的重要契机. 国内外各类运营商也逐渐意识到家庭网络的市场需求,在研发的基础上成功地将电信网络功能和应用延伸到了家庭.使家庭网成为电信运营商寻求企业转型和业务突破的重要手段.例如法国电信力主通信.娱乐.生活业务并进的方针,推出基于家庭多

url-strtus2 注解action 访问URL 配置

问题描述 strtus2 注解action 访问URL 配置 问题: 用strtus注解的形式生成一个action @ParentPackage("struts-default") @Namespace("/welcome") @Results(value={ @Result(name="success",location="/pub/index.html"), @Result(name="fail",lo