jeecms加载首页的过程

< src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"> 刚开始研究jeecms的时候很纳闷,找不到首页的加载页面。。经过一番仔细研究,发现这个加载还是经过了很多曲折的过程的。整个程序的架构师 ssh+freemarker模板构成的,所以先要熟悉freemarker模板技术。

先看web.xml文件,其中欢迎页面有:

1. <welcome-file-list>  
2.     <welcome-file>index.jspa</welcome-file>  
3.     <welcome-file>index.do</welcome-file>  
4.     <welcome-file>index.html</welcome-file>  
5. </welcome-file-list>  



接着再看jeecms/core/struts-core-front.xml配置文件,发现有个 action的通用配置:


1. <action name="**" class="core.dynamicSystemAct">  
2.             <result type="chain">  
3.                 <param name="namespace">${namespace}</param>  
4.                 <param name="actionName">${actionName}</param>  
5.             </result>  
6.             <interceptor-ref name="exception"/>  
7.             <interceptor-ref name="domain"/>  
8.             <interceptor-ref name="cookieIdentity"/>  
9.             <interceptor-ref name="url"/>  
10.         </action>       



struts收到请求以后,将请求转发到core.dynamicSystemAct这个对象,注意这个这个class并不是真正的类,是类的别名,由spring通过标注@Controller进行绑定,web应用上下文可以通过 classpath自动扫描到这个类。


1. @Controller("core.dynamicSystemAct")  
2. public class DynamicSystemAct   


在这个action执行之前,先要执行好几个拦截器。其他struts和webwork 自带的拦截器不必说,主要说一下在程序里面自定义的几个比较重要的拦截器(定义在jeecms/src/struts-default.xml文件中)。

DomainNameInterceptor

UrlInterceptor

CookieIdentityInterceptor

然后执行action自己的execute方法,产生 2个参数:

namespace = "/jeedynamic/" + sys;

actionName = "Page";

这2个参数决定了程序的走向,组成转发路径:/jeedynamic /jeecms/Page.do,然后通过查找下面的配置信息

1. <package name="cms.front.page" namespace="/jeedynamic/jeecms" extends="empty-default">          
2.     <action name="Page" class="cms.cmsPageAct">  
3.         <result>${tplPath}</result>  
4.         <result name="pageCache" type="pageCache">${tplPath}</result>  
5.         <interceptor-ref name="exception"/>  
6.         <interceptor-ref name="chain"/>  
7.     </action>  
8. </package>  


注:其他的请求过程类似,先找到命名空间,然后找到对应的 acting进行处理。

将请求转发给cms.cmsPageAct对象,同上的道理,对应到控制器:com.jeecms.cms.action.front.CmsPageAct。拦截器处理完毕后,执行自己的 execute方法,判断若是首页,则执行sysIndex()方法,返回一个模板路径tplPath:/WEB-INF/user_base/jeecms_com_www/template /article/default/index.html,找到这个文件,是文章对应的首页模板,里面有自定义的freemarker标签@cms,定义在配置文件freemarker.properties中:

auto_import="/WEB-INF/ftl_lib/ponyjava.com/index.ftl" as p, "/WEB-INF/ftl_lib/jeecms/index.ftl" as cms

@cms标签所用的ftl模板文件为index.ftl。 打开index.ftl文件,includes了多个ftl,其中有action_cms.ftl,该文件用标签#macro,自定义许多directive:ChnlList和CommentList 等。里面使用struts2标签@s.action来请求数据,整个的index.html页面就是这么加载出来的。通过 freemarker引擎来解析数据模型,最后显示到前台,展现给客户。


index.html include head.html

[@cms.ChnlList id='' inner='1';c]<li class="thisclass"><a href="${c.url}">${c.name}</a></li>[/@cms.ChnlList]


对应action_cms.ftl中macro ChnList 定义, 使用strusts标签 action
<@s.action name='ChnlListInner' namespace='/jeecms/tag/cms'>

在struts-front.xml中找到对应的class="cms.chnlPartAct".


private Pagination tagChnlList() {
list = cmsChannelMng.getChild(getWebId(), sysType, chnlId, orderBy,
isDisplay == 1 ? true : false, hasContent == 1 ? true : false,
firstResult, count);
pagination = new Pagination(pageNo, count, list.size(), list);
return pagination;
}

CmsChannelMng--> CmsChannelMngImpl-->BaseManagerImpl-->BaseDao-->BaseDaoImpl




待整理:

如页面跳到action: article.articleAct

list()将取出对应的文章

pagination = articleMng.getRightArticle(getWebId(), chnlId,
getAdminId(), queryInputAdminId, queryContentCtgId,
queryDisabled, queryTopTime, queryTopLevel, queryStatus,
queryTitle, queryOrder, pageNo, getCookieCount());

(freemarker macro对应参数)

最终掉到 ArticleDaoImpl.

public Pagination getRightArticle(Long webId, Long chnlId, Long adminId,
Long inputAdminId, Long contentCtgId, boolean disabled,
boolean topTime, int topLevel, int status, String title, int order,
int pageNo, int pageSize)

你可能感兴趣的:(jeecms加载首页的过程)