Fork me on GitHub

velocity 基本语法

  velocity 是一个基于Java的模板引擎框架,它允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。

优点

velocity相比于jsp有如下优点:

  • velocity将Java代码从网页中分离出来,使页面开发者专注于前端页面的开发,后端设计者专注于代码的书写,很好的实现了前后端分离。
  • velocity加载速度远远优于jsp。原因在渲染机制时再说。
  • velocity最大的优点是采用了模板缓冲技术,在模板缓冲机制的作用下,模板不再是每次请求都从磁盘中获取,更多的是在缓冲区保存和解析,当我们在开发过程中,一般是禁用缓存的,因为此时页面较少同时也要求页面实施更新,当我们开发完成之后,此时就要启用缓存了,所以velocity的加载速度远远高于jsp。

渲染机制

  velocity的加载速度之所以远远优于jsp,主要原因是二者的加载方式不同,下面分别来一一介绍:

  • 1 jsp的加载方式主要是先将jsp页面编译成servlet,再由servlet处理用户的请求

    JSP容器管理JSP页面生命周期分为两个阶段:转换阶段和执行阶段,当有一个对JSP页面的客户请求到来时,JSP容器将JSP页面转换为Servlet源文件,然后调用javac工具编译源文件生成字节码文件,接下来,Servlet容器加载转换后的Servlet类,实例化一个对象处理客户端的请求,请求处理完成后响应对象被JSP容器接收,容器将HTML格式的响应信息发送给客户端。
  • 2 velocity 将页面代码解析成语法树:

    velocity 渲染这段代码将从根节点ASTproces开始,按照深度优先遍历算法开始遍历整棵树。
    Velocity的语法相对简单,所以它的语法节点并不是很多,总共有50几个,它们可以划分为如下几种类型。
      1. 块节点类型:主要用来表示一个代码块,它们本身并不表示某个具体的语法节点,也不会有什么渲染规则。这种类型的节点主要由ASTReference、ASTBlock和ASTExpression等组成。
      2. 扩展节点类型:这些节点可以被扩展,可以自己去实现,如我们上面提到的#foreach,它就是一个扩展类型的ASTDirective节点,我们同样可以自己再扩展一个ASTDirective类型的节点。
      3. 中间节点类型:位于树的中间,它的下面有子节点,它的渲染依赖于子节点才能完成,如ASTIfStatement和ASTSetDirective等。
      4. 叶子节点:它位于树的叶子上,没有子节点,这种类型的节点要么直接输出值,要么写到writer中,如ASTText和ASTTrue等。
    Velocity读取vm模板根据JavaCC语法分析器将不同类型的节点按照上面的几个类型解析成一个完整的语法树。
      在调用render方法之前,Velocity会调用整个节点树上所有节点的init方法来对节点做一些预处理,如变量解析、配置信息获取等。这非常类似于Servlet实例化时调用init方法。Velocity在加载一个模板时也只会调用init方法一次,每次渲染时调用render方法就如同调用Servlet的service方法一样。

语法及使用

  当我们需要在web应用中使用velocity,首先需要配置velocity,这里以spring boot为例。(由于spring 4.x开始不支持velocity,所以spring boot版本要在1.4.0之前)。
  在springboot中配置velocity很简单,只需要在配置文件application.yml中加上如下配置即可

1
2
3
4
5
6
7
spring:
velocity:
charset: UTF-8
resource-loader-path: classpath:/templates/
suffix: .vm
toolbox-config-location: configs/toolbox.xml
check-template-location: true

  以上配置了velocity模板语言的编码格式为:UTF-8,文件存在于/templates目录下,文件的后缀为.vm文件

基本语法
  • 1 “#”用法
    “#”表示velocity脚本语句,常用的有: #parse、#set、#if、#else、#end、#foreach、#marco。用法如下所示:
  • 2 “$”用法
    “$”表示velocity变量。$msg $item等都表示为变量。
  • 3 “!”用法
    “!”表示当变量为空时,强制将变量置为空。通常和”$”一起用,$!msg 表示将msg信息打印出来,如果msg变量为空,不是在页面中显示“msg”字符,而是强制将msg置为空。
  • 4 “{}”用法
    “{}”用来标识velocity变量,常于”$”连用,例如${msg}。
脚本语句
  • 1 #parse
      表示将其它文件引用到当前文件中,常用于事先定义好页面中需要引用的css、js文件,将其独立定义到一个文件中,然后在多个文件中引用此文件。例如:
    1
    2
    #parse "common/header.vm"
    #parse "common/footer.vm"

  以上例子中的header.vm和footer.vm表示即为事先定义好的头文件和尾文件,里面引用了大量的css、js文件,使用#parse即可将其引入。#parse可以有效地减少页面冗余。

  • 2 #set
      #set主要是用于在页面中定义变量或者向一个变量或者属性赋值,其格式为:#set($foo=”bar”)或者#set($foo.bar=$test) 。
    1
    2
    ##设置总页数
    #set($pages = $lists.pages)

  注意:在万不得已的时候,不要在页面视图自己声明Velocity脚本变量,也就是尽量少使用#set。有时候我们需要在页面中显示序号,而程序对象中又没有包 含这个序号属性同,可以自己定义。

  • 3 #if 、#else
      #if一般都是和#else组合在一起使用,表示一组条件语句的判断,后面还常常跟着#end.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #if($msg)
    <script>
    alert('$!msg');
    </script>
    #else
    <script>
    alert('111');
    </script>
    #end

  以上的脚本表示当对象msg存在时打印出msg的内容,不存在时输出111

  • 4 #foreach
      #foreach在页面中使用比较多,表示循环读取list集合中的内容,并进行相应的处理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #foreach($menu in $menus)
    <dl id="menu-$!menu.menuId">
    <dt><i class="Hui-iconfont"> $!menu.menuIcon </i> $!menu.menuName <i class="Hui-iconfont menu_dropdown-arrow">&#xe6d5;</i></dt>
    <dd>
    <ul>
    #foreach($menuItem in $menu.listMenus)
    <li><a _href="$!menuItem.menuUrl" data-title="$!menuItem.menuName" href="javascript:void(0)">$!menuItem.menuName</a></li>
    #end
    </ul>
    </dd>
    </dl>
    #end

  以上代码表示遍历menus中的内容,然后在页面上显示相对应的菜单信息,实现动态菜单的显示。

  • 5 #macro
      #macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。
    1
    2
    3
    4
    5
    #macro(orderPic $type)
    #if ($orderField.equals($type))
    <img src="http://images.cnblogs.com/ico/${orderType}.gif">
    #end
    #end

  具体的调用如:头衔#orderPic(“title”)。经过测试,宏不支持方法重载

velocity其它用法
  • 1 逻辑运算符
      velocity中逻辑运算符主要包括以下几种: == 、&&、 ||、 !用法和Java中一样。
  • 2 $velocityCount
      这个变量在velocity属性文件中定义,在#foreach的时候可以用得上,比如我foreach一个List时,我们可以使用$velocityCount判断完成形如“张三,李四”的输出(李四后面没有逗号)
  • 3 注释
      单行## XXX
      多行#* xxx
  • 4 #stop 停止执行并返回
  • 5 定义宏Velocimacros ,相当于函数 支持包含功能
    1
    2
    3
    4
    5
    #macro( d )
    <tr><td></td></tr>
    #end
    调用
    #d()
-------------本文结束感谢您的阅读-------------
你的支持是我最大的动力