探讨问题的同胞们可以加QQ群:315309006

不少人对CMS很好奇,觉得CMS系统中为什么会出现各种不一样的标签,诸如<foreach *>、#if,有一些是#getArticle("page=5")、更牛逼的还有“[循环][输出标题/][/循环]”,这些具体是怎么实现的呢?本文对CMS的核心内容进行实例解剖,帮助开发者理解CMS的工作原理、怎么设计自己的特殊标签。

一般来说一个完整的CMS系统,核心至少应该有这四部分:文档组织、文档发布、模板及自定义脚本、文件管理,其中模板及自定义脚本是最核心的部分,因为它要面对CMS的用户--这对做二次开发以网站制作为生的用户来说,易用是很重要的。

代码示例:(JAVA velocity实现) [或用freemark也行]

// 自定义声明
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD })
public @interface InjectProperty {public String name();public String defaultValue() default "";}
}
// 描述注入对象
public class InjectBean {@InjectProperty(name = "articleId")private String articleId = "";@InjectProperty(name = "title")private String title = "";@InjectProperty(name = "author")private String author = "";……@InjectProperty(name = "cms")private final INCCMSArticle cms = new INCCMSArticle(this);……
}
// 将模板发布过程抽象成接口
public interface TemplateEngine {// 发布模板public String run(File f) throws Exception;// 注入页面属性public void injectProperty(Object param) ;
}
// 定义抽象类 处理执行过程
public abstract class AbstractTemplateEngine implements TemplateEngine {private final Map<String, Object> properties = new HashMap<String, Object>();public String run(File f) throws Exception {return new VelocityTemplate().publishVelocityContent(properties, f);}public void injectProperty(Object param) throws InjectException {for (Field f : param.getClass().getDeclaredFields()) {InjectProperty injectProperty = f.getAnnotation(InjectProperty.class);if (injectProperty == null)  continue;name = f.getName();try {Object value = PropertyUtils.getProperty(param, name);properties.put(injectProperty.name(), value);} catch (Exception e) {throw new InjectException("加载[" + name + "]错误:" + e);}}}}
// 定义Velocity发布机
public class VelocityTemplate {public String publishVelocityContent(Map properties, String forder,
String fileName) throws ParseErrorException,
MethodInvocationException, ResourceNotFoundException, IOException {// filepath是模板位置InputStream in = new FileInputStream(new File(#fiepath#));Reader read = new InputStreamReader(in, "utf8");VelocityEngine velocity = new VelocityEngine();VelocityContext context = new VelocityContext(properties);StringWriter sw = new StringWriter();// 调用Velocity接口方法velocity.evaluate(context, sw, null, in);return sw.toString();}
}


(上图是我实现的标签)

探讨问题的同胞们可以加QQ群:315309006

转载于:https://my.oschina.net/ehofy/blog/160567

CMS系统中自定义模板标签、脚本的实现相关推荐

  1. django “如何”系列4:如何编写自定义模板标签和过滤器

    django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...

  2. 20190325 Django自定义过滤器和自定义模板标签

    代码布局(死去活来) 自定义要先解决几个问题: 1). 在哪里定义,要将代码写在哪里? app目录下的名为templatetags的文件夹,必须叫这个名字.这个文件夹必须是一个python的包(pyt ...

  3. Django 自定义模板标签(template_tags)究竟有什么用?

    自定义模板标签,过滤器.英文翻译是Custom template tags and filters.custom filter自定义过滤器今天不在我的记录范围之内,以后用到再看官方文档也不迟. **问 ...

  4. php嵌套模板,thinkphp3.1自定义模板标签嵌套实现

    thinkphp3.1自定义模板标签嵌套实现 之前做的自定义标签,属性里面读取不到上层标签的值,然后找了很多文档发现没有能解决的,然后就自己研究了一下,搞出来了,下面是方法,绝对能用,不能用我吃了它. ...

  5. thinkphp自定义模板标签(一)

    thinkphp内置的foreach和include等模板标签使用是非常方便的:但是内置的那些标签只能满足常用功能,个性化的功能就需要我们自己编写自定义模板标签了:下面就是要讲解如何实现: 示例环境: ...

  6. template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档

    应网友慕之岩的请求,现提供下Django项目中如何使用自定义标签实现仿CSDN博客的月度归档(如下图所示).要求按月统计每个月发表的博文篇数, 跳过空白月份,最后结果按发布时间逆序排列.点击每个月份可 ...

  7. django自定义模板标签,通过键获取字典的值,屏蔽姓名等隐蔽信息并调用展示到页面上

    1.在web开发中,经常会说要屏蔽某些字眼,用*来屏蔽客户比较隐蔽的信息,如身份证,姓名,手机号等等,当然,如果安全性做得好一点的会加密身份证后存入数据库,如果没有的话,直接取出来,页面要展示的时候, ...

  8. Django框架学习20--模板变量,模板标签,模板过滤器及自定义模板过滤器,自定义模板标签

    1.模板变量 string 字符串和 int 类型,通过key名称直接取值,如:{{ n_name }} list类型的取值,通过点下班取值,如:{{ fancy.0 }}.{{ fancy.1 }} ...

  9. 模板标签(tags)的介绍及如何自定义模板标签

    什么是模板标签(tags) 模板标签都是放在{%  %}括号里的,常见的模板标签有{% load xxxx %}, {% block xxxx %}, {% if xxx %}, {% url 'xx ...

最新文章

  1. 字符串专题:map POJ 1002
  2. 【c++内存分布系列】单独一个类
  3. php ajax 弹窗修改,更改PHP/Ajax脚本来使用Meekrodb?
  4. linux文件和目录管理指令,Linux 命令(文件和目录管理 - cat)
  5. Java基础学习总结(152)——JDK 1.7和 JDK 1.8中HashMap的实现有什么不同?
  6. c++ 结构体中不同类型的初始值_不同类型结构的厂房效果图大盘点
  7. python实现的椭圆曲线加密
  8. vyos配置dns迭代查询
  9. unity3d 坦克大战实战
  10. 无线网络部署与规划要点及案例分享
  11. 华为鸿蒙主机,华为发布全屋智能主机以及V系列智慧屏 搭载鸿蒙系统
  12. java获取京东token_京东开放服务平台(JOS)关于token问题汇总(一)
  13. R语言的修仙之道--R语言之后天境界
  14. 还在问视频音频转文字软件哪个好吗?快码住这两款
  15. GNS3 v0.8.6简体中文官方版本下载
  16. SQL Server中的日期和时间:DATEADD()
  17. 如何强制修改电脑密码
  18. python模块安装(大合集)
  19. 软件缺陷及其生命周期
  20. 导盲机器人 英语作文_雷军这回OK了!小米或将推出会说英文的 AI 自平衡车

热门文章

  1. 小米9刷twrp并安装Magisk(面具)
  2. ADC转换汇总(STM32、取平均、精度等)
  3. $htttp内置服务
  4. 2019年个人在嵌入式领域上的发展思路
  5. oppo安卓面试题,Android插件化入门指南,含泪整理面经
  6. lr增强细节_LR和PS如何进行风光后期细节增强
  7. web中的数据导入与导出
  8. 2013多校第一场 - from lanshui_Yang
  9. android 光学指纹 流程,2017手机指纹识别趋势盘点:光学指纹成为现实
  10. 电力铁塔监测预警系统解决方案