`
kzwang
  • 浏览: 6638 次
  • 性别: Icon_minigender_1
  • 来自: 乌鲁木齐
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于Annotation的Servlet配置

    博客分类:
  • Java
阅读更多

     传统的 JAVA 企业级应用开发中, Servlet 的配置一直是一件令开发人员头痛的事情。文章使用 Annotation 技术实现的 @Servlet 注解,可以让 Servlet 的配置不再繁杂,只需要简单的标注就可以实现 Servlet 的配置功能,能极大地简化开发人员的工作,也让配置文件更加干净简洁。

    JAVA EE 规范中规定,在使用 Servlet 开发应用系统时,需要在 web.xml 文件中为每一个 Servlet 配置相关信息。一个大型应用系统中, Servlet 的数量是很庞大的,如果要为每一个 Servlet 都配置上述信息,这无疑是开发人员的噩梦。现在主流的 MVC 框架(如 Struts WebWork ),它们在一定程度上解决了这样繁琐的配置,但这些框架本身就引入了大量的 XML 文件配置。 JDK1. 5 版本之后, JAVA 语言提供了一种叫做 Annotation(JSR250) 的新数据类型,中文译为注解或标注,它的出现为铺天盖地的 XML 配置文件提供了一个完美的解决方案,让 JAVA EE 开发更加方便快速,也更加干净了。

      @Servlet 注解的实现

       上面简要地介绍了注解的定义声明与使用方式,了解到了注解在后台需要一个处理器才能起作用。下面我们定义一个 @Servlet 注解,将 Servlet web.xml 中的配置信息使用注解来表示,使用注解后,只需要在相应 Servlet 类的前面使用类似 @Servlet(“/servlet/Login”) 注解就可以达到和上述 web.xml 文件中配置信息一样的目的。注解 @Servlet 中的属性值 ” /servlet/Login” 表示了 web.xml 配置文件中 <servlet-mapping> 元素的子元素 <url-pattern> 里的值。通过这样的注解能简化在 XML 文件中配置 Servlet 信息,整个配置文件将会非常简洁干净,开发人员的工作也将大大减少。

1 注解的定义

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Servlet { String value(); }


 

@Target 注解的属性值表明了 @Servlet 注解只能用于类或接口定义声明的前面, @Servlet 注解有一个必填的属性 value 。调用方式为: @Servlet(value=“/xxxx”) ,因语法规定如果属性名为 value 且只填 value 属性值时,可以省略 value 属性名,即也可以写作:@Servlet(“/xxxx”)

2 使用注解后程序流程

web.xml 文件中配置:

<listener> <listener-class>edu.xju.AnnotationListener</listener-class> </listener> <context-param> <!-- 扫描包及其子包, 如果有多个参数,以逗号分隔 --> <param-name>basePackage</param-name> <param-value>edu.xju.web</param-value> </context-param> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>edu.xju.action.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.svt</url-pattern> </servlet-mapping>


 

 观察 web.xml 文件,会发现系统实现了一个名为 AnnotationListener 的监听器和一个名为 ActionServlet Servlet ,二者为 @Servlet 注解提供了后台处理器 。应用服务器(如 Tomcat )启动时加载 web.xml 文件,并会立即执行 AnnotationListener 监听器的 contextInitialized 方法,在此方法中,根据 <context-param> 元素指定的 basepackage 参数,读取这些包 (package) 及其子包下的所有类,使用 JAVA 中的反射 API 对这些类进行分析。如果类前使用了 @Servlet 注解,如 @Servlet(“/servlet/LoginServlet”) ,则以 Key ”/servlet/LoginServlet” Value 为此 Servlet 类的一个实例对象,放入一个 Map 结构中。解析这些包下的所有的类之后,将得到的此 Map 结构对象置入 ServletContext 对象中。到此,完成了注解的解析,服务器成功运行起来了。

3 服务器将以下图的方式与客户端进行交互  

     根据 web.xml 文件的配置,所有后缀名为 .svt 请求,都交由 ActionServlet 处理。 ActionServlet 本身也是一个 Servlet ,它也可以使用 @Servlet 注解方法进行配置,但将其配置在 web.xml 文件中具有更好的可读性与可维护性。 ActionServlet 继承于 HttpServlet ,重写了 HttpServlet 类中 protected 修饰的 service 方法。

在此 service 方法的实现代码中,从 HttpServletRequest 请求对象中得到请求的方式类型( GET/POST )和请求的 URI 。如有请求, http://localhost/testProject/servlet/loginServlet.svt ,此时请求方法类型为 POST URI 值为 /testProject/servlet/loginServlet.svt 。从 ServletConext 对象中获取到在监听器中保存的 Map 结构,根据 URI 获得一个 Key=” /servlet/loginServlet” ,从 Map 结构中根据此 Key 得到 Value ,此时 Value 就是要请求调用的那个 Servlet 对象实例。再根据前面得到的请求方法类型,能决定调用此 Servlet 对象实例的 doGet doPost 方法。最终客户端发生的后缀为 . svt 请求,经由 ActionServlet 对请求对象( HttpServletRequest )的分析,从而调用相应某 Servlet doGet doPost 方法,完成了一次客户端请求到服务器响应的过程。

4 注解的扩展

       通过 @Servlet 注解, Servlet 不用再在 web.xml 文件中进行繁冗的注册。考虑性能因素,使用单例设计模式,让每个 Servlet 类在内存中只有一个实例,这些类的实例对象在服务器启动时在监听器中就已经产生了。

通过 @Servlet 注解,我们还可以减少 Servlet 类文件的数量,并且此时不要求类继承或实现 Servlet 任何的类或接口,一个普通的类即可。不过此时注解 @Servlet 不应放在类前面,而应该让它能放在方法前面,需要将 @Servlet 定义时的 @Target(ElementType.TYPE) 改成 @Target(ElementType.METHOD) 。加 @Servlet 注解的方法,名称可以是任意的,但参数必须有 HttpServletRequest 类型及 HttpServletResponse 类型。这是因为我们的方法要对请求和响应做相应的处理。

JAVA 提供的注解,为简化开发人员的工作带来了无限的可能。在 JAVA EE 5 版本中,提供了一些注解的使用来解化开发,而像 Struts2.x Hibernate Spring 等框架中,也开始加了大量的注解,使用这些注解可以极大地简化了配置文件的编写,基本上实现了“零配置”。注解还在面向切面编程( AOP )等领域都有很好的应用。在 JAVA 企业级应用开发中,注解技术将越来越广泛地被使用。

 

10
9
分享到:
评论
17 楼 liaobin665 2010-09-25  
很好很强大··········
16 楼 kzwang 2010-09-17  
leejon 写道
就算没用注解,也可以很少配置啊。
写一个拦截请求的servlet,然后根据请求分发也可以啊。

是的,我在表达一种思路而已
15 楼 kzwang 2010-09-17  
forestking 写道
是挺有意思的,但貌似没什么用。spring有更加成熟和强大的annotation,而且servlet3已经出来了,可以实现web.xml零配置。

确实没有很大用处,只是想表达注解可以简化我们很多的配置工作
14 楼 leejon 2010-09-17  
就算没用注解,也可以很少配置啊。
写一个拦截请求的servlet,然后根据请求分发也可以啊。
13 楼 forestking 2010-09-17  
是挺有意思的,但貌似没什么用。spring有更加成熟和强大的annotation,而且servlet3已经出来了,可以实现web.xml零配置。
12 楼 kidd3166 2010-09-17  
不是很理解,你这样的做法和spring的Controller有什么区别
还不是通过你的分发器对标注的Servlet进行选择,反射,转发

如果不通过你的Servlet就可以访问到标注的Servlet那就比较合适可用!
11 楼 sarin 2010-09-17  
servlet 3 好像已经是注解配置了吧。
10 楼 lyuehh 2010-09-16  
太厉害了,好强啊
9 楼 topxiaohei 2010-09-16  
   太及时了刚好大三被sevrlet的配置问题困扰呢

赞一个  希望楼主多多发帖
8 楼 longxueping 2010-09-16  
期待下文~~
7 楼 heyaron 2010-09-16  
xly_971223 写道
支持rest否?

应该支持吧。
6 楼 xly_971223 2010-09-16  
支持rest否?
5 楼 greenish2008 2010-09-16  
http://www.palmxj.com/bbs/viewthread.php?tid=38&extra=page%3D1
4 楼 qiuyunanjichong 2010-09-16  
期待下文啊
3 楼 heyaron 2010-09-16  
很透彻。谢楼主!
2 楼 greenish2008 2010-09-16  
嗯,写得不错
1 楼 qiuyunanjichong 2010-09-16  
老大 , 我来顶了,写的很好嘛,继续继续

相关推荐

    Spring 3.x 中文开发手册.pdf

    2、基于annotation的配置管理 简单地说,就是 @Profile("production") @Profile("dev") 3、基于annotation的环境变量管理 结合2使用 btw:绿色党肯定要对此表示不慢了 4、属性抽象层 结合2,3使用,可以在很多配置...

    Java™ Servlet 规范.

    2.1.1 基于 Http 规范的请求处理方法 ...................................................................................................15 2.1.2 附加的方法 .................................................

    Servlet3.1规范(最终版) PDF

    2.1 请求处理方法 ...........................................................................................................................................15 2.1.1 基于 Http 规范的请求处理方法 .........

    java微信公众号MVC开发框架

    jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...

    java web 开发详解

    Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    1.2.1 JSP、Servlet和JavaBean及 替代技术 14 1.2.2 JSF及替代技术 15 1.2.3 EJB组件技术简介 15 1.3 JBoss的下载和安装 15 1.3.1 下载和安装JBoss服务器 16 1.3.2 配置JBoss的服务端口 18 1.3.3 进入控制台 19 ...

    Struts2入门教程(全新完整版)

    10.使用0配置:ZERO Annotation 15 11.Result配置详解 15 探讨type类型: 16 Type类型值 16 作用说明 16 对应类 16 chain 16 用来处理Action链 16 com.opensymphony.xwork2.ActionChainResult 16 dispatcher 16 用来...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    本教程是基于MyEclipse环境下基于maven搭建的springmvc步骤(图文教程),文章结尾含有源码下载地址: 新建maven project File-&gt;New-&gt;Project 选择Maven Project 选择项目路径 Use default Workspace location默认...

    MyFastCode:快速构建面向服务的Web应用,基于MysqlHessianSpring&MVCFreemarker

    MyFastCode 快速构建面向soa的大型集群...1:解决hessian繁琐的配置,采用annotation扫描自动export和客户端bind 2:对数据库单表操作不需要写代码,采用了动态构建mybatis statement 3:hessian 序列化/反序列化对BigD

    EWALectureNotes:幻灯片和讲座笔记Hacettepe大学的企业Web体系结构讲座的笔记

    FormApp:基于Eclipse的项目,通过表单提交来演示JSP和Servlet交互 modules-application:基于Maven的模块应用程序,可在后台将3个模块降级 spring-annotation-based-autowiring:基于Spring注释的自动装配bean ...

    毕业设计论坛源码jsp-myPlatform:我的平台

    修复了之前找不到Controller映射的问题,貌似是因为Servlet配置文件中没有使用这个 mvc:annotation-driven/标签,导致没有开启注解的问题,晚上集成Shiro和Log4j2日志组件,然后就可以专心写业务逻辑了 ##4月9号 放弃...

    Spring.3.x企业应用开发实战(完整版).part2

    4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 ...

    Spring中文帮助文档

    2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 ...

    Spring API

    2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 ...

    springmybatis

    恭喜你,环境搭建配置成功,接下来第二章,将讲述基于接口的操作方式,增删改查。 整个工程目录结构如下: 除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! mybatis实战教程(mybatis in action)之二:以...

    iuhyiuhkjh908u0980

    PrettyFaces: EL API访问PrettyContext 支持JSF 1.1 增强了错误页面和servlet重定向 PrettyFaces是一个JSF1.2和JSF2.0的扩展,用来创建便于书签收藏、漂亮的网址。 PrettyFaces优雅的解决了这个问题,包括诸如功能:...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

Global site tag (gtag.js) - Google Analytics