`
badqiu
  • 浏览: 670578 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

扩展Velocity,实现模板的继承

阅读更多

与我之前的扩展freemarker类似,现新增加三个指令:block,override,extends

一.目的:

  • 父模板页面定义好布局,子模板可以重定义布局中的部分内容
  • 使模板可以实现类似"类"的继承关系,并不限继承层次

二.继承概榄:

父模板:base.vm

<html>
<head>
	#block("head") 
		base_head_content 
	#end 
</head>
<body> 
	#block("body") 
		base_body_content 
	#end
</body>
</html>

 

子模板: child.vm

#override("body")
	<div class='content'>
		Powered By rapid-framework
	</div> 
#end
#extends("base.vm")

 子模板child.vm输出

 

<html>
	<head>
		base_head_content 
	</head>
<body> 
	<div class='content'>
		Powered By rapid-framework
	</div> 
</body>
</html>

 可以看到,输出中body部分被子模板重定义(override)了,而head部分则还是显示父模板(block)中的内容。

 

 

三.指令介绍:

  • #block : 定义块,可以被子模板用#override指令覆盖显示
  • #override :  覆盖#block指令显示的内容
  • #extends : 继承其它模板,必须放在模板的最后面(注:该指令完全等价于#parse指令,只是为了提供统一的语义,即extends比parse更好理解)

四.使用说明:

在velocity的properties中可以设置:

userdirective=cn.org.rapid_framework.velocity.directive.BlockDirective,cn.org.rapid_framework.velocity.directive.OverrideDirective,cn.org.rapid_framework.velocity.directive.ExtendsDirective
然后再初始化,即中使用自定义指令:
velocityEngine.init(properties);

使用注意(关乎性能):

   必须为velocity的ResourceLoader开启cache,因为 engine.getTemplate(name) 默认是没有使用cache的,而#extends是需要经常调用该函数,所以必须为ResourceLoader指定开启cache,如FileResourceLoader

file.resource.loader.cache = true
 

 

以上三个指令属于rapid-framework的扩展,后续新版本发布将包含该项扩展,敬请关注。
具体指令源码请查看:
http://rapid-framework.googlecode.com/svn/trunk/rapid-framework/src/rapid_framework_common/cn/org/rapid_framework/velocity/directive/

2
2
分享到:
评论
7 楼 innerp 2013-02-11  
badqiu 写道
innerp 写道
楼主 不错! 其实可以借鉴django 模板引擎 就用一个block标签就行了!override 标签可以不需要


这个本身就是django的移植,只有一个block标签,你可以试试. 在现有框架较难,都是使用技巧做到的.

嗯 好 我去看看实现
6 楼 badqiu 2013-01-26  
innerp 写道
楼主 不错! 其实可以借鉴django 模板引擎 就用一个block标签就行了!override 标签可以不需要


这个本身就是django的移植,只有一个block标签,你可以试试. 在现有框架较难,都是使用技巧做到的.
5 楼 innerp 2013-01-25  
楼主 不错! 其实可以借鉴django 模板引擎 就用一个block标签就行了!override 标签可以不需要

4 楼 Wuaner 2012-10-18  
rapid-framework,不错的东西,博主辛苦
3 楼 bangyan2003 2009-12-29  
这个也扩展了啊 赫赫
2 楼 badqiu 2009-12-28  
1.性能差距, 现该实现可以发挥velocity模板原生的最大性能
2.继承的概念易于理解.
1 楼 neptune 2009-12-28  
和sitemesh比优势?

相关推荐

    扩展MyBatisPlus代码生成器实现自定义源码生成,可生成前端页面、vo对象、dto对象等代码

    如果想生成未预置的代码,如vo对象、前端vue页面以及其他自定义代码等,需要做一些定制和扩展来实现。 从使用角度而言,官方资料介绍得比较简要,要实际使用,仍然需要进行具体的尝试和摸索,包括必要时看下源码...

    struts项目学习笔记

    允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,没有实现,getter,setter方法)对象 作为Action,没有耦合 Action的execute 默认方法不再与Servlet API耦合,更易测试 支持更多视图技术(JSP(转译java...

    JFinal(JAVA 极速WEB ORM框架 ) v3.2.zip

    6、添加 IDbProFactory,支持继承 DbPro 来定制 DbPro 功能 7、文件上传支持input域使用同名name属性 JFinal有如下主要特点 MVC架构,设计精巧,使用简单 遵循COC原则,零配置,无xml 独创Db Record模式,灵活...

    struts2讲义_吴峻申

    4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 4.4.1 Struts2文件上传功能开发 61 4.4.2 ...

    Struts2 in action中文版

    8.3.1 VelocityResult,也叫做velocity 189 8.3.2 FreemarkerResult,也叫做freemarker 191 8.4 全局结果 192 8.5 小结 193 第四部分 完善应用程序 第9章 集成Spring和Hibernate/JPA 196 9.1 为什么在Struts 2中...

    Spring 2.0 开发参考手册

    3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用...

    单点登录源码

    Velocity | 模板引擎 | [http://velocity.apache.org/](http://velocity.apache.org/) ZooKeeper | 分布式协调服务 | [http://zookeeper.apache.org/](http://zookeeper.apache.org/) Dubbo | 分布式服务框架 | ...

    springboot参考指南

    继承starter parent ii. 13.1.2. 使用没有父POM的Spring Boot iii. 13.1.3. 改变Java版本 iv. 13.1.4. 使用Spring Boot Maven插件 ii. 13.2. Gradle iii. 13.3. Ant iv. 13.4. Starter POMs ii. 14. 组织你的代码 i...

    Spring中文帮助文档

    14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.5. 绑定支持和表单处理 14.5. XSLT 14.5.1. 写在段首 14.5.2. 小结 14.6. 文档视图(PDF/...

    Spring API

    3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用...

    spring chm文档

    3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用...

Global site tag (gtag.js) - Google Analytics