模板配置
模板配置
简介:
当前咱们项目使用的代码生成模板是 velocity 模板引擎。介绍一下咱们项目中如何使用自定义模板生成代码。
Velocity简介
1.velocity简介:
Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java
对象的数据,填充到模板中,从而实现界面和java
代码的分离
2.应用场景:
- Web应用程序:作为为应用程序的视图,展示数据。
- 源代码生成 :velocity可用于基于模板生成Java源代码
- 自动电子邮件:网站注册,认证等的电子邮件模板
- 网页静态化:基于velocity模板,生成静态网页
3.velocity结构:
Velocity主要分为app、context、runtime和一些辅助util几个部分。
- app模块:主要封装了一些接口,暴露给使用者使用。主要有两个类,分别是Velocity(单例)和VelocityEngine。
- Context模块:主要封装了模板渲染需要的变量
- Velocity主要分为app、context、runtime和一些辅助util几个部分。
- Runtime模块:整个Velocity的核心模块,Runtime模块会将加载的模板解析成语法树,Velocity调用mergeTemplate方法时会渲染整棵树,并输出最终的渲染结果。
- RuntimeInstance类为整个velocity渲染提供了一个单例模式,拿到了这个实例就可以完成渲染过程了。
快速入门
先创建maven项目
在pom.xml中引入依赖
<dependencies> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
在
resource
下创建一个目录vms
用来存放模板。在mvs
目录下创建一个01-quickStart.vm
的文件,并且编写一个简单的html
界面<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Velocity_01</title> </head> <body> hello.${name} </body> </html>
编写测试类进行测试
import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; public class TestVelocity { @Test public void test01() throws IOException { //1.设置velocity的资源加载类 Properties properties = new Properties(); properties.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(properties); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); velocityContext.put("name","velocity"); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/01-quickStart.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("E:\\IntelliJ\\project\\velocity-learn\\velocity01\\src\\main\\resources\\data\\quickStart.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }
生成后
基础语法
VTL介绍
Velocity Template Language(VTL),是Velocity中提供的一种模版语言,旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中
VTL的语句分为4大类:注释,非解析内容,引用和指令。
注释语法
行注释
## 行注释内容
块注释
#* 块注释内容1 块注释内容2 *#
文档注释
#** 文档注释内容1 文档注释内容2 **#
示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01</title> </head> <body> ## 行注释内容 #* 块注释内容1 块注释内容2 *# #** 文档注释内容1 文档注释内容2 **# </body> </html>
生成后:
非解析内容
所谓非解析内容也就是不会被引擎解析的内容。
语法:
#[[
非解析内容1
非解析内容2
]]#
示例:
在velocity容器中添加了一个name属性,然而我在模板中不想使用这个name属性,就可以使用这个这个语法不让他解析,如图所示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>velocity_01</title>
</head>
<body>
hello.#[[${name}]]#
</body>
</html>
生成后:
引用
变量引用
语法:
引用语句就是对引擎上下文对象中的属性进行操作。语法方面分为常规语法(属 性 ) 和 正 规 语 法 ( 属性)和正规语法(属性)和正规语法({属性})。
$变量名: 若上下文中没有对应的变量,则输出字符串"$变量名" ${变量名}: 若上下文中没有对应的变量,则输出字符串"${变量名}" 结论:$变量名 和 ${变量名} 一样 $!变量名: 若上下文中没有对应的变量,则输出空字符串"" $!{变量名}: 若上下文中没有对应的变量,则输出空字符串"" 结论:$!变量名 和 $!{变量名} 一样
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01</title> </head> <body> ##$变量名,若上下文中没有对应的变量,则输出字符串"$变量名" ##${变量名},若上下文中没有对应的变量,则输出字符串""${变量名}" ##$!变量名,若上下文中没有对应的变量,则输出空字符串"" ##$!{变量名},若上下文中没有对应的变量,则输出空字符串"" 常规语法:$name 正规语法:${name} 常规语法:$!name 正规语法:$!{name} </body> </html>
name值不为空演示
name值为空演示
属性引用
语法:
$变量名.属性: 若上下文中米有对应的变量,则输出字符串"$变量名.属性" ${变量名.属性}: 若上下文中没有对应的变量,则输出字符串"${变量名.属性}" $!变量名.属性: 若上下文中没有对应的变量,则输出字符串"" $!{变量名.属性}: 若上下文中没有对应的变量,则输出字符串""
示例:
先创建一个User对象,添加
name
age
sex
属性package com.velocity; public class User { private String name; private String age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
创建一个
User
对象,将User
对象添加到velocity
容器中import com.velocity.User; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; public class TestVelocity { @Test public void test01() throws IOException { User user = new User(); user.setName("张三"); user.setAge("20"); user.setSex("男"); //1.设置velocity的资源加载类 Properties properties = new Properties(); properties.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(properties); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); velocityContext.put("user",user); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/01-quickStart.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("E:\\IntelliJ\\project\\velocity-learn\\velocity01\\src\\main\\resources\\data\\quickStart.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }
在模板中引用
User
对象中的数据<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01</title> </head> <body> 获取用户中的姓名 常规语法:$user.name 正规语法:${user.name} 常规语法:$!user.name 正规语法:$!{user.name} </body>
生成后示例:
方法引用
语法:
方法引用实际就是指方法调用操作,关注点返回值和参数,方法的返回值将输出到最终结果中
$变量名.方法([入参1[,入参2]*]?): 常规写法 ${变量名.方法([入参1[,入参2]*]?)}: 正规写法 $!变量名.方法([入参1[,入参2]*?): 常规写法 $!{变量名.方法([入参1[,入参2]*]?)}: 正规写法
示例:
将
str
date
对象添加到velocity
容器中import com.velocity.User; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.Properties; public class TestVelocity { @Test public void test01() throws IOException { //1.设置velocity的资源加载类 Properties properties = new Properties(); properties.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(properties); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); velocityContext.put("str","hello,velocity"); velocityContext.put("date",new Date()); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/01-quickStart.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("E:\\IntelliJ\\project\\velocity-learn\\velocity01\\src\\main\\resources\\data\\quickStart.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01</title> </head> <body> 获取用户中的姓名 常规语法:$str.split(",")-------$date 正规语法:${str.split(",")}-------${date} 常规语法:$!str.split(",")-------$!date 正规语法:$!{str.split(",")}-------$!{date} </body> </html>
生成后示例:
指令
set
作用:在页面定义变量 语法:#set($变量=值)
示例:
if/elseif/else
作用:进行逻辑判断 语法:
#if(判断条件)
....
#elseif(判断条件)
....
#else
....
#end
示例:
foreach
作用:遍历循环数组或集合 语法:
#foreach($item in $items)
$item
[#break]
#end
- $items:需要变量的对象或集合
- $item:变量名称,变量的每一项
- [#break]:退出循环
- 内置属性
- foreach.index:获取便利的索引,从0开始
- foreach.count:获取遍历的次数,从1开始
示例:
添加几个 User
对象并且创建模板
生成后的示例
引入资源
include
作用:引入外部资源,引入的资源不会被引擎所解析 语法:#include(resource) resource可以为单引号或双引号的字符串,也可以为**$变量**,内容为外部资源路径。注意:路径如果为相对路径,则以引擎配置的文件加载器加载路径作为参考
语法:#include("路径")
示例:
先配置模板要引入的模板
引入模板
parse
作用:引入外部资源,引入的资源将被引擎所解析 语法:#parse(resource) resource可以为单引号或双引号的字符串,也可以为**$变量**,内容为外部资源路径。注意:路径如果为相对路径,则以引擎配置的文件加载器加载路径作为参考
语法:#parse("路径")
示例:
引入模板
define
作用:定义重用模块(不带参数) 语法:
#define($模块名称)
模块内容
#end
示例:
evaluate
作用:动态计算,动态计算可以让我们在字符串中使用变量
语法: #evalute("计算语句")
示例:
宏指令
作用:定义重用模块(可带参数) 语法:
## 定义宏指令
#macro(宏指令名称 参数1 参数2...)
宏指令数据: $a ----> $b
#end
## 引用宏指令
#宏指令名称(参数1 参数2 ...)
示例:
模板配置
介绍:配置自己的模板,通过自己的模板生成代码
首先找到 开发管理
下边 模板管理
点击 新增
按钮,输入基本信息
点击 新增
按钮,按照规范进行配置
可以选择 模板校验语言
以及 模板样式
,在代码编辑器中编写自己的模板即可。
编写自己的模板 ,编写好点击 确定
按钮即可生成模板