Servlet3.0的動態


動態的創建是為了簡化配置文件的.對於我們創建的servlet,filter和listener后可以使用。這也是注解的另外一種替代方式。

動態的添加有兩種,一種是基於ContextListener的,另外一種是基於servlet3.0新增接口的ServletContainerInitializer的

動態的主要類是Dynamic

代碼:

package com.hotusm.dynamic;

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

@WebListener
public class DynamicInitContextListener implements ServletContextListener{

    public void contextInitialized(ServletContextEvent sce) {
        
        ServletContext context = sce.getServletContext();
        ServletRegistration.Dynamic dynamicServlet=context.addServlet("dynamicServlet", DynamicServlet.class); 
        dynamicServlet.addMapping("/dynamicServlet");
        dynamicServlet.setAsyncSupported(true);
        dynamicServlet.setLoadOnStartup(1);
        
        FilterRegistration.Dynamic dynamicFilter = context.addFilter("dynamicFilter", DynamicFilter.class);
        
        context.addListener("com.hotusm.dynamic.DynamicListener");
        
    }

    public void contextDestroyed(ServletContextEvent sce) {
        
    }

}

ServletContainerInitializer的:

package com.hotusm.dynamic;

import java.util.Set;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import javax.servlet.http.HttpServlet;
public class ServletContainerInitializerImpl implements ServletContainerInitializer{

    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        
        System.out.println("ServletContainerInitializer");
        
        if(c!=null){
            for(Class<?> clazz:c){
                System.out.println(clazz.getClass().getName());
            }
        }
        
//        ServletContext context = sce.getServletContext();
//        ServletRegistration.Dynamic dynamicServlet=context.addServlet("dynamicServlet", DynamicServlet.class); 
//        dynamicServlet.addMapping("/dynamicServlet");
//        dynamicServlet.setAsyncSupported(true);
//        dynamicServlet.setLoadOnStartup(1);
//        
//        FilterRegistration.Dynamic dynamicFilter = context.addFilter("dynamicFilter", DynamicFilter.class);
//        
//        context.addListener("com.hotusm.dynamic.DynamicListener");

    }
}

對於ServletContainerInitializer的方式,是基於SPI來做的,所以我們需要編輯幾個文件:

 

里面的內容就是我們的實現類

 

另一方面在springmvc中我們可以使用WebApplicationInitializer的,因為我們可以在spring-web的架包下面看到:

里面的內容是:

其中的類實現有這樣一句的代碼:

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

表示的就是凡是實現或者繼承WebApplicationInitializer的都會被加載

@HandlesTypes指定的類的子類和本類都會傳進來。(onStartup的第一個參數)

 

 

 

 

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() 處理的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM