目录

  • 什么是velocity
  • 应用场景
  • 组成结构
  • 快速入门
    • 总结
  • 基本语法
    • 注释
    • 非解析内容
    • 引用
      • 变量引用
      • 属性引用
      • 方法引用
    • 指令
      • 流程控制指令
        • #set 指令
        • #if/#elseif/#else
        • #foreach
      • 引入资源指令
        • include
        • parse
        • define
        • evaluate
      • 宏指令
  • 综合案例
    • 需求分析
    • 步骤分析
    • 代码实现
      • controller模板
      • service 模板
      • serviceimpl 模板
      • mapper 模板
      • 公共方法
      • 测试类

什么是velocity

也就是前端程序员写velocity模板,后端程序员写数据模型,最后整合就是展示给用户的东西

应用场景

组成结构

快速入门





以上就是创建了一个maven项目

我们要在项目中使用velocity,所以要导入对应的依赖

    <dependencies>
<!--        velocity  的核心包--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.2</version></dependency><!--        进行单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

以上是导入依赖。
现在开始创建模板,这个模块在什么地方都可以,最后只要路径对了就可以,我们习惯放到resources文件夹下

以上先创建一个HTML模板,之后修改这个文件的后缀,变为vm



以上是最简单的语法。

之后我们要写测试类,里面调用这个vm文件,将数据写到这个vm里面

public class quickstart {@Testpublic void test1() 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","jing");
//        4 加载velocity的模板文件Template template = Velocity.getTemplate("vms/01-quickstart.vm", "utf-8");//        5  合并数据到模板FileWriter fileWriter = new FileWriter("D:\\javacode\\velocity_01\\src\\main\\resources\\html\\01quick.html");template.merge(velocityContext,fileWriter);//        6  释放资源fileWriter.close();}
}

执行完以上的语句,那么在新的文件夹下,就会生成一个HTML文件

总结

就是前端写velocity模板,后端写代码,将数据填充到模板里面,生成HTML文件

以后就是 填充的内容需要是动态的,使用的模板是动态的,输出的HTML的路径是动态的,其他的都是固定的。

基本语法


也就是根据这些语法,我们可以将在context里面的内容填充到模板中

注释


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
## 这个是单行注释#*
* 这个是多行注释
*
* *##**
*   这个是文档注释
* *#你好,${name},我是好人
</body>
</html>

在vm文件里面,写的注释,最后生成HTML文件,是不会出现在HTML里面的,但是会用空区域代替
有注释的地方,在HTML里面会有很多的空区域

非解析内容



也就是在模板里面写的什么,最后在HTML里面就会展示什么

引用

变量引用


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>引用变量</h1>常规语法:$name11
正规语法:${name11}常规语法:  $!name11
正规语法 :  $!{name11}</body>
</html>

属性引用

也就是变量是一个对象,我们想要对象里面的属性,所以这个就是属性引用


方法引用


指令

流程控制指令

#set 指令

模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
$user.username  ---  $user.password$str.split(" ")
$now.getTime()## 定义变量
#set($str = "hello")
#set($int = 10)
#set($arr = ["10","12"])
#set($boolean = true)
#set($map = {"key1":"values"})#set($name = "jing")
#set($strt = "你好 $name")## 获取变量$str
$int
$arr
$boolean
$map.key1
$name
$strt</body>
</html>

生成的HTML

#if/#elseif/#else

模板


#set($language = "java")#if($language.equals("java"))
java
#elseif($language.equals("python"))python
#end

生成的HTML

#foreach


在velocity里面存放list数据

        ArrayList<String> strings = new ArrayList<>();strings.add("152");strings.add("452");strings.add("8566");String[]  hobbi = new String[]{"ddd","888","8888"};velocityContext.put("strings",strings);velocityContext.put("hobbi",hobbi);

在模板里面进行遍历

#foreach($item in $hobbi)$item
#end#foreach($item in $strings)$item
#end

引入资源指令

include

#include("/vms/01-quickstart.vm")


都没有被解析,直接将引入的模板的里面的东西给复制过来了

parse

#parse("/vms/01-quickstart.vm")

define


这个就是 定义在这个里面的语法,其他的地方就可以使用

evaluate

#evaluate("#if($user.username == 'liujing' )  liuj #else jjj
#end")

宏指令


和 define指令比较,这个是动态的,意思是里面可以拿出变量里面的值

综合案例

需求分析

步骤分析

代码实现

创建一个ssm项目 或者springboot项目,可以实现对数据库的增删改查的项目就可以了,把velocity的依赖也导入


因为我们要生成以上的几层的数据,所以每一层我们都要写一个模板

controller模板


因为是模板,所以controller的前面的东西我们不写,现在我们建立了这个文件,里面开始写controller层的模板

package ${package}.controller;import ${package}.pojo.${className};
import ${package}.service.${className}Service;##  每个里面都要有
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Map;/*** @author jing* @date 2020/11/23--12:00* 一审信息*/@Controller
@RequestMapping(value = "/${classname}",method = RequestMethod.POST)
public class ${className}Controller {@Autowiredprivate ${className}Service ${classname}Service;/*** 查询列表* @param* @return*/@RequestMapping("/${classname}list")@ResponseBodypublic List<${className}> ${classname}list(){List<${className}>  ${classname}s  = null;try {${classname}s = ${classname}Service.list();return ${classname}s;} catch (Exception e) {e.printStackTrace();return null;}}/*** @author* @date* 保存*/@RequestMapping("/add${classname}")@ResponseBodypublic String add${classname}(${className}  ${classname}){try {${classname}Service.save(${classname});return "1";} catch (Exception e) {e.printStackTrace();return "0";}}/*** 修改* @param* @return*/@RequestMapping("/update${className}")@ResponseBodypublic String update${className}( ${className}  ${classname}){try {${className}Service.update(${classname});return "1";} catch (Exception e) {e.printStackTrace();return "0";}}
}

service 模板

package ${package}.service;import ${package}.pojo.${className};import java.util.List;public interface ${className}Service {//查询所有的用户信息List<${className}> list();
##    保存数据void save(${className} ${classname});
##    更新数据void update(${className} ${classname});
}

serviceimpl 模板

package ${package}.service.impl;import ${package}.mapper.${className}Mapper;
import ${package}.pojo.${className};
import ${package}.service.${className}Service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;/*** @Transactional:*  此注解的作用是开启事务管理,相当于我们以前在applicationcontext.xml*  文件中配置的事务管理。*/
@Transactional
@Service
public class ${className}ServiceImpl implements ${className}Service {//声明mapper层属性@Autowiredprivate ${className}Mapper ${classname}Mapper;##  查询list@Overridepublic List<${className}> list() {return ${classname}Mapper.list();}## 保存@Overridepublic void save(${className}  ${classname}) {return ${classname}Mapper.save(${classname});}##    更新@Overridepublic void update(${className}  ${classname}) {return ${classname}Mapper.update(${classname});}
}

mapper 模板

package ${package}.mapper;import ${package}.pojo.${className};import java.util.List;public interface ${className}Mapper {//查询所有的用户信息List<${className}> list();
##    保存数据void save(${className} ${classname});
##    更新数据void update(${className} ${classname});
}

公共方法

我们已经写完了模板,现在开始写一个公共方法,就是我们代码生成的路径,也就是用这些模板,生成的java文件,我们要放到哪里


public class GenUtils {/*** @param  date    填充到模板中的数据* @param  templates   模板的名称* @param  zip  输出流* @date 2021/8/25--22:01*/public  static  void  generatorCode(Map<String,Object> date, List<String> templates, ZipOutputStream zip){//        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(date);
//        4 加载velocity的模板文件(因为有多个,所以要遍历)for(String tem:templates){Template template = Velocity.getTemplate(tem, "utf-8");
//            5  合并数据到模板
//            创建一个输出流StringWriter stringWriter = new StringWriter();
//            将数据放到输出流里面template.merge(velocityContext,stringWriter);
//            把代码数据输出到zip文件里面String fileName = getFileName(tem, date.get("className").toString(), date.get("package").toString());try {zip.putNextEntry(new ZipEntry(fileName));IOUtils.write(stringWriter.toString(),zip,"UTF-8");IOUtils.closeQuietly(stringWriter);} catch (IOException e) {e.printStackTrace();}}}/*** @param  template  模板名称,也就是我们要使用哪个模板生成java文件* @param  className  实体类名称  User* @param  packageName  包名称  在哪个包下生成* @date 2021/8/25--22:01* @return  main/java/com/controller/UserController.java* main/java/com/service/UserService.java* main/java/com/service/impl/UserServiceimpl.java* main/java/com/mapper/UserMapper.java*/public static String  getFileName(String template,String className,String packageName){String packagePath = "main"+ File.separator +"java"+ File.separator;//        如果包名不为空,我们在基础路径上,拼接这个包名if(StringUtils.isNullOrEmpty(packageName)){packagePath+= packageName.replace(".",File.separator)+File.separator;}
//        看传进来的是什么模板,根据不同模板,拼接不同的路径if(template.contains("Controller.java.vm")){return packagePath+"controller"+File.separator+className+"Controller.java";}if(template.contains("Service.java.vm")){return packagePath+"service"+File.separator+className+"Service.java";}if(template.contains("ServiceImpl.java.vm")){return packagePath+"service"+File.separator+"impl"+File.separator+className+"Serviceimpl.java";}if(template.contains("Mapper.java.vm")){return packagePath+"mapper"+File.separator+className+"Mapper.java";}return null;}public static void main(String[] args) {String fileName = getFileName("Controller.java.vm","User","com");System.out.println(fileName);}}

测试类

package com;import com.sun.org.apache.bcel.internal.generic.NEW;
import com.utils.GenUtils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipOutputStream;/*** @author * @date 2021/8/25--22:38*/
public class testy {public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>();map.put("package","com");map.put("className","Student");map.put("classname","student");ArrayList<String> strings = new ArrayList<>();strings.add("vm/Controller.java.vm");strings.add("vm/Mapper.java.vm");strings.add("vm/Service.java.vm");strings.add("vm/ServiceImpl.java.vm");File file = new File("D:\\data\\code.zip");try {FileOutputStream fileOutputStream = new FileOutputStream(file);ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);GenUtils.generatorCode(map,strings,zipOutputStream);try {zipOutputStream.close();} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}}
}


velocity笔记(一)什么是velocity,我们什么时候会使用到这个,基本语法,利用模板生成实体类的各层代码相关推荐

  1. MyGeneration学习笔记(1) : 使用MyGeneration生成存储过程和数据访问层代码

    MyGenertion是一款不错的代码生成ORM代码生成工具,下面是我学习过程中的一些笔记(总结了一下dOOdads C# Quick Reference文档,还有自己在使用和调试过程中遇到的问题及自 ...

  2. Velocity笔记--使用Velocity获取动态Web项目名的问题

    以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...

  3. 在 Spring 4.3.9下升级 Velocity 1.7.x to Velocity 2.0.x 出现的问题

    1: Spring 的  spring-context-support 报错 java.lang.NoClassDefFoundError: org/apache/velocity/runtime/l ...

  4. VTL(Velocity Templates Language,即Velocity模板语言)初识语法总结

    1.velocity是一门基于Java语言的视图表现层模板引擎,它可以取代jsp,比jsp更高效. 2.velocity变量的定义与引用 (1).定义一个变量:#set ($a = "vel ...

  5. Python学习笔记:使用PIL批量合成jpg+png图片,用于水印、合并图片,生成YOLO数据集+标注数据等等

    [Python学习笔记] 使用PIL,批量合成jpg+png图片,用于水印.合并图片,生成YOLO数据集+标注数据等等 起因:在了解很多关于YOLOv5的相关内容,于是尝试着去训练自己的游戏目标检测模 ...

  6. CN.Text开发笔记—利用反射将数据读入实体类

    在实际开发中,我们经常需要从数据库中读取数据并赋值给实体类的相应属性.在.Text的DataDTOProvider中存在大量这样的代码, 比如: public Role[] GetRoles(int  ...

  7. caffe卷积层代码阅读笔记

    转载自:http://blog.csdn.net/tangwei2014/article/details/47730797 卷积的实现思想: 通过im2col将image转为一个matrix,将卷积操 ...

  8. 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口

    JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...

  9. springmvc学习笔记--mybatis--使用插件自动生成实体和mapper

    由于表对象在开发过程中会增删字段,有时候需要重新生成实体和对应的mapper,这时候可以通过mybatis的插件的生成. 优点是快速简洁,缺点同样很明显:覆盖.因此,通常是在第一次搭建框架的时候使用, ...

最新文章

  1. js字符串截取函数substr substring slice使用对比
  2. RAC测试及命令示例
  3. SQL Server Management Studio Express出现一半中文一半英文的问题
  4. python numeric_Python pandas.to_numeric函数方法的使用
  5. java socketchannel api,SocketChannel API
  6. java 整数 引用传递_关于Java引用传递的一个困惑?
  7. 05-sqlyog的安装与基本使用
  8. html5的canvas动画,Canvas HTML5简介 · Canvas动画教程
  9. 台积电9月14日起不向华为供货;315曝光50多款App涉嫌内置SDK窃取隐私;Micronaut 1.3.7发布 | 极客头条...
  10. Atitit TPL(事务处理语言 目录 1.1. 事务隔离级别 1 1.2. Savepoint技术 1 2. Tpl 1 2.1.  打开事务 START TRANSACTION; 1 2.2.
  11. LoRa协议在Arduino上的应用——原理及代码分析(一)
  12. 剑指Offer题目汇总(持续更新中...)
  13. linux 命令行 双引号,每天一个Linux命令之shell单引号和双引号的经典解释
  14. 服务器虚拟化的技术和原理,虚拟化一、虚拟化技术基础原理
  15. Document-Level Relation Extraction with Adaptive Thresholding and Localized Context Pooling
  16. 什么是 MaxCompute
  17. MySQL----数据库概述
  18. 【转】NLP 的巨人肩膀(下)
  19. 使用map文件 查看stm32 堆栈大小 及 堆栈分配 图
  20. Go学习:切片slice的循环机制及性能

热门文章

  1. 电脑已连接无Internet访问解决记录
  2. 《软件方法(上)业务建模和需求》第2版 勘误(2021年9月更新)
  3. 没想到系列之YOLOv4:Optimal Speed and Accuracy of Object Detection
  4. uniapp+egg.js+react实现全栈笔记App
  5. datediff()函数的使用
  6. python idle使用教程_pythonidle中文教程
  7. 我从这篇文章中受到不少启发!
  8. Springboot 关闭或绕过 jwt用户验证
  9. VMware虚拟机的安装、创建及CentOS 7的安装
  10. uni-app监听窗口尺寸变化事件和隐藏键盘