首页 cms3.0技术研究

cms3.0技术研究

举报
开通vip

cms3.0技术研究目录 一、    SpringMVC    2 1.    Servlet    2 1)    jeecmsAdmin    2 2)    jeecmsFront    2 3)    其余Servlet    2 2.    Filter    2 1)    osivFilter    2 3.    Controller    2 1)    @RequestMapping注解的使用    3 2)    返回值    3 3)    接受参数    4 4)    返回参数    5 5)    自动...

cms3.0技术研究
目录 一、    SpringMVC    2 1.    Servlet    2 1)    jeecmsAdmin    2 2)    jeecmsFront    2 3)    其余Servlet    2 2.    Filter    2 1)    osivFilter    2 3.    Controller    2 1)    @RequestMapping注解的使用    3 2)    返回值    3 3)    接受参数    4 4)    返回参数    5 5)    自动引入的ftl文件,昵称等    5 6)    前台地址,MessageResolver 转换模板对应的名称    6 7)    公用参数的设置FrontUtils    7 二、    freemarker    8 1.    公用标签    8 2.    自定义标签    8 1)    宏定义    8 2)    freemarker标签TemplateDirectiveModel    9 三、    CMS研究    10 3.    架构    10 1)    后台    10 2)    前台    11 3)    数据库    13 4)    缓存    15 5)    拦截器    16 4.    栏目管理    16 5.    全文检索    18 1)    初始化全文检索索引    18 2)    全文搜索页面    19 6.    前台动态html    19 7.    首次部署自动安装    19 8.    包结构    20 9.    小细节    22 一、 SpringMVC 1. Servlet jeecms中主要用了两个主要的DispatcherServlet,用来实现功能,分别是 1) jeecmsAdmin a) 主要用来处理后台逻辑用 b) 捕获“admin/*”类似的地址 2) JeeCmsFront c) 主要用来处理freemarker的标签 d) 前台逻辑,捕获jhtml,jspx,jsp,htm 3) 其余Servlet (不是SpringMVC)用来提供验证码、上传文件下载等 2. Filter 4) osivFilter 实现是org.springframework.orm.hibernate3.support.OpenSessionInViewFilter类 OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 或Interceptor的postHandle方法自动关闭session。 基本将所有请求的后缀都捕获了 3. Controller 一个类必须增加@Controller才能被spring识别为控制器。 5) @RequestMapping注解的使用 定义url访问路径,比如下面的地址,浏览器访问 “config/v_system_edit.do”,就会进入这一个方法,通过MVC的DispatcherServlet去控制访问地址 6) 返回值 对于方法的返回值,由于和freemarker进行了整合,需要查看对应servlet配置中freemarkerViewResolver中的配置 主要是定义返回的模板地址 模板地址由两部分构成,分别是上图中的相对路径,以及spring配置文件(jeecms-servlet-admin.xml)中的前缀地址,这个配置标志了springMVC返回路径以后,去哪里寻找对应的文件 7) 接受参数 springMVC的参数获取方式有三种 1. 通过注解的方式获取 a)  @RequestMapping+ @PathVariable。比如 @RequestMapping ("/start/{name}/{age}") public String start(@PathVariable("name") string name, @PathVariable("age") int age){ //和上面的对应return ;//方法体里面就可以直接获得参数 }   b) @RequestParam @RequestMapping(params="servlet=login")public String login(@RequestParam("username")String username, @RequestParam("password")String password, HttpServletRequest request, ModelMap map){//处理登录逻辑,省略return "success"; }   2. 默认参数,如果不加注解的话,方法的参数中会默认增加请求中的参数,并且名称一致。类型是推断出来的。如果参数缺少、参数类型转化错误,都会抛出异常。同时,可以自动对bean进行封装(getter,setter方法必须有)。 示例1 @RequestMapping("/guestbook/v_list.do") public String list(Integer queryCtgId, Boolean queryRecommend, Boolean queryChecked, Integer pageNo, HttpServletRequest request, ModelMap model) { CmsSite site = CmsUtils.getSite(request); Pagination pagination = manager.getPage(site.getId(), queryCtgId,null, queryRecommend, queryChecked, true, false, cpn(pageNo), CookieUtils.getPageSize(request)); model.addAttribute("pagination", pagination); model.addAttribute("pageNo", pagination.getPageNo()); return "guestbook/list"; } 示例2 @RequestMapping("/guestbook_ctg/o_save.do") public String save(CmsGuestbookCtg bean, HttpServletRequest request, ModelMap model) { WebErrors errors = validateSave(bean, request); if (errors.hasErrors()) { return errors.showErrorPage(model); } bean = manager.save(bean); log.info("save CmsGuestbookCtg id={}", bean.getId()); cmsLogMng.operating(request, "cmsGuestbookCtg.log.save", "id=" + bean.getId() + ";name=" + bean.getName()); return "redirect:v_list.do"; }   3. 通过request,方法中可以带上HttpServletRequest,自然可以对任何参数进行获取了。 8) 返回参数 通过model进行设置 示例1 ,见赤红色字体 @RequestMapping("/guestbook/v_list.do") public String list(Integer queryCtgId, Boolean queryRecommend, Boolean queryChecked, Integer pageNo, HttpServletRequest request, ModelMap model) { CmsSite site = CmsUtils.getSite(request); Pagination pagination = manager.getPage(site.getId(), queryCtgId,null, queryRecommend, queryChecked, true, false, cpn(pageNo), CookieUtils.getPageSize(request)); model.addAttribute("pagination", pagination); model.addAttribute("pageNo", pagination.getPageNo()); return "guestbook/list"; }   9) 自动引入的ftl文件,昵称等 后台会经常见到类似这样的标签: <@s.m 。。。/> <@p.text。。。/> 一开始看到会一头雾水,这个其实就是引入的ftl的昵称,类似namespace的隔离。 具体到配置文件中寻找答案 其实就是引入ftl文件,并且给了一个昵称。 这儿是自动引入的,不需要在html中明确的写入。 10) 前台地址,MessageResolver 转换模板对应的名称 CMS为了实现国际化,通过MessageResolver,基本上将后台的所有名词全部配置为了键值对。 具体获取的方式则是通过标签进行翻译的。<@s.m "global.position"/> 而判断Locale(地区)则采用Cookie进行,通过Servlet的基本配置可以看出来 同时,判断逻辑是在拦截器中进行配置的。 11) 公用参数的设置FrontUtils 前台主要的实现是通过 com.jeecms.cms.action.front.DynamicPageAct 类作为主要实现的。对于前台部分公用的功能,比如设置res变量,设置基础路径,分页等功能,则是通过 com.jeecms.cms.web.FrontUtils 进行实现的 二、 freemarker 4. 公用标签 1. ${…}取值 2. <#...>ftl标签 3. <@...>宏,自定义标签 4. <#-- Comments 注释--> 5. [#...], [@...] 参见《深入浅出FreeMarker教程》,在总体设计参考资料之中。 5. 自定义标签 12) 宏定义 FreeMarker定义的标签主要分为两大部分,分别是spring.ftl,以及ui相关的ftl Spring.ftl是主要是从jar包中拷贝出来的。CMS自己编写的主要是pony文件夹中针对 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 单提交用的ftl。 自定义标签其实就是freemarker中的宏。<#macro 语法。 举例:ftl/pony/ui/button.ftl(部分) <#-- --> <#macro button 宏开始,其实就是由原始标签组成的一段预定义代码。 value="" code="" id="" name="" style="" size="" title="" disabled="" tabindex="" accesskey="" onclick="" ondblclick="" onmousedown="" onmouseup="" onmouseover="" onmousemove="" onmouseout="" onfocus="" onblur="" onkeypress="" onkeydown="" onkeyup="" onselect="" onchange="" > <#if value!=""> value="${value}"<#elseif code!=""> value="<@s.m code/>"<#rt/> <#if id!=""> id="${id}"<#rt/> <#include "common-attributes.ftl"/><#rt/> <#include "scripting-events.ftl"/><#rt/> /><#rt/>   13) freemarker标签TemplateDirectiveModel 这部分用来实现包含复杂逻辑的标签,具体方式如下: 1. 编写类继承TemplateDirectiveModel类,举例如下: public class PaginationDirective implements TemplateDirectiveModel { /** * 是否为内容分页。1:内容分页;0:栏目分页。默认栏目分页。 */ public static final String PARAM_CONTENT = "content"; @SuppressWarnings("unchecked") public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { CmsSite site = FrontUtils.getSite(env); String content = DirectiveUtils.getString(PARAM_CONTENT, params); if ("1".equals(content)) { String sysPage = DirectiveUtils.getString(PARAM_SYS_PAGE, params); String userPage = DirectiveUtils.getString(PARAM_USER_PAGE, params); if (!StringUtils.isBlank(sysPage)) { String tpl = TPL_STYLE_PAGE_CONTENT + sysPage + TPL_SUFFIX; env.include(tpl, UTF8, true); } else if (!StringUtils.isBlank(userPage)) { String tpl = getTplPath(site.getSolutionPath(), TPLDIR_STYLE_PAGE, userPage); env.include(tpl, UTF8, true); } else { // 没有包含分页 } } else { FrontUtils.includePagination(site, params, env); } } }   2. 在spring文件中进行配置 web/WEB-INF/config/jeecms-servlet-front.xml web/WEB-INF/config/jeecms-context.xml 3. 在页面进行引用,直接@方式 web/WEB-INF/t/cms/www/default/special/标签详情页.html 三、 CMS研究 6. 架构 CMS主要由两部分构成,一部分是后台管理,提供了网站必须的各种管理功能,另一部分是前台展现,主要可以通过配置进行展现。 14) 后台 后台提供的功能主要是管理功能。后台的首页主要是有双层菜单构成的。处于上方的是一级菜单,点击一级菜单,下面的页面会刷新,左边的二级菜单也会刷新。点击二级菜单,会刷新右下方的主要管理页面。 一级菜单只有一个:jeecms_sys/top.html 二级菜单每个模块一个,都处于jeecms_sys/frame文件夹下,命名 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 都是xxx_left.html。 15) 前台 a) 模板 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 CMS中有一个 ”模板方案” 的概念,就是说前台以那一套模板进行展示,如下图,页面 入口为:模板-》设置 当前的模板选用了jjyww这套。 模板方案字段存储在jc_site表中,对应字段为tpl_solution b) 表单映射 cms此处将原来jeecms中的模板页面由英文名字变更为中文名字。变更策略主要是通过jeecms_tpl/messages_zh_CN.properties来定义的 而在controller中,对这些模板的调用,也是通过key去引用的。 具体获取模板路径的代码如下: com.jeecms.cms.web.FrontUtils /** * 获得模板路径。将对模板文件名称进行本地化处理。 * * @param request * @param solution * 方案路径 * @param dir * 模板目录。不本地化处理。 * @param name * 模板名称。本地化处理。 * @return */ public static String getTplPath(HttpServletRequest request, String solution, String dir, String name) { return solution + "/" + dir + "/" + MessageResolver.getMessage(request, name) + TPL_SUFFIX; }   c) 分页 CMS中默认的分页结果页面是在如下位置的 除非自己制定,否则会使用这些配置的一部分,没有详细研究。 16) 数据库 CMS数据库设计主键采用了int类型,分别通过数据库以及hibernate实现了外键关系。数据库表中,有大量的一一映射设计。 cms栏目表设计举例: 表设计分析: 该设计表进行了高度的抽象化,主表中包含了最常用的属性,大部分文字属性,其实都通过ext或者自他子表进行存储。 但是这样的设计对查询造成了困扰,纯手动写sql的话,会非常困难。cms中针对这个问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ,大量采用了hibernate的映射关系。 com/jeecms/cms/entity/main/hbm/Channel.hbm.xml: 通过hibernate进行扩展,在查询使用的时候,如果管理不好,可能增大数据库方面的困扰。 由于CMS目前集成了ehcache的缓存,查询大多从缓存中进行,因此这种问题也不是太严重。 CMS中针对缓存的查询主要通过 query.setCacheable(Boolean bool)进行手动判断。 17) 缓存 CMS中使用ehcache比较广泛,主要分为两种使用方式 1. Hibernate使用,通过配置文件src/ehcache-hibernate.xml,其中主要配置的都是hibernate的bean对应的缓存。 2. 本身用的缓存,主要分为以下几个部分 a) session缓存 session提供者在CMS中有多种实现,分别是来自http的,来自memcached的,来自ehcache的等。默认配置的是来自http的。集成分布式项目的时候,获取需要分布式缓存提供 b) 内容计数缓存 通过类com.jeecms.cms.service.ContentCountCacheImpl进行实现,这个类中封装了一个ehcache的缓存。 web/WEB-INF/config/cache-context.xml中有对应的配置,注意别名。qualifier 销毁bean时候,将改变刷新到数据库中。 c) 站点流量缓存 这个实现和内容计数器的是实现是一样的。 18) 拦截器 每次请求,不管前后台,都有对应的拦截器,预先将必要的属性设置到req中。具体参见springMVC的两个主要配置文件。 以下分别是后台和前台的拦截器。 7. 栏目管理 栏目是CMS抽象出来的二级页面,通过配置进行加载。 栏目对应的数据库表结构是jc_channel。 其中,访问路径十分关键,前台过滤器捕获了对应的path(/**/*.*)以后,会根据匹配结果去查询栏目内容 规则如下: com.jeecms.cms.action.front.DynamicPageAct.dynamic(HttpServletRequest, HttpServletResponse, ModelMap)方法中: 1. 如果只是index.jhtml,那就是首页;直接走首页逻辑 2. 如果不是xxx.jhtml,直接进入单页。 3. 如果是xxxxx/index.jhtml,那就是栏目首页; 进入栏目页以后,会根据当前的tag查询栏目ID。CMS的动态配置页面由此实现。 4. 如果是xxxxx/【非index】,那么就是内容页。 8. 全文检索 CMS的全文检索是通过lucene实现模糊查询和匹配的。主要的逻辑全都在com.jeecms.cms.lucene包内。 19) 初始化全文检索索引 这部分内容体现在后台是这里:维护-》全文检索 体现在代码中,则是com.jeecms.cms.lucene.LuceneContent这个类。 其中,createDocument是比较关键的,包含从数据库中查询数据,并且生成索引的代码。 其余方法都是查询和删除索引的了。 20) 全文搜索页面 这个页面需要使用标签cms_lucene_page。这个标签只接受关键词一个字段,但是可以通过改写源码进行扩展,以增加其他字段。 搜素的内部实现本质上就是通过LuceneContent从索引中进行多个关键词的匹配。 9. 前台动态html 主要的一个控制器:DynamicPageAct,基本上页面都是从这里出来的。基本上分为三个大的方法。
本文档为【cms3.0技术研究】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_003124
暂无简介~
格式:doc
大小:88KB
软件:Word
页数:25
分类:互联网
上传时间:2019-04-30
浏览量:31