MainServlet中,当初始化Theme结束之后,就开始初始化站点设置了,
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize web settings");
- }
- try {
- initWebSettings();
- }
- ..
它会去调用initWebSettings()方法:
- protected void initWebSettings() throws Exception {
- ServletContext servletContext = getServletContext();
- String xml = HttpUtil.URLtoString(
- servletContext.getResource("/WEB-INF/web.xml"));
- checkWebSettings(xml);
- }
其本质就是去读取web.xml中的一些配置信息,我们跟进到checkWebSettings()方法中,发现它主要做了和session 相关的设置:
首先,它去获取服务器中配置的session超时值(分钟):
- int timeout = PropsValues.SESSION_TIMEOUT;
这个值最终可以从portal.properties中获取:
- #
- # Specify the number of minutes before a session expires. This value is
- # always overridden by the value set in web.xml.
- #
- session.timeout=30
然后,它去获取web.xml中<session-config>元素配置的session超时值(分钟),并且,如果这里设置了值,则覆盖portal.properties中的设定:
- Element sessionConfig = root.element("session-config");
- if (sessionConfig != null) {
- String sessionTimeout = sessionConfig.elementText(
- "session-timeout");
- timeout = GetterUtil.getInteger(sessionTimeout, timeout);
- }
然后,它调用的代码是:
- I18nServlet.setLanguageIds(root);
我们跟进,发现它实际做的事情是从web.xml中的<servlet-mapping>中找到<servlet-name>为"I18n Servlet"的<url-pattern>,然后把这里所有的语言id提取出来,并且设置到I18nServlet的_languageIds 集合中:
- public static void setLanguageIds(Element root) {
- Iterator<Element> itr = root.elements("servlet-mapping").iterator();
- while (itr.hasNext()) {
- Element el = itr.next();
- String servletName = el.elementText("servlet-name");
- if (servletName.equals("I18n Servlet")) {
- String urlPattern = el.elementText("url-pattern");
- String languageId = urlPattern.substring(
- 0, urlPattern.lastIndexOf(CharPool.SLASH));
- _languageIds.add(languageId);
- }
- }
- _languageIds = Collections.unmodifiableSet(_languageIds);
- }
对照web.xml,我们就发现,这一步我们把所有的语言id都正确设置给I18nServlet了:
- ..
- <servlet-mapping>
- <servlet-name>I18n Servlet</servlet-name>
- <url-pattern>/ca_ES/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>I18n Servlet</servlet-name>
- <url-pattern>/cs/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>I18n Servlet</servlet-name>
- <url-pattern>/cs_CZ/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>I18n Servlet</servlet-name>
- <url-pattern>/de/*</url-pattern>
- </servlet-mapping>
- ..
然后,它调用的代码是:
- I18nFilter.setLanguageIds(I18nServlet.getLanguageIds());
这一步是吧所有的I18nServlet的语言id集合复制给I18nFilter,这样过滤器也可以过滤不同语言请求了。
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/907090,如需转载请自行联系原作者