利用Servlet3.0的注解方式开发web应用

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
属性名 类型 --- 是否可选 --- 描述
value String--- --- 该监听器的描述信息。

简单示例:

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







你可能感兴趣的:(利用Servlet3.0的注解方式开发web应用)