velocity学习(2)--VTL 语法

注释

单行注释为 ##,多行注释为#* *#,被注释的内容不会被模板引擎解析,文档注释是:如下:

#**
*@author xxx
*@version 5
*#

变量、属性、方法的引用

VTL 可以对变量、属性、方法进行引用。显示输出一个变量时,输出它的 toString 方法。这和 System.out.print()类似。输出一个属性时,该属性必须是可访问的,或者其 get 方法是可访问的,引用一个方法则会显示该方法的输出结果。

案例:

person 实体类

package com.wuk.entity;

public class Person {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    public String sayHello(String say){

        return say+"is a boy";
    }
}

DemoServlet.java

package com.wuk.velocity;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.wuk.entity.Person;


@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request,response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Person person=new Person();
        person.setAge(12);
        person.setName("wuk");
        request.setAttribute("person", person);
        request.getRequestDispatcher("/WEB-INF/hello.vm").forward(request, response);
    }

}

hello.vm

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Test Velocity</title>
</head>
<body>
<p>$person</p>
<p>$person.name</p>
<p>$person.toString()</p>
<p>$person.sayHello("wuk")</p>
</body>
</html>

从这个案例可以看出 在velocity页面中不仅仅可以调用对象,甚至都可以直接调用对象的方法,甚至还可以传参。


#set()的用法

除了可以像$person 这样引用一个对象实例,还可以用#set()在模板上下文中设置一个对象。

#set($person = "Tom")
$person

还可以设置一个 List 或 Map 对象,可以调用其 get()、isEmpty()等方法

##设置list集合对象
#set($l=["a", "b", "c"])
##设置Map集合对象
#set($s={"a":"aaa", "b":"bbb", "c":"ccc"})
<p>$l.get(1)</p>
<p>$l.isEmpty()</p>
<p>$s.get("a")</p>

输出结果:

b
false
aaa

#if()...elseif()...else...#end

#set($a = 10)
#if($a > 0)
    <p>bigger than 0</p>
#elseif($a > 5)
    17
    <p>bigger than 5</p>
#elseif($a == 10)
    <p>equals to 10</p>
#else
    <p>others</p>
#end

判断只能比较相同类型的变量,如果==两端变量类型不同,则直接返回 false。对于字符串类型,字符串内容相同则返回 true。对于由 servlet 传入的类型,比如一个叫做 User的 JavaBean,比较实际上是调用其 equals()方法,所以如果可以通过重写 User 的 equals()和 hashCode()方法改变该判断的行为。
比如:

#set($a="aaa")
#set($b="aaa")
#if($a==$b)
<p>true</p>
#end

结果为true
判断逻辑同样可以使用 Java 中的&& || !进行逻辑的组合。

#foreach($xxx in $xxxList)...#end

和 Java 相同,循环可以使用 foreach。用 foreach 迭代输出 List 和 Map。

#set($list=["a","b","c"])
#set($map={"a":"aaa","b":"bbb","c":"ccc"})

##List集合的遍历
<ul>
    #foreach($l in $list)
        <li>$l</li>
    #end
</ul>

##Map集合也可以进行循环遍历 遍历的是值
</ul>
    #foreach($m in $map)
        <li>$m</li>
    #end
</ul>

##Map集合
<ul>
    #foreach($m in $map.keySet())
        <li>$m: $map.get($m)</li>
    #end
</ul>   

迭代的过程中,velocity 给定了一个变量 velocityCount 来记录迭代次数。当然你也可以自己定义一个变量进行记录。同时还有一个 velocityHasNext 可以用来判定迭代是否完成。例子如下:

##List集合的遍历
<ul>
    #foreach($l in $list)

        <li>$velocityCount</li>
        <li>$l</li>
        <li>$velocityHasNext</li>
    #end
</ul>

我们可以利用 velocityCount 产生格行变色的效果。

##List集合的遍历
<table border="1" height="100px" width="100px"> 
            #foreach($l in $list)
              <tr style="background-color:
                #if($velocityCount%2==0)
                     #c3f3c3"
                #else
                     #f3c3f3"
                #end
              >
                <td>$l</td>
              </tr>
            #end
</table>

不过通常建议应该由 CSS 和 JS 进行布局外观的控制控制。

#include()和#parse()

#include()#parse()都是用于引入一段文本文件,但#include()引入的文本不会被模板引擎渲染,#parse()则引入一段可以被渲染的文本。

例子如下:
/WEB-INF/views/module.vm

#set($list=["aaa", "bbb", "ccc"])
<ul>
#foreach($l in $list)
<li>$l</li>
#end
</ul>

/WEB-INF/views/test.vm

#include("/WEB-INF/views/module.vm")
#parse("/WEB-INF/views/module.vm")

这里写图片描述

#stop

该指令可以停止模板引擎,主要用于调试。模板引擎停止后,不会输出任何后面的内容。例子如下:

#set($list=["aaa", "bbb", "ccc"])
<ul>
#foreach($l in $list)
<li>$l</li>
#stop
<li>$l</li>
#end
</ul>
<p>test</p>

宏定义

熟悉 C 语言就应该知道宏定义的用途,C 语言中宏定义就是文本的替换,可以用来设定常量,甚至将一些函数封装到宏定义。velocity 的宏定义也是文本替换,但写法则更类似于直接定义函数

例子如下:

##宏的定义
#macro(show_table $list)
    <table border="1" height="100px" width="100px"> 
            #foreach($l in $list)
              <tr style="background-color:
                #if($velocityCount%2==0)
                     #c3f3c3"
                #else
                     #f3c3f3"
                #end
              >
                <td>$l</td>
              </tr>
            #end
    </table>
#end

#set($list=["a","b","c","e"])
##宏的引用
#show_table($list)

#set($list1=["1","2","3","4"])
#show_table($list1)

通过宏定义,我们可以把一些公用的部分抽取出来进行封装,重复利用。宏定义声明的参数可以是变量,List,Map,基本 Java 类型和字符串。

猜你喜欢

转载自blog.csdn.net/wu2374633583/article/details/80143633