`
kzwang
  • 浏览: 6703 次
  • 性别: 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  
老大 , 我来顶了,写的很好嘛,继续继续

相关推荐

    基于annotation的SpringMVC入门小例子

    **基于Annotation的SpringMVC入门小例子** 在Java Web开发中,SpringMVC是一个非常流行的框架,它使得构建Web应用程序变得更加简洁和高效。本篇将详细介绍如何使用注解(Annotation)来配置和运行一个基本的...

    SpringMVC基于代码的配置方式(零配置,无web.xml)

    传统的SpringMVC配置往往依赖于XML文件,如web.xml和spring-servlet.xml等,但随着Spring框架的发展,出现了基于代码的配置方式,实现了零XML配置,提高了开发效率。本文将详细介绍如何在不使用web.xml的情况下,...

    javax.servlet的jar包

    4. `ServletConfig`:包含了Servlet的配置信息,如初始化参数。 5. `ServletContext`:表示整个Web应用的上下文,提供了全局信息和资源,如共享数据、监听器注册、资源路径获取等。 JSP是Java Web开发中的视图层...

    Java程序开发教学课件:15Servlet高级编程.pptx

    * 基于 Annotation 配置 Servlet、Filter、Listener 和安全,替代 web.xml 文件 * 可以将配置分割为若干 xml 片段文件,实现 Web 应用的模块化 * 异步 Servlet(Asynchronous Servlet)避免长任务阻塞服务器 创建 ...

    将dwr集成到spring mvc(dwr的配置是基于xml)

    你需要在`src/main/resources/META-INF/spring`目录下创建一个名为`dwr-servlet.xml`的文件,定义DWR的Servlet配置。例如: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation...

    拦截器与冲突解决

    - **排除默认拦截器**:如果`&lt;mvc:annotation-driven /&gt;`包含默认拦截器,可以考虑使用`&lt;mvc:default-servlet-handler&gt;`或`&lt;mvc:annotation-driven enable-matrix-variables="false" /&gt;`来禁用它们。 - **调整拦截器...

    annotation

    APT可以在编译期间读取源代码中的注解,并基于这些注解自动生成相应的源代码或编译时需要的类文件。这极大地简化了诸如ORM(对象关系映射)、代码生成、验证等任务,使得开发者无需手动编写大量重复的模板代码。 ...

    Servlet与JSP核心编程(第2卷 第2版)

    2. **Servlet配置** - 在web.xml文件中,通过`&lt;servlet&gt;`和`&lt;servlet-mapping&gt;`元素来配置Servlet,指定Servlet类名和URL映射。 - 也可以使用Java Annotation(@WebServlet)进行动态注册,简化配置。 3. **请求...

    servlet 3.0 jar 包综合下载

    1. **注解驱动的配置**:Servlet 3.0引入了注解(Annotation)来替代XML配置文件,简化了部署描述符(web.xml)的编写。例如,可以使用`@WebServlet`、`@WebFilter`和`@WebListener`注解直接在类上声明Servlet、...

    SSH框架开发案例(Annotation版本)

    2. **src/main/resources**:存放数据库连接配置文件(如hibernate.cfg.xml)、Spring的配置文件(可能包含一些基于注解的配置)等。 3. **webapp/WEB-INF**:放置Struts2的配置文件struts.xml,以及web.xml,后者...

    JavaWeb——Servlet.docx

    3. `javax.servlet.annotation`:包含Servlet、Filter和Listener的注解,用于元数据定义。 4. `javax.servlet.descriptor`:提供Web应用程序配置信息的编程访问。 在实现Servlet时,开发者可以选择直接实现Servlet...

    servlet帮助文档 API 英文版(2.3-3.0)

    1. **注解(Annotation)**:Servlet 3.0引入了注解,允许开发者无需在web.xml中硬编码,可以直接在类或方法上使用注解来声明Servlet、过滤器和监听器。 2. **全异步支持**:Servlet 3.0完全支持异步处理,允许在...

    Java程序开发教学课件:15-Servlet高级编程.ppt

    1. **基于Annotation的配置**: 在Servlet 3.0中,开发者可以通过注解(@WebServlet, @WebFilter, @WebListener)直接在类上声明Servlet、Filter和Listener,而不再需要在web.xml文件中进行繁琐的手动配置。这种方式...

    jsp+jdbc+servlet登陆完整程序和注解

    本文将介绍基于JSP、JDBC和Servlet技术实现的一个简单用户登录系统,同时涉及到了注解的应用。这个系统主要包含三个关键部分:JSP页面、Servlet控制器和数据库交互。 1. JSP(JavaServer Pages): JSP是Java的一...

    springMVC mybatis annotation框架搭建

    在Spring的配置文件(如`applicationContext.xml`或`spring-servlet.xml`)中,我们会声明DataSource、SqlSessionFactoryBean以及MapperScannerConfigurer,让Spring能够找到并管理所有的Mapper接口。 最后,为了...

    Annotation Based Spring MVC Basics

    在本文中,我们将深入探讨基于注解的Spring MVC基础知识,这是一种流行且强大的Java Web开发框架。首先,我们假设读者对基本的Web应用程序结构和配置文件有一定的了解,以及对Servlets有基本的认识。接下来,我们将...

    [课堂课件讲解]Java微服务实践-Spring Boot Web篇(下).pptx

    包括 @javax.servlet.annotation.WebServlet、@javax.servlet.annotation.WebFilter、@javax.servlet.annotation.WebListener、@javax.servlet.annotation.ServletSecurity、@javax.servlet.annotation....

    Servlet3.0微框架

    1. **注解驱动**:Servlet3.0引入了注解(Annotation)支持,使得开发者无需编写XML配置文件即可声明Servlet、Filter和Listener。例如,`@WebServlet`、`@WebFilter`和`@WebListener`可以直接在类上声明,简化了部署...

Global site tag (gtag.js) - Google Analytics