一、媒介
常见的Java模板引擎有JSP、Freemark,Velocity。在MVC三层框架中,模板引擎属于view层,实质是把model层内容揭示到前台页面的一个引擎,velocity以其前后端解耦使前靠山可以同时开拓和其语法的浅易性获得了遍及的应用,团体WebX框架就发起利用它作为模板引擎。
二、道理
2.1 架构先容
打开velocity的源码包,从代码布局看velocity主要包罗app、context、runtime、event、texen和一些util类
1)、app模块
源码org.apache.velocity.app下面主要有两个类Velocity和VelocityEngine。
别的Velocity成果是委托给RuntimeInstance来详细实现的,而且维护的是一个单件实例,就是说在同一个jvm中,只有一个Velocity的实例,这给资源共享和设置当地化带来的利便,这为在通一个JVM的差异应用见共享模块提供了利便。
譬喻springmvc中初始化一个veloctiy引擎方法如下:
2)、Context模块
源码org.apache.velocity.context包下的Context,AbstractContext,尚有org.apache.velocity下的VelocityContext。主要成果是提供对模板渲染所需要的变量的封装打点.
Context设计目标:
譬喻SpringMVC通报参数的是一个Map的数据布局,那么假如springmvc中利用velocity则需要把map内里存放的变量适配到context中,这个是直接把map作为VelocityContext结构函数参数适配的。可是webx利用的是本身的context,PullableMappedContext存放变量,那么就需要担任velocity的AbstractContext实现一个适配器TemplateContextAdapter来把本身的context转换为velocity所需要的context.
3)、RunTime模块
源码org.apache.velocity.runtime包下:
认真加载模板文件,理会为JavaCC语法树,利用深度遍历算法渲染语法书节点,生成渲染功效。
4)、RuntimeInstance
认真理会模板文件为AST布局,velocity和velocityengine内部都是委托给它来实现成果。
5)、util模块
一些东西类,譬喻SimplePool是一个工具池,内里默认缓存20个Parser。CalssUtiles是一个简朴的从classloader操纵类和资源的函数类。
2.2 源码阐明
2.2.1 试验筹备
pom中添加velocity依赖
<dependency> <groupId>velocity-tools</groupId> <artifactId>velocity-tools-generic</artifactId> <version>1.4</version> </dependency>
测试java代码:
public static void main(String[] args) {try { // 初始化(1) Velocity.init("velocity.properties"); // 建设context,存放变量(2) VelocityContext context = new VelocityContext(); Person person = new Person(); person.setName("jiaduo"); context.put("person", person); // 加载模板文件到内存(3) Template template = null; String templateFile = "healthview.vm"; template = Velocity.getTemplate(templateFile); // 渲染(4) StringWriter stringWriter = new StringWriter(); template.merge(context, stringWriter); // 打印功效 System.out.println(stringWriter.toString()); } catch (Exception e) { e.printStackTrace(); } }
healthview.vm内容:
<html> <div>$!{person.sayHello()}:$!{person.name}</div> </html>
velocity.properties内容:
file.resource.loader.path = /Users/zhuizhumengxiang/workspace/mytool/SpringLean/src/
2.2.2 源码阐明