`
takkymj
  • 浏览: 124223 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

更多velocity脚本

阅读更多
#set ($admin = "admin")

#set ($user = "user")

#if ($admin = = $user)

Welcome admin!

#else

Welcome user!

#end

执行运行命令,结果:

Welcome user!

可以看到判断语句只是简单的#if ()、#else、#end,不是很复杂。

接着继续来看看迭代数据吧,把模版hellovelocity.vm中的内容改为:

#foreach( $product in $list )

<li>$product</li>

#end

执行运行命令,结果:

<li>1</li>

<li>2</li>

把在例子中预先保存在VelocityContext的List中的值列举了出来,是不是很方便啊?仅仅只是用了#foreach($variable in xx) 而已,如果上面的List换成Hashtable,则可以用下面的语法:

#foreach($key in $hashVariable.keySet() )

<li> $key ‘s value: $ hashVariable.get($key) </li>

#end
还有不少人还会问,如果是javabean怎么办?好的,我们增加一个bean:

package com.javayou.velocity;

/**

* @author Liang.xf 2004-12-14

*/

public class Student {

//注意class的属性是public的

public String no = "";

public String address = "";

public Student(String _no, String _address) {

no = _no;

address = _address;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getNo() {

return no;

}

public void setNo(String no) {

this.no = no;

}

}

这个Student是实足的javabean,或者说是data bean,常见的用来装载数据的类,然后我们修改HelloVelocity.java,把:

temp.add("1");

temp.add("2");

替换成:

temp.add(new Student("123", "Guangzhou"));

temp.add(new Student("456", "Zhuhai"));

再把hellovelocity.vm的内容改为:

#foreach ($s in $students)

<$velocityCount> Address: $s.address

#end

重新编译和执行运行命令,结果如下:

<1> Address: Guangzhou

<2> Address: Zhuhai

这样把list中Student的数据打印了出来,大功告成!这里用了Velocity的内建变量$velocityCount,指的是默认的列举序号,从1开始,也可以改成0开始,但需要在Velocity.properties中更改,Velocity.properties位于velocity-1.4.jar包内的目录org\\apache\\velocity\\runtime\\defaults 下。

再复杂一些的迭代怎么处理呢?我们看看下面的模版例子就清楚了:

#foreach ($element in $list)

-- inner foreach --

#foreach ($element in $list)

This is $element.

$velocityCount

#end

-- inner foreach --

-- outer foreach --

This is $element.

$velocityCount

-- outer foreach --

#end

看出来了吧,Velocity是支持标签嵌套的,这个可是很强大的功能,这里就不深入演示了,如果有兴趣,自己试试吧。

其实,稍为深入思考刚刚我们举的例子,就已经可以看出来,Velocity的用处在哪里?即Servlet + Velocity的模式,另外,还记得我们早期Jsp开发的模式Jsp+JavaBean吗?在这里,我们更改为Servlet+JavaBean+Velocity,想想,是不是已经替代了Jsp+JavaBean,并更彻底的把Java代码去除在Jsp(vm)外,如果光使用Struts(Servlet+Jsp),那么带来的代价是Java代码总或多或少出现在Jsp上,即使可以做到不出现Java代码,但做过复杂架构系统的开发者都知道,代价也是很昂贵的,并且在可维护性、和网页设计师的集成开发上存在一定的困难,所以我们在这里能感觉到,Servlet+JavaBean+Velocity的模式较好的实现了OOD的概念。而在效率上,大家也不用担心,此种结合方式比Servlet+Jsp的方式要高效一些。

愿意了解Velocity的人应该不少,但真正实用到项目的,也许不多(还是有些项目在使用,如Jute),毕竟和Jsp比起来,Jsp更标准、更广泛使用和有不少开发工具已经支持Jsp开发。但Velocity的功能不会仅仅局限在和Jsp竞争的局面,由上可看出它在自动代码输出方面功能很强,前面提到Turbine就是采用Velocity来生成很多代码,你也可以稍加改动就可以做成代码生成器,或其他模版生成上,都是很不错的想法。

好了,我们再来看看要深入Velocity来做项目,还需要注意的一些常见问题吧,首先是国际化的问题,

Velocity本身支持模版的国际化编码转换,看看Velocity提供的方法:

Public Template getTemplate (Stirng template, String encoding),

由此推测这样做其实不能彻底的做到国际化。

最简单的在Struts中国际化的概念,即在Jsp上使用国际化语言标签的方式来做到,而每种语言采用不同的语言标签库的方式,引申到这里,其实手工来做一样可以做到,只不过需要稍加手工处理而已。

好在已经有人处理了上面所说问题,做成了Velocity的tools: MessageTool,提供了变量text包含国际化标签,这样只需要简单的编写标签代码即可,如:$text.get(‘title’),更多具体的内容还可在http://jakarta.apache.org/velocity/tools/struts/MessageTool.html 中了解。

好了,基于Velocity的介绍我们就说这么多,再说说其他引伸方面的内容吧。有人评论Velocity不是标准的MVC结构,没错,刚开始我们就说过Velocity只是Model和View之间的良好结合,只是个好的模版引擎,毕竟还没有形成MVC三者良好的结合。好在Apache又基于Struts和Velocity的结合,推出了VelocityStruts,这部分的陈述我们可以在后面的专题里再推出,这里简单介绍它的概念,它是在Struts的结构上,在业务逻辑处理的Action后,把业务流程转向基于Velocity的显示层,从而代替Jsp作为View层。以上我们也看到了所举的例子基本上只是基于原理和演示,没有和Web开发紧密结合起来,这方面内容我们在讲述VelocityStruts的内容时再来结合吧。

谈到Velocity,在这里要顺便提提FreeMarker,FreeMarker也是一种模版引擎,和Velocity功能基本类似,都是简单和轻量级的工具,但功能上较Velocity有不少增强的地方,这我们也在以后的文章中再来深入了解吧。
分享到:
评论

相关推荐

    generator-velocity:使用 Java Velocity 模板搭建前端 Web 应用程序

    令人敬畏的图像优化(通过 OptiPNG、pngquant、jpegtran 和 gifsicle) 使用 PhantomJS 进行摩卡单元测试Mave 亲戚 (可选) 有关generator-velocity可以为您做什么的更多信息,请查看我们的package.json使用的。...

    three-nebula:用于Three.js的基于WebGL的粒子系统引擎

    有关更多,请查看,,和。 特征 与three@0.122.0完美兼容性 从JSON对象实例化three-nebula粒子系统的能力 从精灵和3D网格创建粒子系统的能力 多种粒子行为和初始值设定项 安装 npm npm i --save three-nebula ...

    matlab条纹代码-mosquito_arena_my_code:mosquito_arena_my_code

    (有关如何制作视觉图案的更多详细信息,请参见visual_patterns / README.md。) 用于运行实验的脚本为white_velocity_noise_no_odor_to_fluctuating_CO2.m。 在文件顶部设置相关参数。 您应该设置由常量给定的参数...

    基于jbpm与activiti的工作流平台技术架构介绍

    同时,由于其架构的开放性,采用业界开放性的技术及流程标准,使其能够成为企业SOA架构的流程基础平台及开发平台,越来越多的企业更偏向采用开源的平台来解决其内部的信息化平台的要求,BPMX3却允许更多的平台系统接...

    Luxor XUL-开源

    Luxor是Java中的开源XML UI语言(XUL)工具包,可让您使用XML来构建UI,其中包括Web服务器,门户引擎(支持RSS),模板引擎(Velocity),脚本解释器(Python)和更多的。

    Spring中文帮助文档

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Spring API

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Maven权威指南 很精典的学习教程,比ANT更好用

    多模块 vs. 继承 9.6.2.1. 简单项目 9.6.2.2. 多模块企业级项目 9.6.2.3. 原型父项目 10. 构建生命周期 10.1. 简介 10.1.1. 清理生命周期 (clean) 10.1.2. 默认生命周期 (default) 10.1.3. 站点生命...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 ...

    spring chm文档

    9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误...

    Spring 2.0 开发参考手册

    9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误...

    外文翻译 stus MVC

    Tags are one of the things that make Struts unique compared to other frameworks like Velocity. Note: "Think thin" when extending the Action class. The Action class should control the flow and not ...

    单点登录源码

    内容管理系统:支持多标签、多类目、强大评论的内容管理,有基本单页展示,菜单管理,系统设置等功能。 &gt; zheng-pay - 一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的...

Global site tag (gtag.js) - Google Analytics