Servlet3.0新特性之动态注册

来源:互联网 发布:mac玩英雄联盟鼠标卡顿 编辑:程序博客网 时间:2024/05/23 02:05

动态注册时Servlet3的一项新特性,他不需要重新加载应用程序就可以安装新的Web对象(如Servlet,过滤器,监听器等)


一、动态注册:

   

ServletContext接口以下的方法,用来动态地创建Web对象


<T extends Filter>createFilter(java.lang.Class<T> clazz)

<T extends java.util.EventListener> createListener(java.lang.Class<T> clazz)

<T extends Servlet>createServlet(java.lang.Class<T> clazz)


例如:Servlet myServlet=createServlet(MyServlet.class);



创建好Web对象后,可以利用以下方法将它添加到ServletContext中

FilterRegistration.Dynamic addFilter(java.lang.String filterName,Filter filter)

<T extends java.util.EventListener> addListener(T t)

ServletRegistration.Dynamic addServlet (String servletName,Servlet servlet)



在创建或者添加监听器时,传给addListener覆盖方法的类必须实现XXXListener接口


addFilter 或addServlet 方法返回值是一个FilterRegistration.Dynamic或ServletRegistration.Dynamic

他们都是Registration.Dynamic 的子接口,

FilterRegistration.Dynamic可以配置一个FIliter

ServletRegistration.Dynamic可以配置一个Servlet




二、举个例子

动态注册一个Servlet:FirstServlet 

该Servlet并没有用@WebServlet进行标注,也没有在部署符中部署

监听器对它动态注册,并投入使用


FirstServlet类

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class FirstServlet extends HttpServlet {private static final long serialVersionUIDD=-6045338L;private String name;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubresp.setContentType("text/html");PrintWriter write=resp.getWriter();write.println("<html><head><title>Fist servlet"+"</title></head><body>"+name);write.println("</body></html>");}public void setName(String name){this.name=name;}}


DynRegListener类

import javax.servlet.Servlet;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletRegistration;import javax.servlet.annotation.WebListener;@WebListenerpublic class DynRegListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void contextInitialized(ServletContextEvent arg0) {// TODO Auto-generated method stubServletContext servletContext=arg0.getServletContext();Servlet firstServlet=null;try{firstServlet=servletContext.createServlet(FirstServlet.class);}catch(Exception e){e.printStackTrace();}if(firstServlet!=null&&firstServlet instanceof FirstServlet){((FirstServlet)firstServlet).setName("Dynamically registered servlet");}ServletRegistration.Dynamic dynamic=servletContext.addServlet("firstServlet", firstServlet);dynamic.addMapping("/dynamic");}}


利用这个URL来调用FirstServlet

http://localhost:8080/app/dynamic


结果:




1 0