【Servlet3.0新特性】第02节_Servlet的动态注册以及使用注解编写监听器和过滤器

这是一个Web Project


首先是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">
	<!-- Servlet3.0需要Tomcat7和JavaEE6,配置方法详见 -->
	<!-- http://blog.csdn.net/jadyer/article/details/9164655 -->
	<!-- http://blog.csdn.net/jadyer/article/details/9164737 -->
</web-app>

下面是一个普通的Java类(它即将在Servlet监听器中被动态注册为Servlet)

package com.jadyer.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//这里并没有使用@WebServlet注解,但为了让这个类成为一个Servlet
//我们可以采用Servlet3.0提供的动态注册机制把它动态注册为一个Servlet
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 759371432019399353L;

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println(config.getInitParameter("logPath"));
		System.out.println(config.getInitParameter("savePath"));
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("http://blog.csdn.net/jadyer");
	}
}

下面是采用注解编写的Servlet监听器

package com.jadyer.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebListener;

import com.jadyer.servlet.HelloServlet;

/**
 * Servlet3.0新特性之Servlet监听器和Servlet动态注册
 * @create Jun 24, 2013 10:39:47 AM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
@WebListener
public class HelloListener implements ServletContextListener {
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("服务器关闭时会调用该方法");
	}

	@Override
	public void contextInitialized(ServletContextEvent contextEvent) {
		System.out.println("服务器启动时会调用该方法");
		
		ServletContext context = contextEvent.getServletContext();
		
		//注册一个没有使用@WebServlet注解的类为Servlet(第一个参数是Servlet的名字)
		ServletRegistration register = context.addServlet("helloServlet", HelloServlet.class);
		
		//为动态注册的Servlet设定访问URL(可设定多个)
		register.addMapping("/hello", "/servlet/hello");
		
		//为动态注册的Servlet设定初始参数(可选的,相当于以前的<init-param>)
		register.setInitParameter("logPath", "/app/log");
		register.setInitParameter("savePath", "/app/upload");
	}
}

最后是采用注解编写的Servlet过滤器

package com.jadyer.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;
import javax.servlet.annotation.WebInitParam;

@WebFilter(urlPatterns="/*", initParams=@WebInitParam(name="encoding", value="UTF-8"))
public class HelloFilter implements Filter {
	@Override
	public void destroy() {
		System.out.println("destroy invoked");
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("init invoked");
		System.out.println(config.getInitParameter("encoding"));
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter invoked");
		chain.doFilter(request, response);
	}
}

你可能感兴趣的:(监听器,filter,过滤器,servlet3,动态注册)