Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >velocity定义_velocity模板

velocity定义_velocity模板

作者头像
全栈程序员站长
发布于 2022-11-02 09:54:34
发布于 2022-11-02 09:54:34
1.3K10
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录

基本用法

导入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
  	<groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>

创建一个公共方法,它是通过类路径来获取模板的,接下来就可以开始测试了!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class VelocityUtils { 

/** * 执行模板渲染 * @param inputPath 输入路径 * @param velocityContext 内容 */
public static String replace(String inputPath ,VelocityContext velocityContext){ 

if(!inputPath.startsWith("\\")){ 

inputPath="\\"+inputPath;
}
// 初始化模板引擎
VelocityEngine ve = new VelocityEngine();
ve.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
ve.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
//TODO 绝对路径
// ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, System.getProperty("user.dir") + "\\config\\" );
ve.init();
// 获取模板文件
Template t = ve.getTemplate(inputPath);
StringWriter sw = new StringWriter();
t.merge(velocityContext,sw);
//测试查看
System.out.println(sw.toString());
return sw.toString();
}
}

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test { 

//获取模板
private VelocityContext get(){ 

VelocityContext context = new VelocityContext();
context.put("name","王尼玛");
Student stu = new Student();
stu.setAge(23);
stu.setName("王小二");
stu.setBirth(new Date());
context.put("stu",stu);
return context;
}
@Test
public void test1(){ 

VelocityContext context = get();
//放在resources目录下
VelocityUtils.replace("/test/test1.html.vm",context);
}
}

1.基本用法

1.1 注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##注释
#**
* TODO 多行注释
*#

1.2 替换变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 基础
hello, ${name}  $name
## 若有数据则输出,无则输出空串
H$!{ 
name}H   无$!{ 
name2}

这里要注意:尽量用标准的写法${},否则容易导致语法错误

1.3 不解析,原文输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 不解析
#[[------
非解析内容
${name}
-----]]#

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	非解析内容
${name}

1.4 调用对象方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${stu.name}  ${stu.getStr()}
#set($name = "abc def")
$name.split(" ")[0]   --结果是abc

vtl 指令

set (String、int、Boolean、List、Map)

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
王尼玛 18
[1, 2, 3, 4, 5]  2
true
{ 
name=Mike, age=12, isBoy=true}  Mike

if 、else

这个简单理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#if($prop.name!='username' && $prop.name!='password')
..
#elseif($prop.name=='id')
..
#else
..
#end

其中,if可以识别为true的内容为:非null(java的String空串,也是识别为true!)、Boolean=true

foreach

#break可以终止循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#循环遍历List 
#foreach($prop in $struct.cppPropList)
$prop
#end

遍历map

循环内部$foreach的属性使用:

include 、 parse

基于类路径(在VelocityEngine 中设置读取的基本路径)

#include 包含,不会被velocity解析

#parse 会被velocity解析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include("/template/utils/compare.vm")
#parse("/template/component/menu.vm")

define

用于定义某个公共模块,在调用之前我们可以提前定义好一些参数,然后通过模块名去调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#set($name = "小白")
#define($common)
hello,$name,你好呀!
#end
#set($name = "王尼玛")
$common
#set($name = "张三")
$common

evaluate

可以后端保存velocity语句,传入解析:

比如我们在java中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
context.put("v","#set($name = \"王尼玛\")");

模板内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#evaluate($v)
$name

解析结果:王尼玛

macro

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#macro(method $name $age)
hello!  $name, your age:$age
#end
## 调用宏,结果:hello! Mike, your age:13
#method("Mike",13)
macro的注意

在使用中,有时候会用到嵌套循环,看一个例子。

java中定义一个list,内有 w1 w2 ccc 3个字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> authRoleFind = new ArrayList<String>();
authRoleFind.add("w1");
authRoleFind.add("w2");
authRoleFind.add("ccc");
context.put("list",authRoleFind);

首先定义一个宏

这个时候,在一个和宏内调用了相同的List的循环,想当然的预想结果应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
w1 -> w1
w1 -> w2
w1 -> ccc
w2 -> w1
w2 -> w2
w2 -> ccc

但是它的结果却是这样的.auth ->

或许它是将 #macro 的内容,直接copy过去再进行 编译/执行 ?

解决:在引入时,我们要防止调用时参数的名字 和 #macro中的变量名冲突!

像上面那个例子,#macro 内容中,就已经使用了$name这个参数了,所以在调用的时候#methodFind()中不要再有$name

小结:我们在调用一个宏的时候 例#macro(methodFind a b) ,尽量以相同的参数名去调用#methodFind(a b),以防止参数名冲突

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180158.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬,我发现异步的加载,即使单个的bean 加载完成 ,我也无法通过controller 的接口去使用他的方法
大佬,我发现异步的加载,即使单个的bean 加载完成 ,我也无法通过controller 的接口去使用他的方法
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Velocity魔法堂系列二:VTL语法详解
一、前言                               Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。   最好的学习资源——官网:http://velocity.apache.org
^_^肥仔John
2018/01/18
1.9K0
模板引擎Velocity 基础
详细介绍大家可以看官网,传送门放这里了:The Apache Velocity Project
叫我阿杰好了
2022/11/07
5.8K0
模板引擎Velocity 基础
Velocity魔法堂系列三:模板与宿主环境通信
一、前言                             Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的 NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少 哦。   最好的学习资源——官网:http://velocity.apache.org
^_^肥仔John
2018/01/18
1.1K0
JAVA安全之Velocity模板注入刨析
关于Velocity模板注入注入之前一直缺乏一个系统性的学习和整理,搜索网上大多数类似的内容都是一些关于漏洞利用的复现,而且大多都仅限于Velocity.evaluate的执行,对于载荷的构造以及执行过程并没有详细的流程分析,于是乎只能自己动手来填坑了~
Al1ex
2024/09/26
4590
JAVA安全之Velocity模板注入刨析
Velocity魔法堂系列一:入门示例
一、前言                             Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。   最好的学习资源——官网:http://velocity.apache.org/
^_^肥仔John
2018/01/18
1.1K0
velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用velocity模板引擎生成 『每日发货单』邮件内容: 一、先定义邮件内容模板:mail-template.vm <string>用户,您好:</string> <h2>以下是 $date.format('yyyy-MM-dd',$model.deliverDate,$convert.toLocale("en_US
菩提树下的杨过
2018/01/19
9330
java velocity 语法_Velocity语法
#set($name = “hello”)说明:velocity中变量是弱类型的。
全栈程序员站长
2022/09/14
2.7K0
Velocity模板引擎
Velocity主要分为app、context、runtime和一些辅助util几个部分。
JokerDJ
2023/11/27
6910
Velocity模板引擎
Apache Velocity-----基于Java的模板引擎
Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。
wuweixiang
2018/08/14
10.6K0
使用velocity
使用maven引入jar org.apache.velocity velocity 1.7 org.apache.velocity velocity-tools 2.0 org.apache.struts struts-tiles org.apache.struts struts-taglib
allsmallpig
2021/02/25
5710
apache的开源项目-模板引擎(Velocity)_学习了两天就上手啦_源码下载
首先,如果你对Velocity不是很了解,还是建议你去apache的官方网站上去走走....
Hongten
2018/09/13
1.2K0
apache的开源项目-模板引擎(Velocity)_学习了两天就上手啦_源码下载
速度与敏捷:解密Velocity的奥秘
在动态内容生成和模板渲染中,Velocity模板语法扮演着关键角色。包括idea中插件EasyCode也是使用了Velocity模版来进行编写的,可以使用此插件直接根据表生成相应的实体类,service,mapper,vo,do等的代码。本文将带你探索这一强大工具的语法细节,使你能够更高效地构建模板和生成动态内容。
一只牛博
2025/05/30
1100
Java生成PDF
如题,在日常的项目开发中,我们会遇到需要通过Java代码生成pdf,本文主要介绍的是通过velocity模板生产pdf。
木左
2022/09/23
1.6K0
Java生成PDF
Velocity引擎原理探究
常见的Java模板引擎有JSP、Freemark,Velocity。在MVC三层框架中,模板引擎属于view层,实质是把model层内容展现到前台页面的一个引擎,velocity以其前后端解耦使前后台可以同时开发和其语法的简易性得到了广泛的应用,集团WebX框架就建议使用它作为模板引擎。
加多
2018/09/06
1.8K0
Velocity引擎原理探究
Java后端模板引擎对比
模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:
肉眼品世界
2020/12/18
3.8K0
数据字典生成工具之旅(6):NVelocity语法介绍及实例
本文介绍了数据字典生成工具的设计、功能、使用方式和具体示例,是一款优秀的软件工具。
用户1168362
2018/01/05
1K0
数据字典生成工具之旅(6):NVelocity语法介绍及实例
自动化工具之Appium之报告自定义
上面报告虽然麻雀虽小但五脏俱全,但是如果用这个发送报告不是很美观,如果错误没有截图与日志,通过观察testng有需要可以继承的监听,可以自定义报告;
高楼Zee
2019/11/30
4920
什么是元编程?
收拾好东西准备离开的时候,领导布置了一个新任务,张大胖很无奈,哀叹一声,老老实实地坐下来。
凯哥Java
2019/06/28
1K0
什么是元编程?
MyBatisPlus新版代码生成器(Velocity模板引擎详解)
Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离。
Java微观世界
2025/01/21
7160
MyBatisPlus新版代码生成器(Velocity模板引擎详解)
quartz监控日志(三)查看卡死线程堆栈
我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是jstack命令
一笠风雨任生平
2019/08/02
7870
推荐阅读
相关推荐
Velocity魔法堂系列二:VTL语法详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验