Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。
@WebServlet
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。该注解具有以下常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):
属性名----类型----描述
name---String---指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
value---String[]---该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatterns---String[]---指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern> 标签。
loadOnStartup---int---指定 Servlet 的加载顺序,等价于<load-on-startup> 标签。
initParams ---WebInitParam[]---指定一组 Servlet 初始化参数,等价于 <init-param> 标签。
asyncSupported---boolean---声明 Servlet 是否支持异步操作模式,等价于<async-supported>标签。
description---String---该Servlet 的描述信息,等价于<description>标签。
displayName---String---该Servlet的显示名,通常配合工具使用,等价于<display-name>标签。
@WebInitParam
该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 <servlet> 和 <filter> 的 <init-param> 子标签。@WebInitParam 具有下表给出的一些常用属性:
属性名---类型---是否可选---描述
name---String---否---指定参数的名字,等价于 <param-name>。
value---String ---否---指定参数的值,等价于 <param-value>。
description---String---是---关于参数的描述,等价于 <description>。
@WebFilter
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 ):
属性名---类型---描述
filterName ---String ---指定过滤器的 name 属性,等价于 <filter-name>
value---String[]---该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
urlPatterns---String[] --- 指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。
servletNames ---String[]---指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name>的取值。
dispatcherTypes---DispatcherType---指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParams---WebInitParam[] ---指定一组过滤器初始化参数,等价于 <init-param> 标签。
asyncSupported---boolean---声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。
description---String---该过滤器的描述信息,等价于 <description> 标签。
displayName---String---该过滤器的显示名,通常配合工具使用,等价于 <display-name> 标签。
@WebListener
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
• ServletContextListener
• ServletContextAttributeListener
• ServletRequestListener
• ServletRequestAttributeListener
• HttpSessionListener
• HttpSessionAttributeListener
属性名类型---是否可选---描述
valueString---是---该监听器的描述信息。
简单示例:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
HelloServlet.java
package com.zero;
import java.io.IOException;
import java.io.PrintWriter;
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;
@WebServlet(name = "HelloServlet", urlPatterns = { "/helloServlet","/worldServlet" }, loadOnStartup = -1, initParams = { @WebInitParam(name = "key", value = "value") })
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doGet");
;
PrintWriter writer = resp.getWriter();
writer.write("<p1>Hello<p1>");
writer.flush();
writer.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("HelloServlet init");
}
}
HelloListener.java
package com.zero;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener("HelloListener")
public class HelloListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HelloListener contextDestroyed");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("HelloListener contextInitialized");
}
}
CharFilter.java
package com.zero;
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;
import javax.servlet.annotation.WebInitParam;
@WebFilter(filterName="CharFilter",urlPatterns = { "/*" }, initParams = { @WebInitParam(name = "key", value = "value") })
public class CharFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("CharFilter destroy");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("CharFilter...");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("CharFilter init");
}
}
OtherFilter.java
package com.zero;
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;
import javax.servlet.annotation.WebInitParam;
@WebFilter(filterName = "OtherFilter", urlPatterns = { "/*" }, initParams = { @WebInitParam(name = "key", value = "value") })
public class OtherFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("OtherFilter destroy");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("OtherFilter...");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig conf) throws ServletException {
System.out.println("OtherFilter init");
}
}
浏览器访问http://localhost:8080/servlettest/helloServlet
运行结果:
HelloListener contextInitialized
CharFilter init
OtherFilter init
HelloServlet init
CharFilter...
OtherFilter...
doGet
PS:之前控制多个filter的执行顺序是通过web.xml中控制filter的位置顺序来控制的。如果通过注解方式,想要控制filer的执行顺序可以 通过控制filter的文件名 来控制。比如:两个文件的 首字母A排B之前 ,导致每次执行的时候都是先执行A开头的filter再执行B开头的filter。
更多详情请参考:http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/#major3