µ±Ç°Î»ÖÃ: > Linux·þÎñÆ÷ > Tomcat >

Tomcatѧϰ֮Wrapper

ʱ¼ä:2014-12-30 13:26À´Ô´:linux.it.net.cn ×÷Õß:IT

Wrapper ´ú±íÒ»¸ö Servlet£¬Ëü¸ºÔð¹ÜÀíÒ»¸ö Servlet£¬°üÀ¨µÄ Servlet µÄ×°ÔØ¡¢³õʼ»¯¡¢Ö´ÐÐÒÔ¼°×ÊÔ´»ØÊÕ¡£ËüµÄ¸¸ÈÝÆ÷Ò»°ãÊÇContext£¬Wrapper ÊÇ×îµ×²ãµÄÈÝÆ÷£¬ËüûÓÐ×ÓÈÝÆ÷ÁË£¬ËùÒÔµ÷ÓÃËüµÄ addChild ½«»áÅ×illegalargumentexception¡£Wrapper µÄʵÏÖÀàÊÇ StandardWrapper£¬StandardWrapper »¹ÊµÏÖÁËÓµÓÐÒ»¸ö Servlet ³õʼ»¯ÐÅÏ¢µÄ ServletConfig£¬ÓÉ´Ë¿´³ö StandardWrapper ½«Ö±½ÓºÍ Servlet µÄ¸÷ÖÖÐÅÏ¢´ò½»µÀ¡£

ÔÚStandardContextÆô¶¯Ê±£¬¶ÁÈ¡web.xmlÅäÖÃÎļþ£¬ÅäÖÃContextÖ®ºó£¬½ô½Ó×ÅÆô¶¯ContextµÄһЩ¸½Êô×é¼þ£¬³ý´ËÒÔÍ⻹¼ÓÔØÁËÄÇЩ±ê¼ÇΪ"load on start"µÄÄÇЩwrapper

[java] view plaincopyprint?
 
  1. // Load and initialize all "load on startup" servlets  
  2. if (ok) {  
  3.     loadOnStartup(findChildren());  
  4. }  
[java] view plaincopyprint?
 
  1. public void loadOnStartup(Container children[]) {  
  2.   
  3.        // Collect "load on startup" servlets that need to be initialized  
  4.        TreeMap<Integer, ArrayList<Wrapper>> map =  
  5.            new TreeMap<Integer, ArrayList<Wrapper>>();  
  6.        for (int i = 0; i < children.length; i++) {  
  7.            Wrapper wrapper = (Wrapper) children[i];  
  8.            int loadOnStartup = wrapper.getLoadOnStartup();  
  9.            if (loadOnStartup < 0)  
  10.                continue;  
  11.            Integer key = Integer.valueOf(loadOnStartup);  
  12.            ArrayList<Wrapper> list = map.get(key);  
  13.            if (list == null) {  
  14.                list = new ArrayList<Wrapper>();  
  15.                map.put(key, list);  
  16.            }  
  17.            list.add(wrapper);  
  18.        }  
  19.   
  20.        // Load the collected "load on startup" servlets  
  21.        for (ArrayList<Wrapper> list : map.values()) {  
  22.            for (Wrapper wrapper : list) {  
  23.                try {  
  24.                    wrapper.load();  
  25.                } catch (ServletException e) {  
  26.                    getLogger().error(sm.getString("standardWrapper.loadException",  
  27.                                      getName()), StandardWrapper.getRootCause(e));  
  28.                    // NOTE: load errors (including a servlet that throws  
  29.                    // UnavailableException from tht init() method) are NOT  
  30.                    // fatal to application startup  
  31.                }  
  32.            }  
  33.        }  
  34.   
  35.    }  

Õâ¸ö·½·¨×öÁËÁ½¼þÊ£º

1¡¢±éÀúÕâЩwrapper,½«Æä·ÅÈëÒ»¸ömapÖС£keyΪÆô¶¯Ë³Ðò£¬valueÊÇͬһÆô¶¯Ë³ÐòµÄservlet list£¬ÎªÁ˱£»¤Êý×ÖСµÄÏÈÆô¶¯£¬ÕâÀïÓÃÁËtreemapÕâÖÖÊý¾Ý½á¹¹À´´æ´¢£»

2¡¢±éÀúÕâ¸ömap£¬ÒÀ´Î¼ÓÔضÔÓ¦listÖеĸ÷¸öwrapper¡£ÓÉÓÚ²ÉÓõÄÊÇarrayList£¬ËùÒÔÏàͬ"load on start"Öµ¿¿Ç°µÄÏȼÓÔØ

ÏÂÃæÀ´¿´¿´StandardWrapperµÄload·½·¨£¬Ö±½Óµ÷ÓÃÁËloadServlet·½·¨À´³õʼ»¯
[java] view plaincopyprint?
 
  1. public synchronized void load() throws ServletException {  
  2.        instance = loadServlet();  
  3.          
  4.        if (!instanceInitialized) {  
  5.            initServlet(instance);  
  6.        }  
  7.   
  8.        if (isJspServlet) {  
  9.            StringBuilder oname =  
  10.                new StringBuilder(MBeanUtils.getDomain(getParent()));  
  11.              
  12.            oname.append(":type=JspMonitor,name=");  
  13.            oname.append(getName());  
  14.              
  15.            oname.append(getWebModuleKeyProperties());  
  16.              
  17.            try {  
  18.                jspMonitorON = new ObjectName(oname.toString());  
  19.                Registry.getRegistry(nullnull)  
  20.                    .registerComponent(instance, jspMonitorON, null);  
  21.            } catch( Exception ex ) {  
  22.                log.info("Error registering JSP monitoring with jmx " +  
  23.                         instance);  
  24.            }  
  25.        }  
  26.    }  
[java] view plaincopyprint?
 
  1.  private synchronized void initServlet(Servlet servlet)throws ServletException {  
  2.      if (instanceInitialized && !singleThreadModel) return;  
  3.      // Call the initialization method of this servlet  
  4.      try {  
  5.         instanceSupport.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT, servlet);  
  6. if (Globals.IS_SECURITY_ENABLED) {  
  7.     Object[] args = new Object[] { (facade) };  
  8.     SecurityUtil.doAsPrivilege("init", servlet, classType, args);  
  9.     args = null;  
  10. else {  
  11.     servlet.init(facade);  
  12. }  
  13.   
  14. instanceInitialized = true;  
  15. instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT, servlet);  
  16.      } catch (UnavailableException f) {  
  17. //handle exception  
  18.      }  
  19.  }  
ʵ¼ÊÉÏÊǵ÷ÓÃÁËservletµÄinit·½·¨£¬ÕâÒѾ­ÊÇservletµÄ´úÂëÁË£¬ÕâÀï²»ÔÙ·ÖÎö¡£

Ç°ÃæÌáµ½µÄservletµÄ¼ÓÔØÖ»ÊDZ»±êʶΪ“load on start”µÄÄÇЩservlet£¬ÄÇôÆäËûservletÊÇÔÚʲôʱºò±»¼ÓÔصÄÄØ£¿Ñ¡ÖÐStandardWrapperµÄinitServlet·½·¨£¬ÔÚeclipseÖв鿴Æäµ÷Óòã´ÎÈçÏ£º

»á·¢ÏÖÓиöallocate·½·¨¼ä½Óµ÷ÓÃÁËËü£¬ÕâÀï¸ø³öÇëÇó½øÈëwrapperÖ®ºóµÄ·½·¨µ÷ÓÃʱÐòͼ£º

¿ÉÒÔ¿´³öÔÚÇëÇó½øÈëwrapperÖ®ºó£¬Í¨¹ýallocate·½·¨´ÓʵÀý³ØÕ»Öе¯³öÒ»¸öservletʵÀýÀ´´¦ÀíÕâ¸öÇëÇó£¬servletʵÀý±»·â×°³ÉfilterChain¶ÔÏ󣬽ô½Ó×Åͨ¹ýһϵÁеĹýÂËÆ÷¹ýÂ˵½´ïservlet.service()·½·¨£¬ÕâÊÇsingleThreadModelģʽµÄ×ö·¨¡£ÔÚ·ÇsingleThreadModelģʽµÄÇé¿öÏÂÊ״μÓÔز¢³õʼʼ»¯servlet¸³¸øinstance×ֶΣ¬Ï´ÎÖ±½Ó´ÓÕâ¸ö×Ö¶ÎÖлñÈ¡servletʵÀý£¬Òò´ËÔÚ·ÇsingleThreadModelģʽÏÂÿ´Î·µ»ØµÄÊÇͬһ¸öservletʵÀý¡£ÓйØsingleThreadModelµÄ¾ßÌå½éÉܲο¼£ºhttp://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/SingleThreadModel.html

(ÔðÈα༭£ºIT)
------·Ö¸ôÏß----------------------------
À¸Ä¿Áбí
ÍƼöÄÚÈÝ