注释

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

#**
*@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;}@Overridepublic 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 类型和字符串。

velocity学习(2)--VTL 语法相关推荐

  1. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  2. 《VTL语法参考指南》中文版[转]

    转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607935.aspx <VTL语法参考指南>中文版 源文见 http://ve ...

  3. velocity模板引擎-vm语法整理

    velocity模板引擎-vm语法整理 模板引擎我目前接触过两次, 第一次是在前后端还未分离时,考虑到部分页面数据比较固定,一定时间内不会变动,这样每次从后台加载数据渲染页面明显会消耗性能以及资源浪费 ...

  4. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  5. idea编译的文件怎么用cmd打开_JAVA学习册|基础语法|cmd输出HelloWorld

    看到这个标题,估计已经有小伙伴知识本文要讲什么了,好,下面我们就开始正文 学java最开始的地方 很多老师的书和视频中,在安装完jdk,配置好环境变量,都会带大家用记事本写一个HelloWorld,然 ...

  6. 学习webpack4 - ES6语法转化

    学习webpack4 - 基础配置 学习webpack4 - HTML处理 学习webpack4 - 样式处理 学习webpack4 - ES6语法转化 学习webpack4 - 第三方库的使用 学习 ...

  7. python学习三-基础语法

    python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...

  8. 掉进悬崖的小白,捡到python基础秘籍,学习第一周——语法基础,小游戏,无脑循环

    掉进悬崖的小白,捡到python基础秘籍,学习第一周--语法基础,小游戏,无脑循环 人生苦短,我用python 语言的种类: 语言的发展: 什么是python 搭建 Python开发环境: 集成开发环 ...

  9. Postgresql学习笔记-高级语法篇

    Postgresql学习笔记-高级语法篇 Postgresql 约束 Postgresql约束用于规定表中的数据规则. 如果存在违反约束的数据行为,行为会被约束终止. 约束可以在创建表的时候就规定(通 ...

  10. python lxml xpath_Python的lxml库学习之XPATH语法

    原标题:Python的lxml库学习之XPATH语法 预备阅读: 前言 前面已经学习了Python的lxml库,从库的名称来看,lxml包含了xml,所以lxml同样可以解析XML文档,而lxml使用 ...

最新文章

  1. php阿里的同步工具canal,基于阿里的Canal实现数据同步
  2. Python 2退出历史舞台 一句话证明它的重要性
  3. 优化混合云性能:数据管理技巧大公开
  4. php为什么在变量前加,php中变量前加、@等符号是什么意思?
  5. matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5
  6. centos 升级php5.5_CentOS 5.x 系统yum 升级php到5.2.x的方法(测试可用)
  7. 从平台架构到大屏可视化,一文读懂金融服务行业的数据分析
  8. python-批量插入多条数据-pymysql-executemany方法
  9. 【最小割】HDU 4971 A simple brute force problem.
  10. 【原创】Proton在Android上的编译
  11. eclipse 里边的 字体颜色代表了什么意思?
  12. 巡检设备RFID技术应用浅析
  13. 产品手记专注0基础转行产品经理平台
  14. 看漫画学焊接!5分钟教你电烙铁的焊接方法
  15. 【lizhi125】FindDupFile - 轻松查找与清理电脑上的重复文件、照片的绿色软件
  16. Python 如何被证明是 2021 年的转折点语言
  17. matlab机器人,MATLAB机器人可视化
  18. WinIo驱动级键盘模拟编程
  19. 阿里云ubuntu用vi创建并运行.c文件
  20. 实现一个联系客服对话框的前端部分

热门文章

  1. DDN周报|3月19日-3月25日
  2. SecurityContextHolder.getContext().getAuthentication()正常请求有时候获取authentioncation为空异常问题
  3. 铁路管理系统(C语言)
  4. 启动springboot项目 Error running ‘xxx‘
  5. Android界面编程之利用单选框和复选框实现对学历和爱好进行选择
  6. Winsock套接字开发网络聊天室实例(C/S)模式
  7. 二手车 电商+互联网金融的三种新玩法
  8. webrtc jitterbuffer 模块分析
  9. 环评师c语言题目,C语言考试——编程题_文库吧
  10. 还在收集资料?我这里有个github汇总