当前位置: 首页 > news >正文

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是什么&#xff1f;Velocity模板引擎的使用 1. 常见的模板引擎2. Velocity 的语法3.Velocity的使用 相信在日常开发中或多或少都听过或者使用过模板引擎&#xff0c;比如熟知的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镜像&#xff0c;配置端口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…...

消费升级:无人零售的崛起与优势

消费升级&#xff1a;无人零售的崛起与优势 随着人们生活水平的提高&#xff0c;消费内容正在从生存型消费转向以精神体验和享乐为主的发展型消费。社会居民的消费结构不断变迁&#xff0c;明显呈现消费升级趋势。个性化和多元化消费势头正在崛起&#xff0c;特别是无人零售的自…...

【开题报告】基于SpringBoot的煤炭企业安全宣传学习平台的设计与实现

1.选题背景 煤炭企业作为我国能源行业的重要组成部分&#xff0c;承担着国民经济的支撑和推动作用。然而&#xff0c;煤炭生产过程中存在较高的安全风险&#xff0c;煤矿事故频发&#xff0c;给人员生命财产安全带来严重威胁&#xff0c;也给社会稳定和经济发展带来不利影响。…...

机器连接和工业边缘计算

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

java系列-LinkedHashMap

1.插入新节点时&#xff0c;会将该节点加到链表尾部 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 &#xff1a; 【linux】 mpstat 使用 uptime&#xff1a;【Linux】 uptime命令使用 CPU的使用率&#xff1a;【linux】查看CPU的使用率 nmon &#xff1a;【linux】nmon 工具使用 htop &#xff1a;【linux】htop 命令…...

【产品经理】产品专业化提升路径

产品专业化就是上山寻路&#xff0c;梳理一套作为产品经理的工作方法。本文作者从设计方法、三基座、专业强化、优秀产品拆解、零代码这五个方面&#xff0c;对产品经理的产品专业化进行了总结归纳&#xff0c;一起来看一下吧。 产品专业化就是上山寻路&#xff0c;梳理一套作为…...

Ubuntu(WSL)卸载与安装指定版本的 openssl

卸载 openssl 1&#xff09;查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2&#xff09;删除软件安装包 apt-get purge openssl 3&#xff09;删除配置文件 rm -rf /etc/ssl 安装 ope…...

leetcode1115. 交替打印 FooBar

题目 1115. 交替打印 FooBar 给你一个类&#xff1a; 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 是一个跨平台的应用程序开发框架&#xff0c;提供了许多不同类型的控件来构建用户界面。以下是一些常见的 Qt 控件&#xff1a; 按钮&#xff08;Button&#xff09;&#xff1a;用于执行操作或触发事件。文本框&#xff08;TextBox&#xff09;&#xff1a;用于输入和显示文…...

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格式的报文来通信&#xff0c;现在收到对端的一个TLV格式的消息包&#xff0c;要求生成匹配后的(tag,length,valueOffset)列表。具体要求如下: (1)消息包中多组tag、length、value紧密排列&#xff0c;其中tag,length各占1字节(uint8),value所占字节数等于len…...

Memcached学习

一、概念 Memcached是一个开源的&#xff0c;高性能的内存缓存软件&#xff0c;从名称上看Mem就是内存&#xff0c;二cache是缓存。作用通过在事先规划好的内存空间中临时缓存数据库中的各类数据&#xff0c;以达到减少业务对数据库的直接高并发访问&#xff0c;从而达到提升数…...

2024最新金三银四软件测试面试题

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

微信小程序动态加载图表[echart]

1.引入Echarts &#xff08;1&#xff09;将ec-canvas文件拷贝下来放到你自己的项目中&#xff1a; &#xff08;2&#xff09;在你需要使用Echarts的页面的json文件中引入Echarts "usingComponents": {"ec-canvas": "../utils/ec-canvas/ec-canva…...

《opencv实用探索·十八》Camshift进行目标追踪流程

CamShift&#xff08;Continuously Adaptive Mean Shift&#xff09;是一种用于目标跟踪的方法&#xff0c;它是均值漂移&#xff08;Mean Shift&#xff09;的扩展&#xff0c;支持对目标的旋转跟踪&#xff0c;能够对目标的大小和形状进行自适应调整。 cv::CamShift和cv::me…...

MAP: Multimodal Uncertainty-Aware Vision-Language Pre-training Model

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

【SpringCache】快速入门 通俗易懂

1. 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; EHCache Caffeine Redis(常用…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...