與我之前的擴展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/