MainServlet中,当初始化Theme结束之后,就开始初始化站点设置了,

 
  
  1. if (_log.isDebugEnabled()) { 
  2.             _log.debug("Initialize web settings"); 
  3.         } 
  4.  
  5.         try { 
  6.             initWebSettings(); 
  7.         } 
  8. .. 

 

它会去调用initWebSettings()方法:

 
  
  1. protected void initWebSettings() throws Exception { 
  2.         ServletContext servletContext = getServletContext(); 
  3.  
  4.         String xml = HttpUtil.URLtoString( 
  5.             servletContext.getResource("/WEB-INF/web.xml")); 
  6.  
  7.         checkWebSettings(xml); 
  8.     } 

 

其本质就是去读取web.xml中的一些配置信息,我们跟进到checkWebSettings()方法中,发现它主要做了和session 相关的设置:

首先,它去获取服务器中配置的session超时值(分钟):

 
  
  1. int timeout = PropsValues.SESSION_TIMEOUT; 

这个值最终可以从portal.properties中获取:

 
  
  1.     # Specify the number of minutes before a session expires. This value is 
  2.     # always overridden by the value set in web.xml. 
  3.     # 
  4.     session.timeout=30 

 

然后,它去获取web.xml中<session-config>元素配置的session超时值(分钟),并且,如果这里设置了值,则覆盖portal.properties中的设定:

 
  
  1. Element sessionConfig = root.element("session-config"); 
  2.  
  3.         if (sessionConfig != null) { 
  4.             String sessionTimeout = sessionConfig.elementText( 
  5.                 "session-timeout"); 
  6.  
  7.             timeout = GetterUtil.getInteger(sessionTimeout, timeout); 
  8.         } 

 

然后,它调用的代码是:

 
  
  1. I18nServlet.setLanguageIds(root); 

我们跟进,发现它实际做的事情是从web.xml中的<servlet-mapping>中找到<servlet-name>为"I18n Servlet"的<url-pattern>,然后把这里所有的语言id提取出来,并且设置到I18nServlet的_languageIds 集合中:

 
  
  1. public static void setLanguageIds(Element root) { 
  2.         Iterator<Element> itr = root.elements("servlet-mapping").iterator(); 
  3.  
  4.         while (itr.hasNext()) { 
  5.             Element el = itr.next(); 
  6.  
  7.             String servletName = el.elementText("servlet-name"); 
  8.  
  9.             if (servletName.equals("I18n Servlet")) { 
  10.                 String urlPattern = el.elementText("url-pattern"); 
  11.  
  12.                 String languageId = urlPattern.substring( 
  13.                     0, urlPattern.lastIndexOf(CharPool.SLASH)); 
  14.  
  15.                 _languageIds.add(languageId); 
  16.             } 
  17.         } 
  18.  
  19.         _languageIds = Collections.unmodifiableSet(_languageIds); 
  20.     } 

对照web.xml,我们就发现,这一步我们把所有的语言id都正确设置给I18nServlet了:

 
  
  1. .. 
  2. <servlet-mapping> 
  3.         <servlet-name>I18n Servlet</servlet-name> 
  4.         <url-pattern>/ca_ES/*</url-pattern> 
  5.     </servlet-mapping> 
  6.     <servlet-mapping> 
  7.         <servlet-name>I18n Servlet</servlet-name> 
  8.         <url-pattern>/cs/*</url-pattern> 
  9.     </servlet-mapping> 
  10.     <servlet-mapping> 
  11.         <servlet-name>I18n Servlet</servlet-name> 
  12.         <url-pattern>/cs_CZ/*</url-pattern> 
  13.     </servlet-mapping> 
  14.     <servlet-mapping> 
  15.         <servlet-name>I18n Servlet</servlet-name> 
  16.         <url-pattern>/de/*</url-pattern> 
  17.     </servlet-mapping> 
  18. .. 

 

然后,它调用的代码是:

 
  
  1. I18nFilter.setLanguageIds(I18nServlet.getLanguageIds()); 

这一步是吧所有的I18nServlet的语言id集合复制给I18nFilter,这样过滤器也可以过滤不同语言请求了。