Servlet3.0

五、ServletContext 的性能增强

除了以上的新特性之外,ServletContext对象的功能在新版本中也得到了增强。现在,该对象支持在运行时动态部署Servlet、过滤器、监听器,以及为Servlet 和过滤器增加URL映射等。以Servlet为例,过滤器与监听器与之类似。

ServletContext为动态配置Servlet增加了如下方法:

ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)

ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)

ServletRegistration.Dynamic addServlet(String servletName, String className)

<T extends Servlet> T createServlet(Class<T> clazz)

ServletRegistration.getServletRegistration(String servletName) Map<String,? extends ServletRegistration> getServletRegistrations()

其中前三个方法的作用是相同的,只是参数类型不同而已;通过 createServlet()方法创建的Servlet,通常需要做一些自定义的配置,然后使用 addServlet()方法来将其动态注册为一个可以用于服务的Servlet。两个 getServletRegistration()方法主要用于动态为Servlet增加映射信息,这等价于在 web.xml(抑或web-fragment.xml)中使用<servlet-mapping>标签为存在的Servlet 增加映射信息。

以上ServletContext新增的方法要么是在ServletContextListener的 contexInitialized方法中调用,要么是在ServletContainerInitializer的onStartup()方法中调用。

ServletContainerInitializer也是Servlet 3.0新增的一个接口,容器在启动时使用JAR服务API(JAR Service API)来发现ServletContainerInitializer的实现类,并且容器将WEB-INF/lib目录下JAR包中的类都交给该类的onStartup()方法处理,我们通常需要在该实现类上使用@HandlesTypes注解来指定希望被处理的类,过滤掉不希望给onStartup()处理的类。