CMS系统中自定义模板标签、脚本的实现
探讨问题的同胞们可以加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系统中自定义模板标签、脚本的实现相关推荐
- django “如何”系列4:如何编写自定义模板标签和过滤器
django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...
- 20190325 Django自定义过滤器和自定义模板标签
代码布局(死去活来) 自定义要先解决几个问题: 1). 在哪里定义,要将代码写在哪里? app目录下的名为templatetags的文件夹,必须叫这个名字.这个文件夹必须是一个python的包(pyt ...
- Django 自定义模板标签(template_tags)究竟有什么用?
自定义模板标签,过滤器.英文翻译是Custom template tags and filters.custom filter自定义过滤器今天不在我的记录范围之内,以后用到再看官方文档也不迟. **问 ...
- php嵌套模板,thinkphp3.1自定义模板标签嵌套实现
thinkphp3.1自定义模板标签嵌套实现 之前做的自定义标签,属性里面读取不到上层标签的值,然后找了很多文档发现没有能解决的,然后就自己研究了一下,搞出来了,下面是方法,绝对能用,不能用我吃了它. ...
- thinkphp自定义模板标签(一)
thinkphp内置的foreach和include等模板标签使用是非常方便的:但是内置的那些标签只能满足常用功能,个性化的功能就需要我们自己编写自定义模板标签了:下面就是要讲解如何实现: 示例环境: ...
- template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
应网友慕之岩的请求,现提供下Django项目中如何使用自定义标签实现仿CSDN博客的月度归档(如下图所示).要求按月统计每个月发表的博文篇数, 跳过空白月份,最后结果按发布时间逆序排列.点击每个月份可 ...
- django自定义模板标签,通过键获取字典的值,屏蔽姓名等隐蔽信息并调用展示到页面上
1.在web开发中,经常会说要屏蔽某些字眼,用*来屏蔽客户比较隐蔽的信息,如身份证,姓名,手机号等等,当然,如果安全性做得好一点的会加密身份证后存入数据库,如果没有的话,直接取出来,页面要展示的时候, ...
- Django框架学习20--模板变量,模板标签,模板过滤器及自定义模板过滤器,自定义模板标签
1.模板变量 string 字符串和 int 类型,通过key名称直接取值,如:{{ n_name }} list类型的取值,通过点下班取值,如:{{ fancy.0 }}.{{ fancy.1 }} ...
- 模板标签(tags)的介绍及如何自定义模板标签
什么是模板标签(tags) 模板标签都是放在{% %}括号里的,常见的模板标签有{% load xxxx %}, {% block xxxx %}, {% if xxx %}, {% url 'xx ...
最新文章
- 字符串专题:map POJ 1002
- 【c++内存分布系列】单独一个类
- php ajax 弹窗修改,更改PHP/Ajax脚本来使用Meekrodb?
- linux文件和目录管理指令,Linux 命令(文件和目录管理 - cat)
- Java基础学习总结(152)——JDK 1.7和 JDK 1.8中HashMap的实现有什么不同?
- c++ 结构体中不同类型的初始值_不同类型结构的厂房效果图大盘点
- python实现的椭圆曲线加密
- vyos配置dns迭代查询
- unity3d 坦克大战实战
- 无线网络部署与规划要点及案例分享
- 华为鸿蒙主机,华为发布全屋智能主机以及V系列智慧屏 搭载鸿蒙系统
- java获取京东token_京东开放服务平台(JOS)关于token问题汇总(一)
- R语言的修仙之道--R语言之后天境界
- 还在问视频音频转文字软件哪个好吗?快码住这两款
- GNS3 v0.8.6简体中文官方版本下载
- SQL Server中的日期和时间:DATEADD()
- 如何强制修改电脑密码
- python模块安装(大合集)
- 软件缺陷及其生命周期
- 导盲机器人 英语作文_雷军这回OK了!小米或将推出会说英文的 AI 自平衡车