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

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

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

    聶永的博客

    記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

    servlet 3.0筆記之servlet的動(dòng)態(tài)注冊

    說實(shí)話,對(duì)servlet 3動(dòng)態(tài)加載servlet的機(jī)制有些失望,本來期望著可以在運(yùn)行時(shí)完成對(duì)servlet的注冊和銷毀,但現(xiàn)狀是,只能在webapp啟動(dòng)在初始化時(shí)進(jìn)行完成注冊,可能是為了安全考慮吧.
    在Servlet3.0中可以動(dòng)態(tài)注冊Servlet,Filter,Listener,在ServletContext對(duì)應(yīng)注冊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);
    每個(gè)組件注冊都提供三個(gè)方法,很細(xì)心。
    下面談?wù)剟?dòng)態(tài)注冊Servlet,但不要希望太高,只能在初始化時(shí)進(jìn)行注冊。在運(yùn)行時(shí)為了安全原因,無法完成注冊。在初始化情況下的注冊Servlet組件有兩種方法:
    1.實(shí)現(xiàn)ServletContextListener接口,在contextInitialized方法中完成注冊.
    2.在jar文件中放入實(shí)現(xiàn)ServletContainerInitializer接口的初始化器
    先說在ServletContextListener監(jiān)聽器中完成注冊。
        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文件,文件內(nèi)容為已經(jīng)實(shí)現(xiàn)ServletContainerInitializer接口的類:
    com.learn.servlet3.jardync.CustomServletContainerInitializer
    該實(shí)現(xiàn)部分代碼:
    @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,也可以包含應(yīng)用注解的servlet,具體怎么做,視具體環(huán)境而定。
    把處理某類事物的servlet組件打包成jar文件,有利于部署和傳輸,功能不要了,直接去除掉jar即可,方便至極!

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

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個(gè)人收藏

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 乱人伦中文视频在线观看免费| 99热这里只有精品6免费| 亚洲高清最新av网站| 亚洲免费视频一区二区三区| 91亚洲一区二区在线观看不卡| 噜噜嘿在线视频免费观看| 精品国产免费一区二区三区| 亚洲第一香蕉视频| 亚洲国产综合久久天堂| 久久国产色AV免费看| 西西人体大胆免费视频| 无码久久精品国产亚洲Av影片| 在线观看免费为成年视频| 热99RE久久精品这里都是精品免费 | 羞羞视频在线免费观看| 亚洲av无码一区二区三区乱子伦 | 久久精品免费一区二区| 黄色三级三级免费看| 亚洲男人天堂影院| 国产L精品国产亚洲区久久| 波多野结衣免费在线| 久久久久免费视频| 亚洲精品无码mⅴ在线观看| 亚洲AV人无码综合在线观看| 国产免费观看a大片的网站| 97免费人妻在线视频| 国产免费A∨在线播放| 亚洲中文字幕久久精品蜜桃| 亚洲AV综合色一区二区三区| 亚洲 国产 图片| 九九九精品成人免费视频| 久久精品国产大片免费观看| 一本久久免费视频| 亚洲第一成年免费网站| 亚洲成AV人片久久| 亚洲AV本道一区二区三区四区| 亚洲av午夜精品一区二区三区| 成人免费淫片在线费观看| 亚洲一区二区三区免费在线观看| 成年女人A毛片免费视频| 无人视频免费观看免费视频|