Velocity模板引擎入门

类似于PHP中的Smarty,Velocity是一个基于Java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。从而实现界面和Java代码的分离,使得界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点。

另外,Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。


编写Velocity版的Hello World
获取Velocity相关JAR文件:

http://velocity.apache.org/网站上下载最新的Velocity,这里我们下载了velocity-1.7.zip

相关Jar包添加到项目中:

解压velocity-1.7.zip,发下其根目录下有两个JAR文件:

velocity-1.7.jar velocity-1.7-dep.jar

其中velocity-1.7-dep.jar包含了:

velocity-1.7.jar commons-collections-3.2.1.jar commons-lang-2.4.jar oro-2.0.8.jar(这些JAR文件位于解压目录的lib目录下)

在JAR包不冲突的情况下可以直接使用velocity-1.7-dep.jar

载类路径下添加velocity.properties文件:

该文件一般包含如下配置:

runtime.log = F:\project\MusicalInstrumentsStore\velocity_example.log  
file.resource.loader.path = F:\project\MusicalInstrumentsStore\vm  
input.encoding = UTF-8  
output.encoding = UTF-8  

untime.log指定日志文件存放位置

 

file.resource.loader.path指定模板的加载位置
input.encoding指定输入编码
output.encoding指定输出编码

 

模版的使用一共以下步骤:

1.初始化模版引擎

2.构建velocity上下文

3.变量值添加到上下文中

4.选择模版

5.合并模版和数据导出到输出流

 

//初始化模板引擎  
Velocity.init("src/velocity.properties");  
//获取VelocityContext  
VelocityContext context = new VelocityContext();  
//为Context设置变量  
context.put("title", "HelloWorld");  
context.put("author", "arthinking");  
//获取模板文件  
Template template = Velocity.getTemplate("helloworld.vm");  
StringWriter sw = new StringWriter();  
//使用模板文件的merge函数合并模板和context提供的变量,输出到StringWriter中  
template.merge(context, sw);  
sw.flush();  
System.out.println(sw.toString());  

编写helloworld.vm模板文件(保存在file.resource.loader.path设置的目录下):

${title}  
${author}  

一、基本语法

1、"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#include、#parse、#macro等;
如:
#if($info.imgs)
<img src="$info.imgs" border=0>
#else
<img src="noPhoto.jpg">
#end

2、"$"用来标识一个对象(或理解为变量);如:$i、$msg、$TagUtil.options(...)等。

3、"{}"用来明确标识Velocity变量;
比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这个变量的后面紧接着显示name字符,则上面的标签应该改成${someone}name。

4、"!"用来强制把不存在的变量显示为空白。
如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。
如:$!msg

 

Velocity模版的基本语法:

 

访问对象属性

和使用EL表达式差不多,直接使用”.”导航。
如访问object对象的id属性:${object.id }

 

遍历List集合

#foreach($element in $list)  
    #element  
#end  

使用判断语句

#if($condition)  
    true  
#else  
    false  
#end  

获取迭代索引值

默认使用变量名:$velocityCount
也可以自定义此变量名,在velocity.properties中设置

directive.foreach.counter.name=index  

 设置索引起始位置为0

directive.foreach.counter.initial.value=0  

遍历Map变量

#foreach($key in $map.keySet())  
    $key : $map.get($key)  
#end  

在模板中进行赋值

#set(#a=”Hello World!”)  
$a  
  
#set($array1=[1..10])  
#foreach($entry in $array1)  
    #entry  
#end  

使用Velocity模板引擎生成文件

//初始化模板引擎  
Velocity.init("src/velocity.properties");  
//获取VelocityContext  
VelocityContext context = new VelocityContext();  
//为Context设置变量  
context.put("content", "HelloWorld");  
context.put("who", "arthinking");  
//获取模板文件  
Template template = Velocity.getTemplate("helloworld.vm");  
//创建输出文件  
File output = new File("D:/Velocity/1.html");  
if(!output.getParentFile().exists())  
    output.getParentFile().mkdir();  
//创建输出流  
FileOutputStream outputStream = new FileOutputStream(output);  
OutputStreamWriter writer = new OutputStreamWriter(outputStream);  
BufferedWriter bufferedWriter = new BufferedWriter(writer);  
template.merge(context, bufferedWriter);  
  
bufferedWriter.flush();  
outputStream.close();  
bufferedWriter.close();  

 

 

此外再增加一些 Springmvc+Velocity

在servlet-context.xml中增加以下内容,如果有jsp的配置先注释掉

<beans:bean id="velocityConfig"  
<span style="white-space:pre">  </span>class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
    <beans:property name="resourceLoaderPath" value="/WEB-INF/views" />  
    <beans:property name="configLocation" value="classpath:common/velocity.properties" />  
</beans:bean>  
  
<beans:bean id="velocityViewResolver"  
    class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">  
    <beans:property name="suffix" value=".htm" />  
</beans:bean>  

在resources/common目录下创建velocity.properties

#encoding  
input.encoding  =UTF-8  
output.encoding=UTF-8  
contentType=text/html;charset=UTF-8  
  
#autoreload when vm changed  
file.resource.loader.cache=false  
file.resource.loader.modificationCheckInterval  =1  
velocimacro.library.autoreload=false  

新建testController

@RequestMapping(value="/test")  
@Controller  
public class TestController {  
    @RequestMapping(value="/index")  
    public String index(Model model) {  
        String name = "tester";  
        model.addAttribute("name", name);  
        return "test/index";  
    }  
}  

 

posted @ 2016-10-18 16:01  山河永慕~  阅读(638)  评论(0编辑  收藏  举报