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

Tomcatѧϰ֮ContextConfig

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

ͬHostConfigÒ»Ñù£¬ContextConfigÒ²ÊÇÔÚDigester½âÎöserver.xmlµÄʱºòÌí¼Óµ½StandardContextÉϵļàÌýÆ÷£¬ContextConfigÖ÷ÒªÊÇ´¦ÀíwebÓ¦ÓõÄÅäÖÃÎļþ£¬ÏÈ¿´¿´ËüµÄinit·½·¨×öÁËÄÄЩÊ£¿

 


 
  1. protected void init() {  
  2.     // Called from StandardContext.init()  
  3.     Digester contextDigester = createContextDigester();  
  4.     contextDigester.getParser();  
  5.     if (log.isDebugEnabled())  
  6.         log.debug(sm.getString("contextConfig.init"));  
  7.     context.setConfigured(false);  
  8.     ok = true;  
  9.       
  10.     contextConfig(contextDigester);  
  11.       
  12.     createWebXmlDigester(context.getXmlNamespaceAware(),  
  13.             context.getXmlValidation());  
  14.   
  15.     try {  
  16.         fixDocBase();  
  17.     } catch (IOException e) {  
  18.         log.error(sm.getString(  
  19.                 "contextConfig.fixDocBase", context.getName()), e);  
  20.     }  
  21.       
  22. }  
1¡¢´¦ÀíContextµÄÁ½¸öĬÈÏÅäÖÃÎļþ£ºconf/context.xmlºÍ/conf/[enginename]/[hostname]/context.xml.default£¬½âÎöµ½contextÖУ»
2¡¢¶Ôwar°ü½øÐÐУÑ飺Ö÷ÒªÊÇУÑéĿ¼½á¹¹£¨ÊÇ·ñÓÐWEB-INFĿ¼£¬ÊÇ·ñÓÐclassesĿ¼ºÍMETA-INFĿ¼µÈ£©
3¡¢¶ÔÓÚûÓнâѹµÄÎļþ»¹»á½«Æä½âѹ£ºÊÇÔÚExpandWarÀàµÄexpand·½·¨ÖÐÍê³ÉµÄ
[java] view plaincopyprint?
 
  1. public static String expand(Host host, URL war, String pathname)  
  2.     throws IOException {  
  3.     ...  
  4.     // Expand the WAR into the new document base directory  
  5.     JarURLConnection juc = (JarURLConnection) war.openConnection();  
  6.     juc.setUseCaches(false);  
  7.     JarFile jarFile = null;  
  8.     InputStream input = null;  
  9.     boolean success = false;  
  10.     try {  
  11.         jarFile = juc.getJarFile();  
  12.         Enumeration<JarEntry> jarEntries = jarFile.entries();  
  13.         while (jarEntries.hasMoreElements()) {  
  14.             JarEntry jarEntry = jarEntries.nextElement();  
  15.             String name = jarEntry.getName();  
  16.             File expandedFile = new File(docBase, name);  
  17.             if (!expandedFile.getCanonicalPath().startsWith(  
  18.                     canonicalDocBasePrefix)) {  
  19.                //... throw exception  
  20.             }  
  21.             int last = name.lastIndexOf('/');  
  22.             if (last >= 0) {  
  23.                 File parent = new File(docBase,  
  24.                                        name.substring(0, last));  
  25.                 if (!parent.mkdirs() && !parent.isDirectory()) {  
  26.                     throw new IOException(  
  27.                             sm.getString("expandWar.createFailed", parent));  
  28.                 }  
  29.             }  
  30.             input = jarFile.getInputStream(jarEntry);  
  31.             expand(input, expandedFile);  
  32.             input.close();  
  33.     } catch (IOException e) {  
  34.         //  
  35.     } finally {  
  36.         //release resource  
  37.     }  
  38. }  

(1)¡¢½«warÎļþת»»³ÉjarEntries£¬²¢±éÀú
(2)¡¢Èç¹ûÔÚwebappsÍâÖ±½ÓÅ×Òì³£
(3)¡¢Èç¹ûΪĿ¼£¬¾ÍÔÚ¶ÔӦλÖô´½¨Ä¿Â¼£¬·ñÔò¾Í½«Îļþ¶ÁÈëinputÖУ¬µ÷ÓÃexpand(input, expandedFile·½·¨½«ÎļþÄÚÈÝcopyµ½½âѹºóµÄĿ¼ÖÐ

[java] view plaincopyprint?
 
  1. private static void expand(InputStream input, File file)  
  2.         throws IOException {  
  3.         BufferedOutputStream output = null;  
  4.         try {  
  5.             output =   
  6.                 new BufferedOutputStream(new FileOutputStream(file));  
  7.             byte buffer[] = new byte[2048];  
  8.             while (true) {  
  9.                 int n = input.read(buffer);  
  10.                 if (n <= 0)  
  11.                     break;  
  12.                 output.write(buffer, 0, n);  
  13.             }  
  14.         } finally {  
  15.             if (output != null) {  
  16.                 try {  
  17.                     output.close();  
  18.                 } catch (IOException e) {  
  19.                     // Ignore  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  

¾ÍÊÇÒ»¸öIO²Ù×÷£¬Ã¿´Î¶ÁÈ¡2kÊý¾Ýµ½ÎļþÖС£

˳×ÅÉúÃüÖÜÆÚ£¬initºó¾ÍÓ¦¸ÃÊÇconfigureStart£¬configureStart·½·¨ÖÐ×öµÄ×îÖØÒªµÄÒ»¼þʾÍÊÇÅäÖÃweb.xmlÎļþ£¬ÊµÏÖϸ½ÚÔÚwebConfigÖÐÍê³ÉµÄ£º
1¡¢É¨Ãè/META-INF/lib/Ŀ¼ÏµÄjarÎļþ£¬Èç¹ûÔÚMETA-INFϺ¬ÓÐweb-fragment.xmlÎļþ£¬½âÎöËü£»
2¡¢È·¶¨È·¶¨ÕâЩxmlƬ¶ÎµÄ˳Ðò,servlet 3.0¿ÉÒÔ½«ÅäÖÃÎļþ·ÖÉ¢ÔÚ¶à¸öjar°üÀïÃ棬¶øÇÒ»¹¿ÉÒÔ¶¨ÒåÕâЩÅäÖÃÎļþµÄ˳Ðò¡£·ÖΪ¾ø¶Ô˳ÐòºÍÏà¶Ô˳Ðò£¬¾ø¶Ô˳ÐòÊÇͨ¹ýabsolute-ordering±êÇ©¶¨ÒåµÄ
<web-app>  
<name>...</name>  
<absolute-ordering>  
<name>fragment1</name>  
<name>fragment2</name>  
</absolute-ordering>  
</web-app>  
»¹¿ÉÒÔÔÚweb-fragment.xmlÀïÃæͨ¹ýbefore,after±êÇ©À´¶¨ÒåÕâЩÅäÖÃÎļþµÄÏȺó˳Ðò£¬ÕâÀï²»ÔÙ¾ÙÀý
Õâ²½Ö÷ÒªÊǸù¾Ý˳Ðò£¬½«ÕâЩÅäÖÃÎļþ¼Óµ½¼¯ºÏorderedFragmentsÖÐ
3¡¢´¦ÀíServletContainerInitializersµÄʵÏÖÀ࣬ÕâÒ²ÊÇservlet 3.0ÐÂÔöµÄÌØÐÔ£¬ÈÝÆ÷ÔÚÆô¶¯Ê±Ê¹Óà JAR ·þÎñ API(JAR Service API) À´·¢ÏÖ ServletContainerInitializer µÄʵÏÖÀ࣬²¢ÇÒÈÝÆ÷½« WEB-INF/lib Ŀ¼Ï JAR °üÖеÄÀ඼½»¸ø¸ÃÀàµÄ onStartup() ·½·¨´¦Àí£¬ÎÒÃÇͨ³£ÐèÒªÔÚ¸ÃʵÏÖÀàÉÏʹÓà @HandlesTypes ×¢½âÀ´Ö¸¶¨Ï£Íû±»´¦ÀíµÄÀ࣬¹ýÂ˵ô²»Ï£Íû¸ø onStartup() ´¦ÀíµÄÀà¡£ÔÚonStartup·½·¨ÖпÉÒÔÓÅÏȼÓÔØÕâЩÀ࣬»òÕßÐÞ¸ÄÆäÖеķ½·¨µÈ¡£Õâ²½Ö÷ÒªÊÇ°ÑÕâЩÀàÕÒµ½·Åµ½Set<ServletContainerInitializer> scisÖУ»
4¡¢½«Ó¦ÓÃÖеÄweb.xmlÓëorderedFragments½øÐкϲ¢£¬ºÏ²¢ÔÚWebXmlÀàµÄmerge·½·¨ÖÐʵÏÖ
5¡¢½«Ó¦ÓÃÖеÄweb.xmlÓëÈ«¾ÖµÄweb.xmlÎļþ£¨conf/web.xmlºÍweb.xml.default£©½øÐкϲ¢
6¡¢Óúϲ¢ºÃµÄWebXmlÀ´ÅäÖÃContext£¬ÕâÒ»²½ÔÚ´¦Àíservletʱ£¬»áΪÿ¸öservlet´´½¨Ò»¸öwrapper£¬²¢µ÷ÓÃaddChild½«Ã¿¸öwrapper×÷Ϊcontext×ÓÈÝÆ÷,ºóÐø·ÖÎö
ÏÂÃæ¼òµ¥Á˽âÒ»ÏÂWebXmlµÄmerge·½·¨µÄʵÏÖ£¬WebXmlÀàÊÇweb.xmlÅäÖÃÎļþÀ࣬ÀïÃæ°üº¬web.xmlµÄËùÓбêÇ©£¬ÔÚËüÀïÃæά»¤ÁËÕâЩ±êÇ©µÄ˳Ðò£¬merge·½·¨ÊµÏÖÈçÏ£º

 

[java] view plaincopyprint?
 
  1. public boolean merge(Set<WebXml> fragments) {  
  2.     // As far as possible, process in alphabetical order so it is easy to  
  3.     // check everything is present  
  4.       
  5.     // Merge rules vary from element to element. See SRV.8.2.3  
  6.   
  7.     WebXml temp = new WebXml();  
  8.   
  9.     for (WebXml fragment : fragments) {  
  10.         if (!mergeMap(fragment.getContextParams(), contextParams,  
  11.                 temp.getContextParams(), fragment, "Context Parameter")) {  
  12.             return false;  
  13.         }  
  14.     }  
  15.     contextParams.putAll(temp.getContextParams());  
  16.     ...  
  17. }     

 

 

[java] view plaincopyprint?
 
  1. private static <T> boolean mergeMap(Map<String,T> fragmentMap,  
  2.         Map<String,T> mainMap, Map<String,T> tempMap, WebXml fragment,  
  3.         String mapName) {  
  4.     for (Entry<String, T> entry : fragmentMap.entrySet()) {  
  5.         final String key = entry.getKey();  
  6.         if (!mainMap.containsKey(key)) {  
  7.             // Not defined in main web.xml  
  8.             T value = entry.getValue();  
  9.             if (tempMap.containsKey(key)) {  
  10.                 if (value != null && !value.equals(  
  11.                         tempMap.get(key))) {  
  12.                     log.error(sm.getString(  
  13.                             "webXml.mergeConflictString",  
  14.                             mapName,  
  15.                             key,  
  16.                             fragment.getName(),  
  17.                             fragment.getURL()));  
  18.                     return false;  
  19.                 }  
  20.             } else {  
  21.                 tempMap.put(key, value);  
  22.             }  
  23.         }  
  24.     }  
  25.     return true;  
  26. }  
»ù±¾ÉÏÿ¸ö±êÇ©¶¼ÊÇ°´ÉÏÃæµÄÀý×Ӻϲ¢µÄ£¬¼òµ¥ËµÒ»ÏÂÕâ¸öËã·¨:

 

ÓÐÁ½¸ömap£ºmapA,mapB,Òª½«mapAÖÐÓеÄÔÚmapBÖÐûÓеÄÔªËؼӵ½mapBÖУ¬ËüµÄ×ö·¨ÊDZéÀúmapA,Èç¹ûûÓÐÔÚmapBÖоͽ«Æä·ÅÈëtmpMapÖУ¬Ñ­»·ÍêºómapB.putAll(tmpMap).

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