org.apache.veLocity
veLocity
1.7
創建一個公共方法,它是通過類路徑來獲取模闆的,接下來就可以開始測試了!
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}無
這裡要注意:盡量用标準的寫法${}
,否則容易導緻語法錯誤
## 不解析
#[[------
非解析内容
${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
的屬性使用:
基于類路徑(在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(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 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://javaforall.cn/180158.html原文鍊接:https://javaforall.cn
原文地址:https://cloud.tencent.com/developer/article/2149833
有話要說...