velocity模板引擎学习(1)

velocityfreemaker、jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在github上也维护了一个版本)对于使用异构技术的团队(即要搞.NET又要搞JAVA),总是希望找一种通用的技术,兼容所有技术平台,以便降低学习成本,无疑velocity是一种值得考虑的选择。

一、与strtus2的集成

 1         <dependency>
 2             <groupId>org.apache.velocity</groupId>
 3             <artifactId>velocity</artifactId>
 4             <version>1.7</version>
 5         </dependency>
 6
 7         <dependency>
 8             <groupId>org.apache.velocity</groupId>
 9             <artifactId>velocity-tools</artifactId>
10             <version>2.0</version>
11         </dependency>

pom.xml中加入这二项即可,其它不用刻意配置。struts2同时支持jstl(.jsp)、velocity(.vm)、freemaker(.ftl)三种模板。

 

二、定义变量

1   #set($awbpre='112')
2   #set($awbno='89089011')
3   #set($airwayBillNo=$awbpre+' - '+$awbno)
4   $awbpre - $awbno <br/>
5   $airwayBillNo

velocity的语法符号大概分二类,一类用#开头,代表控制符号,#set表示定义变量,另一类用$开头,通常用于显示变量,上面的示例定义了三个变量:
awbpre 值为'112',awbno值为'89089011',airwayBillNo值为 '112 - 89089011'

第4,5二行输出内容

 

三、遍历数组

1   #set($list = ["CTU", "SHA", "LAX"])
2   #foreach ($item in $list)
3      $velocityCount . $item <br/>
4   #end

解释:定义了一个数组,然后遍历输出,其中velocityCount为索引变量

 

四、遍历HashTable

1   #foreach($key in $table.keySet())
2     $key -> $table.get($key)<br/>
3   #end

五、判断是否为空

1       #if($null.isNull($orderList.orders) || $orderList.orders.size()==0)
2           订单列表为空
3       #else
4           订单列表:<br/>
5           #foreach ($order in $orderList.orders)
6               $velocityCount: $order.id / $order.clientName / $order.amount / $order.createTime<br/>
7           #end
8       #end

上面是判断集合是否为空的,如果判断单个对象是否为空,参考下面这样:

 1     #if($(orderDto))
 2         订单对象有值
 3     #else
 4         订单对象为空
 5     #end
 6
 7     #if(!$(orderDto))
 8         订单对象为空
 9     #else
10         订单对象有值
11     #end

 

六、宏示例

宏可以理解为“函数”,定义一个宏即相当于定义一个子函数,调用宏,即为调用子函数

 1     #macro(renderOrderList $orders)
 2         <table border="1">
 3           <tr>
 4               <th>Id</th>
 5               <th>ClientName</th>
 6               <th>Amount</th>
 7               <th>CreateTime</th>
 8           </tr>
 9           #foreach($o in $orders)
10             <tr><td>$o.id</td><td>$o.clientName</td><td>$o.amount</td><td>$o.createTime</td></tr>
11           #end
12         </table>
13     #end
14
15     #renderOrderList($orderList.orders)

七、数值、日期格式化

1     $order.createTime<br/>
2     $date.year - $date.month - $date.day <br/>
3     $date.format('yyyy-MM-dd HH:mm:ss',$order.createTime,$locale)<br/>
4     $date.format('MMMdd',$order.createTime,$locale)<br/>
5     $convert.toLocale("en_US") <br/>
6     $date.format('MMM,dd',$order.createTime,$convert.toLocale("en_US"))<br/>
7     $date.format('yyyy-MM-dd',$order.createTime,$locale)<br/>
8     $order.amount<br/>
9     $number.format('0.00',$order.amount)<br/>
NumberTool中还有货币格式化的功能:$number.format("currency", $agentBillDto.feeTotal)

要使用格式化功能,需要加一点配置,struts.xml文件中加一行

<constant name="struts.velocity.toolboxlocation" value="WEB-INF/classes/toolbox.xml" />

然后在toolbox.xml中,参考下面的内容:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 4     "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">
 5 <toolbox>
 6     <tool>
 7         <key>number</key>
 8         <scope>application</scope>
 9         <class>org.apache.velocity.tools.generic.NumberTool</class>
10     </tool>
11     <tool>
12         <key>date</key>
13         <scope>application</scope>
14         <class>org.apache.velocity.tools.generic.DateTool</class>
15     </tool>
16     <tool>
17         <key>text</key>
18         <scope>request</scope>
19         <class>org.apache.velocity.tools.struts.MessageTool</class>
20     </tool>
21     <tool>
22         <key>convert</key>
23         <scope>application</scope>
24         <class>org.apache.velocity.tools.generic.ConversionTool</class>
25     </tool>
26 </toolbox>

View Code

这些XXXTool其实是一个很好的例子,因为velocity的vm文件里不能直接写java代码,如果我们想扩展一些常用方法,可以将一些常用方法写成XXXTool工具类,然后在toolbox中注册即可。

 

 

八、国际化

1  当前语言环境:$locale <br/>
2  #stext("name=%{getText('appName')}")

虽然Velocity-Tools 2.0中提供了MessageTool,但是我一直没尝试成功,只能借助struts2本身的标签来处理了。struts2中首先得定义国际化资源文件的BaseName

1 <constant name="struts.custom.i18n.resources" value="message"></constant>

然后在classPath目录下,放二个文件message_zh_CN.properties、message_en_US.properties,里面放一个appName=XXX的内容,用#stext就能取到国际化的内容了

 

九、使用struts2标签

虽然有了velocity基本上可以告别struts2的那一堆tags,但是如果怀念struts2里的标签,也可以继续使用,方法:以“#s”开头就行了,参考下面的示例:

1 #stextarea ("label=Biography" "name=bio" "cols=20" "rows=3") <br/>
2 #sselect("label=Favourite Color" "list={'Red', 'Blue', 'Green'}" "name=favouriteColor" "emptyOption=true" "headerKey=None" "headerValue=None")    <br/> 

 

十、内建对象

1 $request<br/>
2 name = $request.getParameter("name")<br/>
3 $session<br/>

Velocity可以直接使用struts2的很多内置对象,比如Request、Session、Response,上面的示例演示了如何获取 url请求参数

 

十一、include、parse实现布局模块化

每个页面,通常会有一些公用的头、尾,可以用include或parse来包括其它vm文件(或txt/html文件),这二个的区别在于include只是简单的把其它文件导入进来,不会执行任何vm语法的解析。而parse导入其它vm文件时,如果其它vm文件里有一些指令,比如定义变量,定义宏之类,parse会解析执行。

1 #parse("template/header.vm")
2 #include("template/footer.vm")

关于加载的路径,这里要重点解释一下,官方文档上也讲得不清不楚,Velocity支持二种路径加载机制,按classPath或按filePath,默认是按classPath路径加载,即:只要被包含的.vm文件在/WEB-INF/classes目录下即可。上面的示例,将在/WEB-INF/classes/template目录下,搜索header.vm、footer.vm这二个文件,如果找到就加载,否则出错。

最后谈下IDE以.vm的可视化支持问题,目前最新的eclipse上,暂无好用的插件(googlecode上的插件大多已经没人维护了,与最新的eclipse不兼容),建议使用IntelliJ Idea,它对vm的可视化支持程度较好。

 

更详细的用法,请参考下面官司文档:

Velocity Engine 用户指南

Velocity Engine 开发人员指南

Velocity Tools 用法概述

时间: 2024-08-04 02:04:06

velocity模板引擎学习(1)的相关文章

velocity模板引擎学习(3)-异常处理

按上回继续,前面写过一篇Spring MVC下的异常处理.及Spring MVC下的ajax异常处理,今天看下换成velocity模板引擎后,如何处理异常页面: 一.404错误.500错误 1 <error-page> 2 <error-code>404</error-code> 3 <location>/nopage.do</location> 4 </error-page> 5 6 <error-page> 7 <

velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools

通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用velocity模板引擎生成 『每日发货单』邮件内容: 一.先定义邮件内容模板:mail-template.vm <string>用户,您好:</string> <h2>以下是 $date.format('yyyy-MM-dd',$model.deliverDate,$conv

velocity模板引擎学习(2)-velocity tools 2.0

使用velocity后,原来的很多标签无法使用了,必须借助velocity tools来完成,目前velocity tools最新版本是2.0,下面是velocity tools的一些注意事项: 1. 与Spring MVC 3.x/4.x的集成问题 Spring 3.x/4.x只支持1.3.x的velocity tools,要使用2.0必须自己扩展VelocityToolboxView类 1 package org.springframework.web.servlet.view.veloci

如何使用 velocity 模板引擎开发网站

模板 开发网站-velocity模板引擎">基于 Java 的网站开发,很多人都采用 JSP 作为前端网页制作的技术,尤其在是国内.这种技术通常有一些问题,我试想一下我们是怎样开发网站的,通常有几种方法: 1:功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环,判断显示数据结果).也就是通常的 jsp 页面制作,当然这部分可以由美工完成模板,然后由 jsp 工程师再继续以它为原型创建相应的 jsp 页面. 2:功能确定后,由美工设计网页的UI(界面)

用Apache Velocity模板引擎速造网站

apache|模板 基于Java的网站开发,很多人都采用JSP作为前端网页制作的技术,尤其是在国内.这种技术通常会存在一些问题,可以通过简单地分析网站开发过程来看看这些问题.通常网站开发采用以下两种方式: ◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环.判断显示数据结果).这就是通常的JSP页面制作,当然这部分可以由美工完成模板,然后由JSP工程师以它为原型创建相应的JSP页面. ◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由网页

JAVA velocity模板引擎使用实例_JSP编程

velocity使用1.7版本. 在win7下使用intelliJ IDEA建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导入velocity相关jar包.只导入velocity-1.7.jar这个包可能会报错,根据提示再导入velocity自带的其他包. 项目结构如下: 测试Tomcat index.jsp内容如下: 复制代码 代码如下: <%-- Created by IntelliJ IDEA. --%><%@ page conten

velocity 模板引擎

freemarker等的同类产品,可脱离web环境使用. 在web项目中与springMVC搭配,可参考<spring mvc中的视图框架> 它是一个apache的项目,地址为:http://velocity.apache.org/engine/1.7/user-guide.html 1.依赖 <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity --> <dependency> <

jade模板引擎学习笔记(WebsStorm9.0.3+ nodejs+express+jade)

jade环境搭建  jade标签写法  jade注释 jade添加类名.id.属性   jade添加脚本,css jade变量 jade多行文本显示 jade流程代码:for,each,while jade流程代码:if - else - unless ,case 可重用的jade块Mixins 模板继承(extends) 模板包含(include) jade环境搭建       打开WebsStorm9.0.3,File-New Project-,project type选择Node.js E

Node.js模板引擎学习----ejs

环境:windows+node.js+express 一.安装ejs 打开cmd窗口,输入npm install ejs -g,等待下载安装完成. 二.使用 调用过程中使用路由机制和模板,路由请求地址为根目录,模板文件为home.ejs[注:模板引擎文件为.ejs文件] 1.新建js文件为index.js 写入如下代码: varexpress=require("express"); varapp=express(); //设置渲染引擎 app.set("viewengine&