铭飞cms开发手册
第一次打开铭飞CMS的源码目录,很多人会愣一下——WEB-INF下面除了常规的发手web.xml,还塞着freemarker、铭飞spring、发手mybatis三套配置,铭飞外加一个config文件夹。发手别慌,铭飞这套CMS的发手骨架其实就三块:标签解析、模型驱动、铭飞插件挂载。发手搞明白它们怎么咬合,铭飞二次开发就顺了。发手
标签不是铭飞JSP,是发手自定义指令
铭飞没有用JSP的<c:forEach>那套,而是铭飞自己写了一套类似Freemarker的标签引擎。模板里写<@ms.articleList>,后台会走TagProcessor去解析。关键类在net.mingsoft.cms.action和net.mingsoft.mdiy.tag下面。你要是想加一个新标签,别去改核心包,直接在WEB-INF/tags里丢一个.tag文件,然后在taglib.properties里注册一下。我试过加一个“最新评论”标签,前后不到二十分钟。
work目录,或者把cms.tag.cache设成false,不然你调半天发现没变化。 模型驱动,不是纯数据库驱动
很多CMS直接拿表当模型,铭飞多了一层IModel接口。比如文章表cms_article,它对应ArticleModel,字段映射写在article.xml里。你要加一个“阅读时长”字段,不是去MySQL里alter table就完事——得在WEB-INF/model/cms/article.xml里加一行<field name="readTime" type="int" />,然后重启。不然后台表单里根本不会出现这个输入框。这个设计有点绕,但好处是换数据库时不用改代码,改xml就行。
插件挂载,别碰核心包
铭飞的插件机制简单粗暴:plugins目录下每个文件夹就是一个插件,里面必须有plugin.xml和Plugin.java。启动时PluginManager会扫描并调用install()方法。我见过有人直接改net.mingsoft.cms.action.ArticleAction来加功能,升级时全丢了。正确做法是写一个插件,在plugin.xml里声明<hook point="articleSaveAfter">,然后实现IHook接口。这样核心包不动,升级也不怕。
<plugin> <name>readTime</name> <version>1.0</version> <hooks> <hook point="articleSaveAfter" class="com.example.ReadTimeHook"/> </hooks> </plugin>
数据库连接池,别用默认的
铭飞默认用DBCP,并发一高就报Connection wait timeout。我直接换成Druid,改config/db.properties里的driverClass和url,再把validationQuery设成SELECT 1。注意:铭飞启动时会读db.properties,但如果你在web.xml里配了context-param,它会覆盖文件里的值。这个优先级坑了我一次——明明改了文件,跑起来还是旧配置,后来发现是web.xml里写死了。
模板继承,用<@include>别用<#include>
Freemarker原生<#include>是静态包含,铭飞的<@include>是动态解析,会走一遍标签引擎。比如页头header.html里可能有<@ms.channelList>,用<#include>的话这些标签不会执行,直接原样输出。我一开始不知道,调了半天以为标签写错了。后来看源码发现IncludeTag里调了TagProcessor.process(),才明白区别。
手册写到这,其实最想说的是:铭飞的文档少,但源码不算难读。遇到问题别急着搜,先看net.mingsoft.cms.action和net.mingsoft.mdiy这两个包,八成能找到答案。剩下的就是动手试,改坏了就回滚,反正有Git。
