velocity-engine-core是什么?Velocity模板引擎的使用
velocity-engine-core是什么?Velocity模板引擎的使用
- 1. 常见的模板引擎
- 2. Velocity 的语法
- 3.Velocity的使用
相信在日常开发中或多或少都听过或者使用过模板引擎,比如熟知的freemarker, thymeleaf等。而模板引擎就是为了实现View和Data分离而产生的。
而velocity-engine-core正是另一种模板引擎的引入依赖包,它就是Velocity。
1. 常见的模板引擎
-
thymeleaf
是一款用于渲染XML/XHTML/HTML5内容的模板引擎。它也可以 轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。也是springboot推荐的静态资源渲染的引擎。
-
freemarker
功能与Velocity差不多,但是语法更加强大,使用方便。是非常主流的模板引擎。
-
enjoy
Enjoy Template Engine 采用独创的 DKFF (Dynamic Key Feature Forward)词法分析算法以及独创的DLRD (Double Layer Recursive Descent)语法分析算法,极大减少了代码量,降低了学习成本,并提升了用户体验
-
velocity
不仅可以用于界面展示(HTML, XML等)还可以生成输入java代码,SQL语句等文本格式。我们公司就是使用Velocity来做代码的自动生成工具。
2. Velocity 的语法
关键字以 # 开头,变量以 $ 开头
2.1 定义变量
使用 #set 关键字
#set($name = "zhangsan")
#set(${h} = "hello $name") ##这里的name变量加不加 {} 都可以
#set($n = "${name}_new") ##这里的name变量就必须要加上{}了
#set($m = $n) ##重新赋值,如果有其他操作,需要向上面一样加上 ""#set($p = {}) ##定义对象,Java中的Map
#set($a = []) ##定义数组,Java中的List#set($v = $person.age) ##属性引用。 person是一个Java对象。
#set($v = $person.getName()) ##方法引用。
#set($v = $person.getName($type)) ##方法引用(带参数)。
2.2 变量的使用
以 $ 者 ${} 使用变量
#set($name = "zhangsan") ##定义变量
$name ##使用变量
${name} ##使用变量
${name}_abc ##必须加 {}
abc_$name ##可以不用加 {}
2.3 循环
使用 #foreach .... #end 使用循环
#set($list = ["北京", "上海", "深圳", "杭州"]) ##定义一个集合 #foreach($item in $list) 热门城市 ---> $item, 排名:[$foreach.count] #$foreach.index 是从0开始
#end
2.4 if判断
使用 #if(condition) ... #elseif(condition) ... #else ... #end 进行条件判断
#set($value = 1) ##定义一个变量#if($value == 0) value的结果是: $!value
#elseif($value == 1) value的结果是: $!value
#else value的结果大于1
#end//对象obj不为空才会执行里面的逻辑
#if($obj) ..... #end//对象obj为空才会执行里面的逻辑
#if(!$obj) ..... #end#等于字符串"abc" 才会执行里面的逻辑
if($obj == 'abc') ...... #end
2.5 关系操作符
可以使用 &&(与), ||(或), !(非) 来进行复杂的条件判断
#set($name = "")
#if(!$name) ##用于判空,如果是空,则为false, 取反后为true $!name 的年龄是: 13
#end #set($key = "velocity")
#set($flag = true)
#set($list = ["北京", "上海"])
#if($key && $key.contains("v") && $flag && $list.size() > 1) ## key 不为空并且包含v, flag 为true, list 元素数量大于1 条件成立......
#end
3.Velocity的使用
3.1 导入依赖
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
3.2 定义模板
文件名以 .vm 结尾 (例如:hello.vm)
#if($c == 15)-----> hello: $!name
#end#foreach($item in $list)集合中的元素:${item} , 索引:【$foreach.index】
#end$person.name 的 生日是 $person.birthday,年龄是 $person.getAge()
3.3 定义引擎并解析模板
public class VelocityTest {public static void main(String[] args) throws IOException {//1.定义一个模板引擎VelocityEngine ve = new VelocityEngine();ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());ve.init();//2.指定一个模板Template t = ve.getTemplate("hello.vm");VelocityContext ctx = new VelocityContext();//设置字符串ctx.put("c", 15);ctx.put("name", "velocity");//设置集合List<String> temp = new ArrayList<>();temp.add("北京");temp.add("杭州");temp.add("海南");ctx.put( "list", temp);//设置对象ctx.put("person", new Person("秋官", 30, LocalDate.now()));//合并到模板中, 可以是文件中//FileWriter fw = new FileWriter("demo.html");//t.merge(ctx, fw);//fw.close();StringWriter sw = new StringWriter();t.merge(ctx, sw);System.out.println(sw);}@AllArgsConstructor@Datapublic static class Person {private String name;private int age;private LocalDate birthday;}
}
除此以外,Velocity还提供了 Velocity-Tools工具包,他是Veloctiy下的一个子模块,参考gitee,Veloctiy-Tools主要包含2个部分:GenericTools和VelocityView ,前者提供了一些常用的工具类,比如DateTool, MathTool等等,后者主要是应用于web环境。
像我使用,使用velocity就是用来生成代码,所以导入 velocity-engine-core 就足够了,也没有导入springboot集成的velocity starter。
相关文章:
velocity-engine-core是什么?Velocity模板引擎的使用
velocity-engine-core是什么?Velocity模板引擎的使用 1. 常见的模板引擎2. Velocity 的语法3.Velocity的使用 相信在日常开发中或多或少都听过或者使用过模板引擎,比如熟知的freemarker, thymeleaf等。而模板引擎就是为了实现View和Data分离而产生的。 而…...
【华为od】存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。
存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。将数组所有成员初始化为0,将矩阵的[i, j]和[m,n]位置上元素修改成1后,在经过多长时间所有元素变为1。 输入描述 输入的前两个数字是矩阵大小。后面是数字…...

docker学习(七、搭建mysql8.2主从)
一、主库搭建 1.构建主库镜像 # 运行mysql镜像,配置端口3307为主库 docker run -p 3307:3306 --name mysql-master --privilegedtrue -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc…...

消费升级:无人零售的崛起与优势
消费升级:无人零售的崛起与优势 随着人们生活水平的提高,消费内容正在从生存型消费转向以精神体验和享乐为主的发展型消费。社会居民的消费结构不断变迁,明显呈现消费升级趋势。个性化和多元化消费势头正在崛起,特别是无人零售的自…...
【开题报告】基于SpringBoot的煤炭企业安全宣传学习平台的设计与实现
1.选题背景 煤炭企业作为我国能源行业的重要组成部分,承担着国民经济的支撑和推动作用。然而,煤炭生产过程中存在较高的安全风险,煤矿事故频发,给人员生命财产安全带来严重威胁,也给社会稳定和经济发展带来不利影响。…...

机器连接和工业边缘计算
软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合,并采用架构蓝图和最佳实践来满足最终用户的需求。此外,边缘计算(Edge Computing)也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…...

java系列-LinkedHashMap
1.插入新节点时,会将该节点加到链表尾部 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMapEntry<K,V> head;/*** The tail (young…...

【linux】查看CPU和内存信息
之前咱们一起学习了查看内存的和CPU的命令。 mpstat : 【linux】 mpstat 使用 uptime:【Linux】 uptime命令使用 CPU的使用率:【linux】查看CPU的使用率 nmon :【linux】nmon 工具使用 htop :【linux】htop 命令…...

【产品经理】产品专业化提升路径
产品专业化就是上山寻路,梳理一套作为产品经理的工作方法。本文作者从设计方法、三基座、专业强化、优秀产品拆解、零代码这五个方面,对产品经理的产品专业化进行了总结归纳,一起来看一下吧。 产品专业化就是上山寻路,梳理一套作为…...
Ubuntu(WSL)卸载与安装指定版本的 openssl
卸载 openssl 1)查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2)删除软件安装包 apt-get purge openssl 3)删除配置文件 rm -rf /etc/ssl 安装 ope…...
leetcode1115. 交替打印 FooBar
题目 1115. 交替打印 FooBar 给你一个类: class FooBar {public void foo() {for (int i 0; i < n; i) {print("foo");}}public void bar() {for (int i 0; i < n; i) {print("bar");}} }两个不同的线程将会共用一个 FooBar 实例&am…...
qt有哪些常用控件
Qt 是一个跨平台的应用程序开发框架,提供了许多不同类型的控件来构建用户界面。以下是一些常见的 Qt 控件: 按钮(Button):用于执行操作或触发事件。文本框(TextBox):用于输入和显示文…...

docker 手工redis7.x cluster
IP端口192.168.0.816379/6380192.168.0.826379/6380192.168.0.1146379/6380 mdkir /data/{6379,6380}cat <<END> /data/6379.conf # 端口号 port 6379# 设置客户端连接后进行任何其他指定前需要使用的密码 #requirepass 123456 ## 当master服务设置了密码保护时(用re…...
【华为OD题库-082】TLV解析II-Java
题目 两端通过TLVQ格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。具体要求如下: (1)消息包中多组tag、length、value紧密排列,其中tag,length各占1字节(uint8),value所占字节数等于len…...
Memcached学习
一、概念 Memcached是一个开源的,高性能的内存缓存软件,从名称上看Mem就是内存,二cache是缓存。作用通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数…...

2024最新金三银四软件测试面试题
一直以来大大小小参与过不少面试,遇到过不少坑,但是没来的及好好总结汇总下。现在把之前遇到的问题汇总下,希望以后自己能加深印象。 1、appium 怎么定位toast弹框 appium1.6以后回答需要升级u2进行定位。 2、什么是事务,知道事…...

微信小程序动态加载图表[echart]
1.引入Echarts (1)将ec-canvas文件拷贝下来放到你自己的项目中: (2)在你需要使用Echarts的页面的json文件中引入Echarts "usingComponents": {"ec-canvas": "../utils/ec-canvas/ec-canva…...

《opencv实用探索·十八》Camshift进行目标追踪流程
CamShift(Continuously Adaptive Mean Shift)是一种用于目标跟踪的方法,它是均值漂移(Mean Shift)的扩展,支持对目标的旋转跟踪,能够对目标的大小和形状进行自适应调整。 cv::CamShift和cv::me…...

MAP: Multimodal Uncertainty-Aware Vision-Language Pre-training Model
问题 多模态语义理解通常需要处理不确定性,这意味着获得的消息往往涉及多个目标。这种不确定性对我们的解释来说是有问题的,包括模式间和模式内的不确定性。人们很少研究这种不确定性的建模,特别是在未标记数据集的预训练和特定任务下游数据…...

【SpringCache】快速入门 通俗易懂
1. 介绍 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caffeine Redis(常用…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...