servlet3.0新特性之注解

在JavaEE6规范中添加了了Servlet3.0 规范,该规范中允许在定义 Servlet、Filter 与 Listener 三大组件时使用注解,而不用在web.xml 进行注册了。Servlet3.0 规范允许 Web 项目没有 web.xml 配置文件。
使用servlet3.0时需要jdk6+,tomcat7+

servlet注解

在3.0规范中使用@WebServlet()注解注册一个servlet,该注解中有多个属性,常用属性如下:

属性名 类型 说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
name String 相当于servlet-name的值
loadOnStartup int 相当于loadOnStartup,默认值为-1
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

代码示例:

package com.monkey1024.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * servlet注解
 */
@WebServlet(value={"/test","/abc/test"},
            name="testServlet",
            loadOnStartup=2,
            initParams={
                    @WebInitParam(name="teacher", value="monkey1024"),
                    @WebInitParam(name="course", value="java")
            })
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        //获取servlet名称
        String servletName = servletConfig.getServletName();
        System.out.println("servlet名称:" + servletName);

        //获得初始化参数
        Enumeration<String> params = servletConfig.getInitParameterNames();
        while(params.hasMoreElements()){
            String name = params.nextElement();
            String value = servletConfig.getInitParameter(name);
            System.out.println(name + ":" + value);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

filter注解

在3.0 规范中使用@WebFilter()注解来注册当前的 Filter 类。目前使用注解无法指定filter的执行顺序,其会默认根据filter的名字的字母顺序执行。该注解常用属性的类型与意义如下表所示:

属性名 类型 说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
filterName String 相当于filter-name的值
servletNames String[] 相当于filter-mapping的子标签servlet-name,用于指定要过滤的Servlet 名称
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

代码示例:

package com.monkey1024.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * filter注解
 */
@WebFilter(value={"/*"},
           filterName="testFilter")
public class TestFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

Listener注解

Servlet3.0 规范中使用@WebListener()注解来注册当前的 Listener 类。在 Web 工程中创建好 Listener 后,直接在类上添加@WebListener 注解即可完成 Listener 的注册。
该注解有一个属性 value,表示对该监听器的描述,使用不多。

代码示例:

package com.monkey1024.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

/**
 * Listener注解
 *
 */
@WebListener
public class TestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent sre)  { 
    }

    public void requestInitialized(ServletRequestEvent sre)  { 
    }

}

web.xml文件

在创建项目时注意选择servlet版本,创建时可以通过勾选生成web.xml文件,默认是不会生成的。
在生成的web.xml文件中的标签中有一个属性 metadata-complete,是布尔类型。其值为 true,表示可以完全使用 web.xml 中的注册信息,对 Servlet3.0 的注解将忽略。若值为 false,则表示可以使用注解, 但 web.xml 中的注册信息也起作用。若一个组件类(Servlet、Filter 或 Listener)既使用了注解,又在 web.xml 中进行了注册,则对于不同的组件,其效果是不同的:

  • 使用两种方式对于同一个 Servlet 进行注册,要求 web.xml 与注解中的 url-pattern 是不能重复的。否则,服务器无法启动。
  • 使用两种方式对于同一个 Filter 进行注册,无论 url-pattern 值是否相同,其效果都相当于一个 Filter。
  • 使用两种方式对于同一个 Listener 进行注册,其效果与使用一种方式注册完全相同。