<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    servlet 3.0筆記之servlet的動態注冊

    說實話,對servlet 3動態加載servlet的機制有些失望,本來期望著可以在運行時完成對servlet的注冊和銷毀,但現狀是,只能在webapp啟動在初始化時進行完成注冊,可能是為了安全考慮吧.
    在Servlet3.0中可以動態注冊Servlet,Filter,Listener,在ServletContext對應注冊API為:
      /**
       * 添加Servlet
       */
      public ServletRegistration.Dynamic addServlet(String servletName,
          String className);

      public ServletRegistration.Dynamic addServlet(String servletName,
          Servlet servlet);

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

      /**
       * 添加Filter
       */
      public FilterRegistration.Dynamic addFilter(String filterName,
          String className);

      public FilterRegistration.Dynamic addFilter(String filterName, Filter filter);

      public FilterRegistration.Dynamic addFilter(String filterName,
          Class<? extends Filter> filterClass);

      /**
       * 添加Listener
       */
      public void addListener(String className);

      public <T extends EventListener> void addListener(T t);

      public void addListener(Class<? extends EventListener> listenerClass);
    每個組件注冊都提供三個方法,很細心。
    下面談談動態注冊Servlet,但不要希望太高,只能在初始化時進行注冊。在運行時為了安全原因,無法完成注冊。在初始化情況下的注冊Servlet組件有兩種方法:
    1.實現ServletContextListener接口,在contextInitialized方法中完成注冊.
    2.在jar文件中放入實現ServletContainerInitializer接口的初始化器
    先說在ServletContextListener監聽器中完成注冊。
        public void contextInitialized(ServletContextEvent sce) {

            ServletContext sc = sce.getServletContext();

            // Register Servlet
            ServletRegistration sr = sc.addServlet("DynamicServlet",
                "web.servlet.dynamicregistration_war.TestServlet");
            sr.setInitParameter("servletInitName", "servletInitValue");
            sr.addMapping("/*");

            // Register Filter
            FilterRegistration fr = sc.addFilter("DynamicFilter",
                "web.servlet.dynamicregistration_war.TestFilter");
            fr.setInitParameter("filterInitName", "filterInitValue");
            fr.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),
                                         true, "DynamicServlet");

            // Register ServletRequestListener
            sc.addListener("web.servlet.dynamicregistration_war.TestServletRequestListener");
        }
    很簡單,難度不大。
    再說說在jar文件中的servlet組件注冊,需要在jar包含META-INF/services/javax.servlet.ServletContainerInitializer文件,文件內容為已經實現ServletContainerInitializer接口的類:
    com.learn.servlet3.jardync.CustomServletContainerInitializer
    該實現部分代碼:
    @HandlesTypes({ JarWelcomeServlet.class })
    public class CustomServletContainerInitializer implements
        ServletContainerInitializer {
      private static final Log log = LogFactory
          .getLog(CustomServletContainerInitializer.class);

      private static final String JAR_HELLO_URL = "/jarhello";

      public void onStartup(Set<Class<?>> c, ServletContext servletContext)
          throws ServletException {
        log.info("CustomServletContainerInitializer is loaded here...");
       
        log.info("now ready to add servlet : " + JarWelcomeServlet.class.getName());
       
        ServletRegistration.Dynamic servlet = servletContext.addServlet(
            JarWelcomeServlet.class.getSimpleName(),
            JarWelcomeServlet.class);
        servlet.addMapping(JAR_HELLO_URL);

        log.info("now ready to add filter : " + JarWelcomeFilter.class.getName());
        FilterRegistration.Dynamic filter = servletContext.addFilter(
            JarWelcomeFilter.class.getSimpleName(), JarWelcomeFilter.class);

        EnumSet<DispatcherType> dispatcherTypes = EnumSet
            .allOf(DispatcherType.class);
        dispatcherTypes.add(DispatcherType.REQUEST);
        dispatcherTypes.add(DispatcherType.FORWARD);

        filter.addMappingForUrlPatterns(dispatcherTypes, true, JAR_HELLO_URL);

        log.info("now ready to add listener : " + JarWelcomeListener.class.getName());
        servletContext.addListener(JarWelcomeListener.class);
      }
    }
    其中@HandlesTypes注解表示CustomServletContainerInitializer 可以處理的類,在onStartup 方法中,可以通過Set<Class<?>> c 獲取得到。
    jar文件中不但可以包含需要自定義注冊的servlet,也可以包含應用注解的servlet,具體怎么做,視具體環境而定。
    把處理某類事物的servlet組件打包成jar文件,有利于部署和傳輸,功能不要了,直接去除掉jar即可,方便至極!

    posted on 2010-12-30 17:27 nieyong 閱讀(19972) 評論(0)  編輯  收藏 所屬分類: Servlet3

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

    <2010年12月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费无码国产在线观国内自拍中文字幕| 日产亚洲一区二区三区| 亚洲最大的成人网站| 九九美女网站免费| 亚洲AV无码国产精品麻豆天美| 999zyz**站免费毛片| 亚洲s色大片在线观看| 人妻无码一区二区三区免费 | 在线A级毛片无码免费真人| 亚洲中文字幕在线无码一区二区| 麻豆国产精品免费视频| 亚洲AV成人噜噜无码网站| 国产精品69白浆在线观看免费| 亚洲香蕉久久一区二区| 日韩免费a级在线观看| 日产久久强奸免费的看| 中文字幕亚洲乱码熟女一区二区 | 久久99九九国产免费看小说| 亚洲sss综合天堂久久久| 在线观看免费国产视频| 国产免费久久精品99久久| 亚洲Aⅴ无码专区在线观看q| 国产免费不卡视频| 亚洲AV无码一区二区三区久久精品| 亚洲欧洲久久av| 欧洲人免费视频网站在线| 亚洲一区二区三区在线观看蜜桃 | 亚洲中文字幕无码一去台湾| 国产嫩草影院精品免费网址| 国内精品99亚洲免费高清| 亚洲国产成人手机在线电影bd| 国产在线观看免费完整版中文版 | 亚洲午夜久久久影院| 亚洲国产精品免费在线观看| 亚洲午夜精品久久久久久app | 日韩精品无码永久免费网站| 久久久久亚洲AV片无码| 免费看少妇作爱视频| 久久伊人免费视频| 最新亚洲人成无码网站| 亚洲免费在线播放|