velocity定义_velocity模板

velocity定义_velocity模板文章目录 基本用法 导入依赖 1 基本用法 1 1 注释 1 2 替换变量 1 3 不解析 原文输出 1 4 调用对象方法 vtl 指令 set String int Boolean List Map if else foreach include parse define evaluate macro macro 的注意 基本用法 导入依赖 org apache

文章目录

基本用法

导入依赖

1.基本用法

1.1 注释

1.2 替换变量

1.3 不解析,原文输出

1.4 调用对象方法

vtl 指令

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

if 、else

foreach

include 、 parse

define

evaluate

macro

macro的注意

基本用法

导入依赖


org.apache.velocity
velocity
1.7

/pre>

img src=https://ask.qcloudimg.com/http-save/yehe-8223537/627f7ba8c81db6359e38cfa467021936.png>

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

/p>

img src=https://ask.qcloudimg.com/http-save/yehe-8223537/fdd72a47e9dfec507ab370bad3896ecf.png>

pre class='language-javascript'>

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();
}
}

/pre>

img src=https://ask.qcloudimg.com/http-save/yehe-8223537/2a3e6b5eaa4d6630c8f726fe06877816.png>

p>测试类

/p>

img src=https://ask.qcloudimg.com/http-save/yehe-8223537/7c0e091cb40f8ce41c5dc4cc36ac234e.png>

pre class='language-javascript'>

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);
}
}

/pre>

h3>1.基本用法

/h3>

img src=https://ask.qcloudimg.com/http-save/yehe-8223537/ace747cd42f168c17d90a3ab40ddbb15.png>

h4>1.1 注释

/h4>

pre class='language-javascript'>

##注释
#**
* TODO 多行注释
*#

/pre>

h4>1.2 替换变量

/h4>

pre class='language-javascript'>

## 基础
hello, ${name} $name
## 若有数据则输出,无则输出空串
H$!{
name}H 无$!{
name2}无

/pre>

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


/p>

h4>1.3 不解析,原文输出

/h4>

pre class='language-javascript'>

## 不解析
#[[------
非解析内容
${name}
-----]]#

/pre>

p>输出结果

/p>

pre class='language-javascript'>

非解析内容
${name}

/pre>

h4>1.4 调用对象方法

/h4>

pre class='language-javascript'>

${stu.name} ${stu.getStr()}
#set($name = "abc def")
$name.split(" ")[0] --结果是abc

/pre>

h3>vtl 指令

/h3>

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

/h4>

p>


结果:

/p>

pre class='language-javascript'>

王尼玛 18
[1, 2, 3, 4, 5] 2
true
{
name=Mike, age=12, isBoy=true} Mike

/pre>

h4>if 、else

/h4>

p>这个简单理解

/p>

pre class='language-javascript'>

#if($prop.name!='username' && $prop.name!='password')
..
#elseif($prop.name=='id')
..
#else
..
#end

/pre>

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

/p>

h4>foreach

/h4>

p>#break可以终止循环

/p>

pre class='language-javascript'>

#循环遍历List
#foreach($prop in $struct.cppPropList)
$prop
#end

/pre>

p>遍历map


/p>

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

/p>

h4>include 、 parse

/h4>

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

/p>

p>#include 包含,不会被velocity解析

/p>

p>#parse 会被velocity解析

/p>

pre class='language-javascript'>

#include("/template/utils/compare.vm")
#parse("/template/component/menu.vm")

/pre>

h4>define

/h4>

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

/p>

pre class='language-javascript'>

#set($name = "小白")
#define($common)
hello,$name,你好呀!
#end
#set($name = "王尼玛")
$common
#set($name = "张三")
$common

/pre>

h4>evaluate

/h4>

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

/p>

p>比如我们在java中:

/p>

pre class='language-javascript'>

context.put("v","#set($name = \"王尼玛\")");

/pre>

p>模板内容如下:

/p>

pre class='language-javascript'>

#evaluate($v)
$name

/pre>

p>解析结果:王尼玛

/p>

h4>macro

/h4>

pre class='language-javascript'>

#macro(method $name $age)
hello! $name, your age:$age
#end
## 调用宏,结果:hello! Mike, your age:13
#method("Mike",13)

/pre>

h5>macro的注意

/h5>

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

/p>

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

/p>

pre class='language-javascript'>

List authRoleFind = new ArrayList();
authRoleFind.add("w1");
authRoleFind.add("w2");
authRoleFind.add("ccc");
context.put("list",authRoleFind);

首先定义一个宏


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

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),以防止参数名冲突
编程小号
上一篇 2025-02-14 20:06
下一篇 2025-01-26 10:51

相关推荐

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