模板配置

大约 9 分钟

模板配置

简介:

    当前咱们项目使用的代码生成模板是 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
    *#
    
  3. 文档注释

    #**
    文档注释内容1
    文档注释内容2
    **#
    
  4. 示例

    图片

    <!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 ...)

示例:

图片

图片

模板配置

介绍:配置自己的模板,通过自己的模板生成代码

首先找到 开发管理 下边 模板管理

图片

点击 新增 按钮,输入基本信息

图片

点击 新增 按钮,按照规范进行配置

图片

图片

图片

可以选择 模板校验语言 以及 模板样式 ,在代码编辑器中编写自己的模板即可。

图片

编写自己的模板 ,编写好点击 确定 按钮即可生成模板

图片

图片

上次编辑于: