Liferay 启动过程分析4-初始化Servlet上下文池

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

 我们回到MainServlet类的init()方法中,在执行processStartupEvents()之后,我们开始初始化Servlet上下文池:

 
 
  1. if (_log.isDebugEnabled()) { 
  2.             _log.debug("Initialize servlet context pool"); 
  3.         } 
  4.  
  5.         try { 
  6.             initServletContextPool(); 
  7.         } 
  8.         catch (Exception e) { 
  9.             _log.error(e, e); 
  10.         } 

它会调用以下方法:

 
 
  1. protected void initServletContextPool() throws Exception { 
  2.         ServletContext servletContext = getServletContext(); 
  3.  
  4.         String contextPath = PortalUtil.getPathContext(); 
  5.  
  6.         ServletContextPool.put(contextPath, servletContext); 
  7.     } 

首先,它获取Servlet上下文对象,然后它去取得contextPath.这个字符串是通过PortalUtil.getPathContext()获得,进而调用PortalImpl的getPathContext()方法:

 
 
  1. public String getPathContext() { 
  2.     return _pathContext; 

这个值设置在PortalImpl类的构造器中,我们将其解析出来:

 
 
  1. .. 
  2. // Paths 
  3. _pathProxy = PropsValues.PORTAL_PROXY_PATH; 
  4. _pathContext = ContextPathUtil.getContextPath(PropsValues.PORTAL_CTX); 
  5. _pathContext = _pathProxy.concat(_pathContext); 
  6. .. 

 

解析_pathProxy=PropsValues.PORTAL_PROXY_PATH:

这个值最终定义在portal.properties中:

 
 
  1.    # Set this property if the application server is served behind a proxy and 
  2.    # a prefix needs to be added to the portal servlet context path. This prefix 
  3.    # will also be added to static resources served by layout templates, 
  4.    # portlets, and themes. 
  5.    # 
  6.    portal.proxy.path= 

 

解析_pathContext=ContextPathUtil.getContextPath(PropsValues.PORTAL_CTX): 

先找到PropsValues.PORTAL_CTX的取值,很容易发现它最终定义在portal.properties中:

 
 
  1.   # Specify the path of the portal servlet context. This is needed because 
  2.   # javax.servlet.ServletContext did not have access to the context path until 
  3.   # Java EE 5. 
  4.   # 
  5.   # Set this property if you deploy the portal to another path besides root. 
  6.   # 
  7.   portal.ctx=/ 

然后,我们来解析 ContextPathUtil.getContextPath("/"):

对应解析代码为:

 
 
  1. public static String getContextPath(String contextPath) { 
  2.         contextPath = GetterUtil.getString(contextPath); 
  3.  
  4.         if ((contextPath.length() == 0) || 
  5.             contextPath.equals(StringPool.SLASH)) { 
  6.  
  7.             contextPath = StringPool.BLANK; 
  8.         } 
  9.         else if (!contextPath.startsWith(StringPool.SLASH)) { 
  10.             contextPath = StringPool.SLASH.concat(contextPath); 
  11.         } 
  12.  
  13.         return contextPath; 
  14.     } 

先看02行,它调用GetterUtil的getString方法:

 
 
  1. public static String getString(String value) { 
  2.     return getString(value, DEFAULT_STRING); 

最终调用的代码为:

 
 
  1. public static String get(String value, String defaultValue) { 
  2.     if (value == null) { 
  3.         return defaultValue; 
  4.     } 
  5.  
  6.     value = value.trim(); 
  7.  
  8.     if (value.indexOf(CharPool.RETURN) != -1) { 
  9.         value = StringUtil.replace( 
  10.             value, StringPool.RETURN_NEW_LINE, StringPool.NEW_LINE); 
  11.     } 
  12.  
  13.     return value; 

所以,他没有进入任何判断,直接返回"/",

然后我们看03行:

可以发现它匹配contextPath.equals(StringPool.SLASH)),所以最终执行 contextPath = StringPool.BLANK, 也就是把contextPath设为空串。

它就是_pathContext的值。

 

解析_pathContext = _pathProxy.concat(_pathContext); 

因为我们_pathProxy为空,而_pathContext也为空,所以最终结果_pathContext为空。

 

最终,我们在MainServlet的initServletContextPool方法中执行以下语句:

 
 
  1. ServletContextPool.put(contextPath, servletContext); 

它就是在ServletContextPool中添加一个key-value对,于是就完成了ServletContextPool的初始化。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/906005,如需转载请自行联系原作者

目录
相关文章
|
应用服务中间件 容器
分析servlet最深层的源码读懂servlet如何实现
分析servlet最深层的源码读懂servlet如何实现
63 0
|
6月前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
104 3
|
6月前
|
Java 应用服务中间件 数据库连接
Spring5源码(51)-Servlet知识点回顾以及SpringMVC分析入口
Spring5源码(51)-Servlet知识点回顾以及SpringMVC分析入口
65 0
|
小程序 Java 应用服务中间件
动态 WEB 开发核心-Servlet详细分析
动态 WEB 开发核心-Servlet详细分析
52 0
|
XML 应用服务中间件 Linux
从源码分析tomcat如何调用Servlet的初始化
从源码分析tomcat如何调用Servlet的初始化
286 0
从源码分析tomcat如何调用Servlet的初始化
|
设计模式 安全 Java
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
168 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
|
XML Java 数据格式
【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]
了解【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]。
146 0
【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]
|
容器 API
第一个Servlet程序及分析
第一个Servlet程序: 1 package cc.openhome; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.
753 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
33 3