Liferay 启动过程分析2-进入MainServlet

上文中说到了,在启动Liferay应用时,吧请求发送到了http://localhost:8080/c。

对于这个请求,我们去ROOT下的web.xml去查找匹配的URL:


  1. .. 
  2. <servlet-mapping> 
  3.         <servlet-name>Main Servlet</servlet-name> 
  4.         <url-pattern>/c/*</url-pattern> 
  5.     </servlet-mapping> 
  6. .. 

 

所以它进入了Main Servlet中,这才是Liferay框架的入口点:


  1. .. 
  2. <servlet> 
  3.         <servlet-name>Main Servlet</servlet-name> 
  4.         <servlet-class>com.liferay.portal.servlet.MainServlet</servlet-class> 
  5.         <init-param> 
  6.             <param-name>config</param-name> 
  7.             <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-ext.xml</param-value> 
  8.         </init-param> 
  9.         <init-param> 
  10.             <param-name>debug</param-name> 
  11.             <param-value>0</param-value> 
  12.         </init-param> 
  13.         <init-param> 
  14.             <param-name>detail</param-name> 
  15.             <param-value>0</param-value> 
  16.         </init-param> 
  17.         <load-on-startup>0</load-on-startup> 
  18.     </servlet> 
  19.  
  20. .. 

我们去看下这个类,这个类很大,有1000多行。

 

MainServlet是继承自Struts框架的ActionServlet的,用过Struts框架的人都知道它是Struts的MVC模型的*控制器,用于接受来自用户的请求,然后把请求发送到相应的Action中进行处理。这里不具体展开了,至少,它会去读取/WEB-INF/struts-config.xml:


  1. config = "/WEB-INF/struts-config.xml"

这个文件在ROOT应用下可以找到,有很多种映射,我们没必要吧这些映射都研究一遍,只要具体请求来了到这个文件中找到匹配的然后具体分析就可以。

 

在处理具体请求之前,MainServlet肯定已经执行完了init()方法,撇开struts框架的init()方法,我们看下MainServlet自己特有的init()方法:


  1. @Override 
  2.     public void init() throws ServletException { 
  3.         if (_log.isDebugEnabled()) { 
  4.             _log.debug("Initialize"); 
  5.         } 
  6.  
  7.         ServletContext servletContext = getServletContext(); 
  8.  
  9.         callParentInit(); 
  10.  
  11.         .. 
  12.         try { 
  13.             processStartupEvents(); 
  14.         } 
  15.         .. 
  16.         if (_log.isDebugEnabled()) { 
  17.             _log.debug("Initialize servlet context pool"); 
  18.         } 
  19.  
  20.         try { 
  21.             initServletContextPool(); 
  22.         } 
  23.         .. 
  24.         if (_log.isDebugEnabled()) { 
  25.             _log.debug("Initialize plugin package"); 
  26.         } 
  27.  
  28.         PluginPackage pluginPackage = null
  29.  
  30.         try { 
  31.             pluginPackage = initPluginPackage(); 
  32.         } 
  33.         .. 
  34.         if (_log.isDebugEnabled()) { 
  35.             _log.debug("Initialize portlets"); 
  36.         } 
  37.  
  38.         List<Portlet> portlets = null
  39.  
  40.         try { 
  41.             portlets = initPortlets(pluginPackage); 
  42.         } 
  43.        ..
  44.  
  45.         if (_log.isDebugEnabled()) { 
  46.             _log.debug("Initialize layout templates"); 
  47.         } 
  48.  
  49.         try { 
  50.             initLayoutTemplates(pluginPackage, portlets); 
  51.         } 
  52.        .. 
  53.  
  54.         if (_log.isDebugEnabled()) { 
  55.             _log.debug("Initialize social"); 
  56.         } 
  57.  
  58.         try { 
  59.             initSocial(pluginPackage); 
  60.         } 
  61.        ..
  62.  
  63.         if (_log.isDebugEnabled()) { 
  64.             _log.debug("Initialize themes"); 
  65.         } 
  66.  
  67.         try { 
  68.             initThemes(pluginPackage, portlets); 
  69.         } 
  70.        ..
  71.  
  72.         if (_log.isDebugEnabled()) { 
  73.             _log.debug("Initialize web settings"); 
  74.         } 
  75.  
  76.         try { 
  77.             initWebSettings(); 
  78.         } 
  79.        .. 
  80.  
  81.         if (_log.isDebugEnabled()) { 
  82.             _log.debug("Initialize extension environment"); 
  83.         } 
  84.  
  85.         try { 
  86.             initExt(); 
  87.         } 
  88.         .. 
  89.  
  90.         if (_log.isDebugEnabled()) { 
  91.             _log.debug("Process global startup events"); 
  92.         } 
  93.  
  94.         try { 
  95.             processGlobalStartupEvents(); 
  96.         } 
  97.        .. 
  98.  
  99.         if (_log.isDebugEnabled()) { 
  100.             _log.debug("Initialize resource actions"); 
  101.         } 
  102.  
  103.         try { 
  104.             initResourceActions(portlets); 
  105.         } 
  106.     .. 
  107.  
  108.         if (_log.isDebugEnabled()) { 
  109.             _log.debug("Initialize resource codes"); 
  110.         } 
  111.  
  112.         try { 
  113.             initResourceCodes(portlets); 
  114.         } 
  115.         .. 
  116.  
  117.         if (_log.isDebugEnabled()) { 
  118.             _log.debug("Initialize companies"); 
  119.         } 
  120.  
  121.         try { 
  122.             initCompanies(); 
  123.         } 
  124.         .. 
  125.  
  126.         if (_log.isDebugEnabled()) { 
  127.             _log.debug("Initialize plugins"); 
  128.         } 
  129.  
  130.         try { 
  131.             initPlugins(); 
  132.         } 
  133.         .. 
  134.  
  135.         servletContext.setAttribute(WebKeys.STARTUP_FINISHED, true); 
  136.     } 

这里我们看出MainServlet在启动Struts*控制器之后还做了很多事情,这些事情都是这个Liferay框架所特有的,我们用算年终奖的方式清算出它的所有贡献:

 

 

处理启动事件:processStartupEvents();

 初始化servlet上下文池:initServletContextPool();

 初始化插件包:initPluginPackage();

初始化Portlets: initPortlets(pluginPackage);

 初始化布局模板:initLayoutTemplates(pluginPackage, portlets);

 初始化社交: initSocial(pluginPackage);

初始化主题: initThemes(pluginPackage, portlets);

 初始化站点设置:initWebSettings();

初始化Extension environment: initExt();

 处理全局启动事件:processGlobalStartupEvents();

 初始化resource actionsinitResourceActions(portlets);

 初始化resource codes: initResourceCodes(portlets);

初始化公司信息:initCompanies();

初始化插件:initPlugins();

 

 

我们下面会依次说这些步骤




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

上一篇:业界大佬热议 云计算如何实现安全落地


下一篇:Java中的HashCode(2)之Hashset造成的内存泄露