velocity定义_velocity模板

velocity定义_velocity模板文章目录基本用法导入依赖1.基本用法1.1注释1.2替换变量1.3不解析,原文输出1.4调用对象方法指令setifelse基本用法导入依赖<dependency> <groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version></dependency&

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

基本用法

导入依赖

<dependency>
  	<groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>

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

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

测试类

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 注释

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

1.2 替换变量

## 基础
hello, ${name}  $name

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

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

1.3 不解析,原文输出

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

输出结果

	非解析内容
    ${name}

1.4 调用对象方法

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

vtl 指令

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

在这里插入图片描述
结果:

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

if 、else

这个简单理解

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

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

foreach

#break可以终止循环

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

遍历map
在这里插入图片描述

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

在这里插入图片描述

include 、 parse

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

#include 包含,不会被velocity解析

#parse 会被velocity解析

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

define

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

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

在这里插入图片描述

evaluate

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

比如我们在java中:

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

模板内容如下:

#evaluate($v)
$name

解析结果:王尼玛

macro

#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个字符串

List<String> authRoleFind = new ArrayList<String>();
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 -> $name始终相等了!
在这里插入图片描述
那就和这个方法的结果一样了!
在这里插入图片描述
不知道有什么好的解决方案,反正不能用C、Java函数的思想去思考了。

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

解决:在引入时,我们要防止调用时参数的名字 和 #macro中的变量名冲突!
像上面那个例子,#macro 内容中,就已经使用了$name这个参数了,所以在调用的时候#methodFind()中不要再有$name

在这里插入图片描述

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue文件中引入js_vue中require引入js

    vue文件中引入js_vue中require引入js由于一些演示,需要对编码名称等可快速进行修改,需要页面方便配置。由于build后的vue项目基本已经看不出原样,因此需要创建一个文件,并在打包的时候不会进行编译。vue-cli2.0的作法是在static文件下创建js。vue-cli3.0的写法则是直接在public文件夹下创建js、具体操作如下:1、在public文件夹下创建config.js文件,里面文件的语法是es5,不允许使用浏览器…

    2022年10月8日
    0
  • JS prototype作用

    JS prototype作用 prototype可查看原型属性,还可对原型添加属性或方法functionCar(name){this.name=name;this.run=function(){console.log(this.height+’cm’+this.name+’isrun!’)…

    2022年7月22日
    4
  • 中专计算机应用专业简历模板,2016计算机应用专业个人简历模板「建议收藏」

    中专计算机应用专业简历模板,2016计算机应用专业个人简历模板「建议收藏」《2016计算机应用专业个人简历模板》由会员分享,可在线阅读,更多相关《2016计算机应用专业个人简历模板(7页珍藏版)》请在人人文库网上搜索。1、2016计算机应用专业个人简历模板随着互联网的发展与普遍,互联网行业的专业人才颇受欢迎,其就业率也十分可观,下面是fwdq为大家搜集整理的计算机应用应届生个人简历,欢迎阅读。计算机应用专业个人简历模板(一)姓名:目前所在:广…

    2022年5月9日
    35
  • 为什么领导不喜欢提拔老实人?退休的领导说出了实话

    为什么领导不喜欢提拔老实人?退休的领导说出了实话

    2022年2月14日
    49
  • 小波变换和小波阈值法去噪[通俗易懂]

    小波变换和小波阈值法去噪[通俗易懂]小波变换是一种信号的时间——尺度(时间——频率)分析方法,它具有多分辨分析的特点,而且在时频两域都具有表征信号局部特征的能力,。在小波分析中经常用到近似和细节,近似表示信号的高尺度,即低频信息;细节表示信号的低尺度,即高频信息。对含有噪声的信号,噪声分量的主要能量集中在小波解的细节分量中。在以上过程中,小波基和分解层数的选择,阈值的选取规则,和阈值函数的设计,都是影响最终去噪效果的关键因素。

    2022年5月29日
    37
  • 2020年抖音用户画像报告,DAU超4亿!「建议收藏」

    2020年抖音用户画像报告,DAU超4亿!「建议收藏」抖音DAU超4亿,较去年同期的2.5亿,增长了60%。抖音与头条的重合度为32.1%,重合用户占抖音的42.2%。抖音与西瓜的重合度为24.6%,重合用…

    2022年6月9日
    96

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号