上文中说到了,在启动Liferay应用时,吧请求发送到了http://localhost:8080/c。
对于这个请求,我们去ROOT下的web.xml去查找匹配的URL:
- ..
- <servlet-mapping>
- <servlet-name>Main Servlet</servlet-name>
- <url-pattern>/c/*</url-pattern>
- </servlet-mapping>
- ..
所以它进入了Main Servlet中,这才是Liferay框架的入口点:
- ..
- <servlet>
- <servlet-name>Main Servlet</servlet-name>
- <servlet-class>com.liferay.portal.servlet.MainServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-ext.xml</param-value>
- </init-param>
- <init-param>
- <param-name>debug</param-name>
- <param-value>0</param-value>
- </init-param>
- <init-param>
- <param-name>detail</param-name>
- <param-value>0</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
- ..
我们去看下这个类,这个类很大,有1000多行。
MainServlet是继承自Struts框架的ActionServlet的,用过Struts框架的人都知道它是Struts的MVC模型的*控制器,用于接受来自用户的请求,然后把请求发送到相应的Action中进行处理。这里不具体展开了,至少,它会去读取/WEB-INF/struts-config.xml:
- config = "/WEB-INF/struts-config.xml";
这个文件在ROOT应用下可以找到,有很多种映射,我们没必要吧这些映射都研究一遍,只要具体请求来了到这个文件中找到匹配的然后具体分析就可以。
在处理具体请求之前,MainServlet肯定已经执行完了init()方法,撇开struts框架的init()方法,我们看下MainServlet自己特有的init()方法:
- @Override
- public void init() throws ServletException {
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize");
- }
- ServletContext servletContext = getServletContext();
- callParentInit();
- ..
- try {
- processStartupEvents();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize servlet context pool");
- }
- try {
- initServletContextPool();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize plugin package");
- }
- PluginPackage pluginPackage = null;
- try {
- pluginPackage = initPluginPackage();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize portlets");
- }
- List<Portlet> portlets = null;
- try {
- portlets = initPortlets(pluginPackage);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize layout templates");
- }
- try {
- initLayoutTemplates(pluginPackage, portlets);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize social");
- }
- try {
- initSocial(pluginPackage);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize themes");
- }
- try {
- initThemes(pluginPackage, portlets);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize web settings");
- }
- try {
- initWebSettings();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize extension environment");
- }
- try {
- initExt();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Process global startup events");
- }
- try {
- processGlobalStartupEvents();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize resource actions");
- }
- try {
- initResourceActions(portlets);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize resource codes");
- }
- try {
- initResourceCodes(portlets);
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize companies");
- }
- try {
- initCompanies();
- }
- ..
- if (_log.isDebugEnabled()) {
- _log.debug("Initialize plugins");
- }
- try {
- initPlugins();
- }
- ..
- servletContext.setAttribute(WebKeys.STARTUP_FINISHED, true);
- }
这里我们看出MainServlet在启动Struts*控制器之后还做了很多事情,这些事情都是这个Liferay框架所特有的,我们用算年终奖的方式清算出它的所有贡献:
处理启动事件:processStartupEvents();
初始化servlet上下文池:initServletContextPool();
初始化插件包:initPluginPackage();
初始化Portlets: initPortlets(pluginPackage);
初始化布局模板:initLayoutTemplates(pluginPackage, portlets);
初始化社交: initSocial(pluginPackage);
初始化主题: initThemes(pluginPackage, portlets);
初始化站点设置:initWebSettings();
初始化Extension environment: initExt();
处理全局启动事件:processGlobalStartupEvents();
初始化resource actions:initResourceActions(portlets);
初始化resource codes: initResourceCodes(portlets);
初始化公司信息:initCompanies();
初始化插件:initPlugins();
我们下面会依次说这些步骤