velocity模板引擎学习

来源:互联网 发布:java三维地质建模 编辑:程序博客网 时间:2024/05/16 12:54
velocityfreemaker、jstl并称为Java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在github上也维护了一个版本)对于使用异构技术的团队(即要搞.NET又要搞JAVA),总是希望找一种通用的技术,兼容所有技术平台,以便降低学习成本,无疑velocity是一种值得考虑的选择。
一、与strtus2的集成
 <dependency>              <groupId>org.apache.velocity</groupId>              <artifactId>velocity</artifactId>             <version>1.7</version>          </dependency>           <dependency>              <groupId>org.apache.velocity</groupId>              <artifactId>velocity-tools</artifactId>             <version>2.0</version>         </dependency>
pom.xml中加入这二项即可,其它不用刻意配置。struts2同时支持jstl(.jsp)、velocity(.vm)、freemaker(.ftl)三种模板。
二、定义变量
 #set($awbpre='112')   #set($awbno='89089011')   #set($airwayBillNo=$awbpre+' - '+$awbno)   $awbpre - $awbno <br/>   $airwayBillNo
velocity的语法符号大概分二类,一类用#开头,代表控制符号,#set表示定义变量,另一类用$开头,通常用于显示变量,上面的示例定义了三个变量:
awbpre 值为'112',awbno值为'89089011',airwayBillNo值为 '112 - 89089011'
第4,5二行输出内容
三、遍历数组
  #set($list = ["CTU", "SHA", "LAX"])   #foreach ($item in $list)      $velocityCount . $item <br/>   #end
解释:定义了一个数组,然后遍历输出,其中velocityCount为索引变量
四、遍历HashTable
#foreach($key in $table.keySet())     $key -> $table.get($key)<br/>   #end
五、判断是否为空
 #if($null.isNull($orderList.orders) || $orderList.orders.size()==0)           订单列表为空       #else           订单列表:<br/>          #foreach ($order in $orderList.orders)               $velocityCount: $order.id / $order.clientName / $order.amount / $order.createTime<br/>           #end       #end
上面是判断集合是否为空的,如果判断单个对象是否为空,参考下面这样:
 #if($(orderDto))          订单对象有值      #else          订单对象为空      #end        #if(!$(orderDto))          订单对象为空      #else         订单对象有值     #end
六、宏示例
宏可以理解为“函数”,定义一个宏即相当于定义一个子函数,调用宏,即为调用子函数
#macro(renderOrderList $orders)          <table border="1">            <tr>                <th>Id</th>                <th>ClientName</th>               <th>Amount</th>                <th>CreateTime</th>            </tr>            #foreach($o in $orders)             <tr><td>$o.id</td><td>$o.clientName</td><td>$o.amount</td><td>$o.createTime</td></tr>           #end         </table>     #end      #renderOrderList($orderList.orders)
七、数值、日期格式化
$order.createTime<br/>     $date.year - $date.month - $date.day <br/>     $date.format('yyyy-MM-dd HH:mm:ss',$order.createTime,$locale)<br/>       $date.format('MMMdd',$order.createTime,$locale)<br/>         $convert.toLocale("en_US") <br/>     $date.format('MMM,dd',$order.createTime,$convert.toLocale("en_US"))<br/>     $date.format('yyyy-MM-dd',$order.createTime,$locale)<br/>     $order.amount<br/>     $number.format('0.00',$order.amount)<br/>
NumberTool中还有货币格式化的功能:$number.format("currency", $agentBillDto.feeTotal)
要使用格式化功能,需要加一点配置,struts.xml文件中加一行
<constantname="struts.velocity.toolboxlocation" value="WEB-INF/classes/toolbox.xml"/>
然后在toolbox.xml中,参考下面的内容:
?xml version="1.0" encoding="UTF-8"?>     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"       "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> <toolbox>      <tool>          <key>number</key>          <scope>application</scope>         <class>org.apache.velocity.tools.generic.NumberTool</class>     </tool>     <tool>         <key>date</key>         <scope>application</scope>         <class>org.apache.velocity.tools.generic.DateTool</class>     </tool>     <tool>         <key>text</key>        <scope>request</scope>        <class>org.apache.velocity.tools.struts.MessageTool</class>     </tool>     <tool>         <key>convert</key>         <scope>application</scope>         <class>org.apache.velocity.tools.generic.ConversionTool</class>     </tool> </toolbox>
这些XXXTool其实是一个很好的例子,因为velocity的vm文件里不能直接写java代码,如果我们想扩展一些常用方法,可以将一些常用方法写成XXXTool工具类,然后在toolbox中注册即可。
八、国际化
1 当前语言环境:$locale <br/>2 #stext("name=%{getText('appName')}")
虽然Velocity-Tools 2.0中提供了MessageTool,但是我一直没尝试成功,只能借助struts2本身的标签来处理了。struts2中首先得定义国际化资源文件的BaseName
1<constantname="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”开头就行了,参考下面的示例:
 #stextarea ("label=Biography" "name=bio" "cols=20" "rows=3") <br/> #sselect("label=Favourite Color" "list={'Red', 'Blue', 'Green'}" "name=favouriteColor" "emptyOption=true" "headerKey=None" "headerValue=None")    <br/> 
十、内建对象
$request<br/> name = $request.getParameter("name")<br/> $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的可视化支持程度较好。




转载路径:http://blog.csdn.net/sunny243788557/article/details/52796734








原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝不肯把屎尿怎么办 存的电话删除了怎么办 脚踝的韧带断了怎么办 买了双鞋子想退怎么办 鞋子大了一码怎么办 nba篮球大师身体素质满了怎么办 钉鞋大了一码怎么办 篮球鞋鞋垫会向里面跑怎么办 穿高跟鞋脚肿了怎么办 衣服弄到单车油怎么办 高低床孩子摔下来怎么办 量血压时老紧张怎么办 牛仔外套的扣子掉了怎么办 裤子的裤筒大了怎么办 衣服拉链驰坏了怎么办 小脚裤裤腿紧了怎么办 地垫粘地板了怎么办 棉麻衬衣皱了怎么办 麻料衣服烫皱了怎么办 在京东买一双奥康鞋没有防伪怎么办 足球鞋丁掉了一颗怎么办 鼻子有点大想变小该怎么办 阿勒泰小东沟风景区边防证怎么办 孩子上一年级了学习很差怎么办 孩子作息时间不规律怎么办 冬天冻脸怎么办小妙招 冬天冻脚怎么办小妙招 冬天脚冷怎么办小妙招 初中生不爱学习父母该怎么办 早孕办公室买新办公桌怎么办 一年级学生专注度差怎么办 pscs6界面字体太小怎么办 psd文件打不开程序错误怎么办 经常熬夜皮肤暗黄怎么办 炎症引起的经期不来怎么办 父母沉迷于炒股该怎么办 宝宝嘴周边红了怎么办 后背被嘴吸出牙印怎么办 宝宝嘴巴周围长湿疹怎么办 宝宝脸蛋都是红红的湿疹怎么办 药流药第一天晚上的忘吃怎么办