值得注意的是,部署描述符优先于注释。换句话说,部署描述符覆盖通过注释机制所规定的配置信息。Web 部署描述符的 3.0 版本在 web-app 元素上包含一种名为 metadata-complete 的新属性。该属性定义了 web 描述符是否完整,或者 web 应用程序的类文件是否针对指定部署信息的注释而进行检查。如果该属性被设置为 true,则部署工具必须忽略类文件中所存在的任何 servlet注释,并只使用描述符中所提及的配置细节。否则,如果没有指定该值或者该值被设置为 false,容器必须针对注释而扫描应用程序的所有类文件。这个属性提供了在应用程序启动阶段启用或者禁用注释扫描以及对注释的处理。

在 Servlet 3.0 中所引入的所有注释都可以在 javax.servlet.http.annotation 和 javax.servlet.http.annotation.jaxrs 软件包中找到。以下章节阐述 Servlet注释的完整集合:

@Servlet:javax.servlet.http.annotation.Servlet 是一个类级别的注释,确认经过注释的类为一个 servlet 并保存关于所声明的 servlet 的元数据。urlMappings 属性是指定 URL 模式(调用该 servlet)的 @Servlet 的强制属性。当接收到了一个请求时,容器将请求中的 URL 与 servlet 的 urlMappings 进行匹配,且如果 URL 模式匹配,则调用相应的 servlet 以响应该项请求。该注释的所有其他属性都是可选的,并带有合理的默认值。Servlet 类中必须有一种使用像 GET、PUT、POST、HEAD 或者 DELETE 这样的 HttpMethod 注释进行注释的方法。这些方法应将 HttpServletRequest 和 HttpServletResponse 作为方法参数。与以前的版本相反,servlets 3.0 的版本可以作为简单传统 Java 对象(Plain Old Java Objects,POJOs)而实现;也就是 servlets 不必再扩展像 HTTPServlet 或者 GenericServlet 这样的基础 servlet 实现类。

为了进行比较,在此给出了使用传统 Servlet 2.5 API 编写的 Java servlet 代码片段,如下所示。在 Servlet 2.5 中,只要在部署描述符中配置了 servlet 的详细信息,web 容器就将初始化 servlet。

  1. public class MyServlet extends HttpServlet {
  2. public void doGet (HttpServletRequest req,
  3. HttpServletResponse res) {
  4. ....
  5. }
  6. }

Deployment descriptor (web.xml)

  1. <web-app>
  2. <servlet>
  3. <servlet-name>MyServlet</servlet-name>
  4. <servlet-class>samples.MyServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>MyServlet</servlet-name>
  8. <url-pattern>/MyApp</url-pattern>
  9. </servlet-mapping>
  10. ...
  11. </web-app>

这里给出的是使用 Servlet 3.0 API 编写的较为简化的版本。当 MyServlet 使用 @Servlet注释而被注释为一个 servlet 时,则在 web 容器的启动期间对其初始化。注意,在这种情况下部署描述符是可选的。

  1. @Servlet(urlMappings={"/MyApp"})
  2. public class MyServlet {
  3. @GET
  4. public void handleGet(HttpServletRequest req,
  5. HttpServletResponse res) {
  6. ....
  7. }
  8. }
  9. Deployment descriptor (web.xml)
  10. optional

@ServletFilter 和 @FilterMapping:您可以使用 javax.servlet.http.annotation.ServletFilter 注释来注释过滤器类,从而轻松创建一个 servlet 过滤器。该注释封装正被声明的过滤器的有关元数据。在过滤器类上具有 @FilterMapping 注释也是强制性的。@FilterMapping 注释定义用于过滤器的 URL 模式。@ServletFilter 的所有其他属性都是可选的,并带有合理的默认值。V3.0 过滤器类现在类似 POJO 类,并且没有用于这些类所需的 Filter 接口或者非参数公用构造器。以下给出了使用 Servlet v2.5 API 的过滤器类的代码片段:

  1. public class MyFilter implements Filter {
  2. public void doFilter(ServletRequest req,
  3. ServletResponse res,
  4. FilterChain chain)
  5. throws IOException, ServletException {
  6. ......
  7. }
  8. }
  9. Deployment descriptor (web.xml)
  10. <web-app>
  11. <filter>
  12. <filter-name>My Filter</filter-name>
  13. <filter-class>samples.MyFilter</filter-class>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>My Filter</filter-name>
  17. <url-pattern>/foo</url-pattern>
  18. </filter-mapping>
  19. ...
  20. </web-app>

使用 Servlet 3.0 编写的一个示例过滤器类如下所示。因为该类使用 ServletFilter 注释,所以容器将 MyFilter 标记为一个过滤器类。MyFilter 截取所有收到的请求,其中该请求的 URL 匹配模式 /foo。Servlet 3.0 为过滤器配置提供了可选的部署描述符。

  1. @ServletFilter
  2. @FilterMapping("/foo")
  3. public class MyFilter {
  4. public void doFilter(HttpServletRequest req,
  5. HttpServletResponse res) {
  6. .....
  7. }
  8. }
  9. Deployment descriptor (web.xml)
  10. optional

@InitParam:该注释可以用来定义必须传递给 servlet 或者过滤器类的任意初始化参数。它是 @Servlet 和 @ServletFilter 注释的一个属性。以下代码示例解释了如何将具有 english 值、称作 lang 的初始化参数传递给一个 servlet 类。

  1. @Servlet(urlMappings={"/MyApp"}, initParams ={@InitParam
    (name="lang", value="english")})
  2. public class MyServlet {
  3. @GET
  4. public void handleGet(HttpServletRequest req,
  5. HttpServletResponse res) {
  6. ....
  7. }
  8. }

@ServletContextListener:javax.servlet.http.annotation.ServletContextListener 注释将该类声明为一个 servlet 上下文侦听器。当 web 容器创建或者销毁 ServletContext 时,该上下文侦听器接收注释。上下文侦听器是一个 POJO 类,且不必实现 ServletContextListener 接口。使用 Servlet 2.5 API 编写的侦听器类如下所示。当且仅当您在部署描述符中配置了该侦听器类,容器才识别它。

  1. public class MyListener implements ServletContextListener {
  2. public void contextInitialized(ServletContextEvent sce) {
  3. }
  4. .....
  5. }
  6. Deployment Descriptor (web.xml)
  7. <web-app>
  8. <listener>
  9. <listener-class>samples.MyListener</listener-class>
  10. </listener>
  11. ....
  12. </web-app>

使用 Servlet 3.0 API 编写的一个得到极大简化的侦听器类,如下所示。

    1. @ServletContextListener
    2. public class MyListener {
    3. public void contextInitialized (ServletContextEvent sce) {
    4. }
    5. .....
    6. }
    7. Deployment Descriptor (web.xml)
    8. optional

Servlet注释与部署描述符的更多相关文章

  1. web.xml 部署描述符元素

    在每一个Web应用程序路径的WEB-INF/下和conf/下存在一个Web.xml配置文件,用来设定Web应用程序的配置.在Web.xml中的设定非常多,接下来分段来说明它的各项设定:<?xml ...

  2. Servlet部署描述符

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512237744641540612/ <Servlet简单实现开发部署过程>中的过程,可以概括为以下模 ...

  3. 利用eclipse新建的java web项目没有部署描述符web.xml文件怎么办?

    原文转自:http://blog.csdn.net/suyu_yuan/article/details/50947007 利用eclipse新建的Java Web项目没有部署描述符web.xml文件, ...

  4. 部署描述符 web.xml

    google的部署描述符详解: https://cloud.google.com/appengine/docs/flexible/java/configuring-the-web-xml-deploy ...

  5. 部署描述符(web.xml)和标注(annotation)

    部署描述符(web.xml) 详细信息可在http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html上下载web- ...

  6. Servlet_03_部署描述符

    二.参考文档 1.Servlet 3.0 之 部署描述符 2.web.xml配置详解 部署描述符文件

  7. 部署描述符web.xml

    部署描述符应用场景 需要传递初始参数给ServletContext 有多个过滤器,并要指定调用顺序 需要更改会话超时设置 要限制资源的访问,并配置用户身份验证方式 xsi:schemaLocation ...

  8. Servlet3.x部署描述符

    简介 web.xml即部署描述符,位于WEB-INF目录下.在Servlet3以上版本有提供了注解的方式部署Servlet,因此web.xml是可选的.web.xml大概框架如下: <?xml ...

  9. 关于Java Web应用中的配置部署描述符web.xml

    一.web.xml概述 位于每个Web应用的WEB-INF路径下的web.xml文件被称为配置描述符,这个 web.xml文件对于Java Web应用十分重要,每个Java Web应用都必须包含一个w ...

随机推荐

  1. A1032. Sharing

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

  2. SQL语句中 int 溢出 + Asp语句中 Long 溢出

    晚上5点多,同事在QQ告诉我,一个用户向他反应,在他登录的时候显示错误信息,我们在管理平台查看该用户的基本信息时,也显示错误信息. 经过初步分析,原来是在执行 SQL语句的时候发生Int溢出: sql ...

  3. NOIP 普及组 2014 螺旋矩阵

    传送门 https://www.cnblogs.com/violet-acmer/p/9898636.html 题解: 这道题挺有意思的,有点考思维吧. 大体思路是用四个pair<int ,in ...

  4. (Arrays.sort() 或 map) Ignatius and the Princess IV hdu1029

    Ignatius and the Princess IV 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1029 借鉴链接:https://blog.csd ...

  5. 枚举 enum 成员变量初始化

    typedef enum { A1, A2, A3, A4 = , A_END }A; 如果A1赋值为5,则下列依次递增1,即A2等于6,A3等于7: 由于A4赋值为10,所以A_END等于11 如果 ...

  6. linu查看当前目录下文件大小

    查看当前目录下文件大小 [root@izm5e33l0ge76tvdj3qtnfz var]# du -sh * .0K adm 190M cache .0K crash 24K db .0K emp ...

  7. CM记录-CDH故障修复处理记录

    CDH大数据集群修复记录 1)cm web打不开,查看监听7180端口产生了很多进程,于是kill进程:重启cloudera-cmf-server服务,几秒钟就挂了,查看cloudera-scm-se ...

  8. SqlServer中的临时表

    一.什么是临时表 临时表属于会话级的,会话结束的时候,临时表被释放,其创建.使用.删除都和普通表一样,临时表空间一般利用虚拟内存,不必进行磁盘I/O,因此效率较高..临时表有两种:普通临时表 (#Tb ...

  9. java.net.URL 模拟用户登录网页并维持session【转】

    java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...

  10. 出栈顺序 与 卡特兰数(Catalan)的关系

    一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3  ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2 ...