文章目录
基本用法
导入依赖
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),以防止参数名冲突
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/145358.html