Velocity模板引擎使用笔记

题记 html

    在公司的项目中,前台界面的展示是使用Velocity模版来实现的。如今利用一些时间,把之前的使用经验记录一下,不是什么宝典秘籍,也不是什么高深理论,纯粹为一些使用经验记录,开发知识备忘。 java

1.介绍 web

    Velocity是一个基于java的模板引擎(template engine)。它容许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。理解这句话很重要,Veocity模版的做用,实质上是让开发者在Web页面上能够直接使用java数据对象和命令。 spring

    “模版引擎”是一个总体的概念,Velocity只是其中的一种实现方式而已,也并不单单是java语言有模版引擎的概念,其余PHP、Python、C#都有可用的模版引擎,具体信息可参考:http://www.oschina.net/project/tag/136/template-engine?lang=0&os=0&sort=view  apache

    理解Velocity模版,还须要区分清楚“模版”和“页面”的概念;“模版”能够看做是一个等待注入数据的一个框架,在将这个框架注入相应的数据之后,就可以生成一个用户在浏览器中看到的“页面”(请求的后缀名能够为 .html 或 .do 或 .action 或者没有,这个根据MVC框架配置肯定)。 浏览器

2.如何在项目中使用? 服务器

(1)配置模版引擎: app

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
    <property name="resourceLoaderPath" value="/WEB-INF/views/" />
    <property name="configLocation" value="classpath:velocity.properties" />
</bean>

    resourceLoaderPath 属性指定模版文件在项目中的路径
框架

(2)配置视图解析器 网站

<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
    <property name="layoutUrl" value="layout/layout.vm" />
    <property name="suffix" value=".vm" />
    <property name="contentType" value="text/html;charset=UTF-8" />
</bean>

    suffix 属性指定模版文件的后缀名,视图解析器将会按照"模版逻辑名"+suffix 的格式来寻找模版文件。

    例如:return new ModelAndView("login"); 视图的逻辑名为 login,在解析视图时,velocityViewResolver会在 resourceLoaderPath 路径下寻找“login.vm”这个模版。

3."$"引用和"#"指令

    首先介绍两个特殊符号"$"和"#":以$开头的表示“引用”的意思,是指取得一些东东。而"指令"(Directives)则以#开头来表示,有点“作些什么动做”的意思。在模版页面中,引用一个java 数据对象时,使用 $userName 的格式,这个是简单的变量引用,还能够直接引用对象的属性,例如 $userInfo.userName 。"指令"以"#"开头,能够看做是VTL(Velocity Template Language)的流程控制语言,例如:赋值,循环,条件判断,引入模版,解析模版,宏调用等。下面是一个循环示例:

#foreach( $user in $userList) 
     #if( $user.userRole == 1)
        <h1>登陆成功:$user.userName</h1>
    #end
#end

    下面是一个条件判断的示例:

#if( $user.userRole == 2) 
    <h1>没有登陆权限:$user.userName</h1>
#elseif( $user.userRole == 3)
    <h1>您不在此权限范围:$user.userName</h1>
#end

4.颇有用的#parse()指令

    在页面中,常常遇到有相同内容的元素,好比几个页面的导航栏都是同样的,就能够专门定义一个 header.vm 模版,在其余须要使用到的页面中,直接 #parse("header.vm") 就ok了,注意,#parse() 后面是不加分号的。这样作的好处也是很明显的,若是要修改这个 header 的话,只须要修改一处,其余页面就所有更新了。以下为一个完整示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>示例网站</title>
</head>
<body>
    #parse("/layout/header.vm")
    <div class="page_wrap">
        我是页面中的文字,请无视~
    </div>
    #parse("/layout/footer.vm")
</body>

5.接收浏览器请求(SpringMVC),响应页面

@RequestMapping(value="/login", method = RequestMethod.GET)
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
    ModelAndView mv = new ModelAndView();
    UserInfo user = new UserInfo();
    user.setUserRole(1);
    user.setUserName("abc");
    mv.addObject("user", user);
    mv.setViewName("login");
    return mv;
}

6.扩展阅读

Velocity官方网站:http://velocity.apache.org/

Velocity模版使用指南:http://www.cnblogs.com/firstyi/archive/2007/11/01/945745.html

使用 Velocity 实现客户端和服务器端模板:https://www.ibm.com/developerworks/cn/java/j-velocity/index.html

 Spring MVC:使用 Web 视图技术:http://www.ibm.com/developerworks/cn/education/opensource/os-ag-springframe6/section4.html

相关文章
相关标签/搜索