velocity
Velocity Template Engine 模板引擎
1. 简介
对于jsp的JSTL表达式大家都不陌生,velocity就是一款类似于其功能的工具。为什么要使用velocity?首先它比jsp快。其次velocity简单没有jsp那么多杂七杂八的标签。最重要的是它实现了model和view层的分离解耦。试想一下一个前端开发 人员在完全没有学习过jsp的情况下要去使用jsp的标签和表达式多少有点费劲了。有了velocity这样简单的脚本语法,只需要稍加学习就可以熟练运 用了。与velocity类似的还有一个FreeMarker,感兴趣的同事可以去了解。
2. 配置
在maven项目中添加依赖:
1 <!– velocity –> 2 3 <dependency> 4 5 <groupId>org.apache.velocity</groupId> 6 7 <artifactId>velocity</artifactId> 8 9 <version>1.7</version> 10 11 </dependency> 12 13 <dependency> 14 15 <groupId>org.apache.velocity</groupId> 16 17 <artifactId>velocity-tools</artifactId> 18 19 <version>2.0</version> 20 21 </dependency> 22 23 <!– velocity –>
在springMVC配置中添加
1 <!– 配置velocity引擎处理请求 –> 2 3 <bean id="velocityConfigurer" 4 5 class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> 6 7 <property name="resourceLoaderPath"> 8 9 <value>/WEB-INF/views/</value> 10 11 </property> 12 13 <property name="velocityProperties"> 14 15 <props> 16 17 <prop key="input.encoding">utf-8</prop> 18 19 <prop key="output.encoding">utf-8</prop> 20 21 </props> 22 23 </property> 24 25 </bean> 26 27 28 29 <!– 配置velocity视图解析器 –> 30 31 <bean id="viewResolver" 32 33 class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> 34 35 <property name="suffix"> 36 37 <value>.vm</value> 38 39 </property> 40 41 </bean>
第一个bean配置了velocity模板文件的路径和编码,第二个bean配置了springMVC视图解析器的实现类 VelocityViewResolver。后缀名称是.vm。假如视图名称是index,则自动去解析页面文件/WEB-INF/views /index.vm。
3. 插件
如果你使用Eclipse4.3 Kepler该插件可以顺利安装。
Eclipse4.4 LUNA不可以成功安装该插件,原因未知。而且目前笔者也没有找到LUNA中能用的velocity插件。
如果你有方法请一定留言回复我,谢谢。
velocity eclipse插件推荐使用Veloeclipse googlecode,velocity插件支持代码高亮(只对于vm后缀名的文件有效)。
官方网站:http://code.google.com/p/veloeclipse/
插件更新地址:http://veloeclipse.googlecode.com/svn/trunk/update/
如何安装不再敖述。
4. 语法
"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#include、#parse、#macro等; "$"用来标识一个对象(或理解为变量); "{}"用来明确标识Velocity变量; "!"用来强制把不存在的变量显示为空白
"##"注释
""转义
1 #set {} ! 符号使用 : 2 3 #set ( $add = 1 + 1 ) 4 5 #set ( $foo = "Velocity" ) 6 7 Hello ${foo} $add World! Hello $!messgae World! ${foo}
输 出 Hello Velocity 2 World! Hello World! ${foo},注意一点:在作为输出语句的时候 ${foo}和$foo是一样的效果,但是在#set ( $foo = "Velocity" )如果使用#set ( ${foo} = "Velocity" )则是错误的语法。在set赋值语句中是可以进行运算的。
#if #elseif #else #end 使用
1 #set ( $flag=1 * 8) 2 3 #if (${flag}==0) 4 5 aaaaa 6 7 #elseif ($flag==8) 8 9 bbbbb 10 11 #else 12 13 ccccc 14 15 #end
输出 bbbbb 8
#foreach($element in $list)#end
后台程序
1 public ModelAndView login(HttpServletRequest request, 2 3 HttpServletResponse response) { 4 5 List<StudentEntity> list = new ArrayList<StudentEntity>(); 6 7 StudentEntity student = new StudentEntity(null,"3","van","male"); 8 9 list.add(student); 10 11 student = new StudentEntity(null, "4", "thomas", "male"); 12 13 list.add(student); 14 15 ModelAndView modelAndView = new ModelAndView(); 16 17 modelAndView.setViewName("velocity"); // 这是模板文件 18 19 modelAndView.addObject("students", list); 20 21 return modelAndView; 22 23 }
前台
1 #foreach (${element} in ${students})<br> 2 3 $velocityCount This is ${element.studentName}<br> 4 5 #end<br>
输出
1 This is van
2 This is thomas
element.studentName去调用了StudentEntity.getStudentName()方法获取数据
#macro(不建议多使用)
#macro(getnames $name $name2)
$name $name2
#end
#getnames(2,2)
输出 2 2,类似于定义一个方法getnames 该方法有2个参数。函数体的类容直接显示到document中
#include、#parse
#include("top.vm","left.vm")可以引入多个文件但是不解析VTL脚本
#parse("index.vm")只可以引入单个文件并且解析脚本。
5. 解决jquery冲突
因为velocity翻译在页面解析之前。因此如果使用$.ajax()这样的语法在被velocuty插件解析的时候页面会有错。可以使用 jQuery.ajax()解决,或者#set($jquery="$.") ${jquery}ajax();页面被velocity解析时被翻译成$.ajax()再被js执行。
7. velocity tools
7.1. toolbox配置
velocity tools是Apache velocity项目下的子项目。如它本身的名字一样,velocity tools可以方便页面调用一些通用的“组件”,这些组件由一些java程序实现。velocity本身自带一些工具类。比如 org.apache.velocity.tools.generic.DateTool这个工具类,提供了在vm模板里面简洁的输出日期。但是必须配置 tools工具。还记得在本文开篇就提到的配置velocity视图解析器的地方么? velocity tools就需要从这里去配置。我们下载velocity的源码看 org.springframework.web.servlet.view.velocity.VelocityViewResolver。
1 public class VelocityViewResolver extends AbstractTemplateViewResolver { 2 3 private String dateToolAttribute; 4 5 private String numberToolAttribute; 6 7 private String toolboxConfigLocation;
看到了toolboxConfigLocation么?tools的配置文件路径有了它我们添加配置到velocity视图解析器里面:
1 <!– 配置velocity视图解析器 –> 2 3 <bean id="viewResolver" 4 5 class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> 6 7 <property name="suffix"> 8 9 <value>.vm</value> 10 11 </property> 12 13 <property name="contentType" value="text/html;charset=UTF-8"></property> 14 15 <property name="toolboxConfigLocation"> 16 17 <value>/WEB-INF/toolbox.xml</value> 18 19 </property> 20 21 </bean>
toolbox.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <toolbox> 4 5 <data type="number"> 6 7 <key>version</key> 8 9 <value>1.1</value> 10 11 </data> 12 13 14 15 <tool> 16 17 <key>date</key> 18 19 <scope>application</scope> 20 21 <class>org.apache.velocity.tools.generic.DateTool</class> 22 23 </tool> 24 25 <tool> 26 27 <key>escape</key> 28 29 <scope>application</scope> 30 31 <class>org.apache.velocity.tools.generic.EscapeTool</class> 32 33 </tool> 34 35 <tool> 36 37 <key>math</key> 38 39 <scope>application</scope> 40 41 <class>org.apache.velocity.tools.generic.MathTool</class> 42 43 </tool> 44 45 </toolbox>
简单说一下这个配置文件,从结构上看,最外面是toolbox,里面可以有标签data和tool。
data即是数据。type指定数据类型,key在VTL中使用的变量名称,value对应的值
tool工具类,key在VTL中使用的变量名称,class指定java类,scope域(这个概念相信大家不陌生),这个需要根据实际工具的用途去设定。
7.2. 自己实现一个velocity tool。
MyTestTool.java
1 import java.util.List; 2 3 import java.util.Random; 4 5 import org.apache.velocity.tools.config.DefaultKey; 6 8 9 @DefaultKey("mytestool") 10 11 public class MyTestTool{ 12 13 private long sessionCode; 14 15 public MyTestTool() { 16 17 Random r = new Random(); 18 19 sessionCode = r.nextLong(); 20 21 22 23 } 24 25 public String getSessionCode(){ 26 27 String html=""; 28 29 html += "<div style='background:red'>"; 30 31 html += sessionCode; 32 33 html += "</div>"; 34 35 return html; 36 37 } 38 39 public String getHtml(List<Root> list){ 40 41 String html=""; 42 43 html += "<div style='background:red'>"; 44 45 html += "<table>"; 46 47 for (int i = 0; i < list.size(); i++) { 48 49 html += "<tr style='background:yellow'>"; 50 51 html += "<td>"; 52 53 html += i; 54 55 html += "</td>"; 56 57 html += "<td style='background:blue'>"; 58 59 html += list.get(i).toString(); 60 61 html += "</td>"; 62 63 html += "</tr>"; 64 65 } 66 67 html += "</table>"; 68 69 html += "</div>"; 70 71 return html; 72 73 } 74 75 } 76 77 toolbox.xml中添加 78 79 <tool> 80 81 <key>mytestool</key> 82 83 <scope>session</scope> 84 85 <class>com.cisdi.cdf.demo.vcitytool.MyTestTool</class> 86 87 </tool> 88 89 controller 90 91 @RequestMapping(value = "/index") 93 public ModelAndView index(HttpServletRequest request, 95 HttpServletResponse response) { 97 List<Root> list = baseServiceImpl.getAll("dsdemo", Student.class); 99 view.addObject("students", list); 101 view.addObject("list",list); 105 return view;
vm模板
<div> ${request.getSession().getAttribute("namex")}<br><br> tool date TIME:${date} ${mytestool.sessionCode} ${mytestool.getHtml($list)} version:$version<br><br> </div>

浙公网安备 33010602011771号