Velocity怎样实现layout功能,能不使用Filter就可以实现么?

JFinal 发布于 2012/03/27 17:44
阅读 1K+
收藏 0
Velocity怎样实现layout功能,能不使用Filter就可以实现么?
加载中
0
红薯
JFinal
JFinal
果然可以用不Filter,谢谢,收藏了 :)
0
红薯
红薯
velocity 的 layout 本来跟 filter 就没任何关系 ,只需要用 VelocityLayoutServlet 来执行 vm 就有 layout 的功能
唐海康
唐海康
这两天刚刚开始玩velocity,不是很喜欢以前servlet处理完逻辑之后重定向到jsp的写法,对velocity tools的这个servlet的工作模式不太清楚,如果跟servlet+javabeans+jsp的mvc模式相似的话用着感觉有点不爽,不知道velocity本身能不能支持layout呢?
steemit
steemit
回复 @红薯 : VelocityLayoutServlet调的是VelocityViewServlet;但是VelocityViewServlet中获得VelocityVeiw的方式适合ServletConfig绑定的,想要解决的是如何脱离WEB环境,源码也都看了
红薯
红薯
回复 @傻了 : 你看看 VelocityLayoutServlet 这个类的源码就知道了,其实也挺简单
steemit
steemit
如何脱离WEB使用Velocity的layout功能
JFinal
JFinal
请教如何实现呢? 能给个小例子么?最近想用用Velocity :)
0
天天笑笑
天天笑笑

一.目的:

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

二.继承概榄:

父模板:base.vm

Html代码   收藏代码
  1. <html>  
  2. <head>  
  3.     #block("head")   
  4.         base_head_content   
  5.     #end   
  6. </head>  
  7. <body>   
  8.     #block("body")   
  9.         base_body_content   
  10.     #end  
  11. </body>  
  12. </html>  

 

子模板: child.vm

Html代码   收藏代码
  1. #override("body")  
  2.     <div class='content'>  
  3.         Powered By rapid-framework  
  4.     </div>   
  5. #end  
  6. #extends("base.vm")  

 子模板child.vm输出

 

Html代码   收藏代码
  1. <html>  
  2.     <head>  
  3.         base_head_content   
  4.     </head>  
  5. <body>   
  6.     <div class='content'>  
  7.         Powered By rapid-framework  
  8.     </div>   
  9. </body>  
  10. </html>  

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

 

 

三.指令介绍:

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

四.使用说明:

在velocity的properties中可以设置:

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

使用注意(关乎性能):

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

Java代码   收藏代码
  1. file.resource.loader.cache = true 
返回顶部
顶部