velocity-engine-core是什么?Velocity模板引擎的使用
- 1. 常見的模板引擎
- 2. Velocity 的語法
- 3.Velocity的使用
相信在日常開發中或多或少都聽過或者使用過模板引擎,比如熟知的freemarker, thymeleaf等。而模板引擎就是為了實現View和Data分離而產生的。
而velocity-engine-core正是另一種模板引擎的引入依賴包,它就是Velocity。
1. 常見的模板引擎
-
thymeleaf
是一款用于渲染XML/XHTML/HTML5內容的模板引擎。它也可以 輕易的與Spring MVC等Web框架進行集成作為Web應用的模板引擎。也是springboot推薦的靜態資源渲染的引擎。
-
freemarker
功能與Velocity差不多,但是語法更加強大,使用方便。是非常主流的模板引擎。
-
enjoy
Enjoy Template Engine 采用獨創的 DKFF (Dynamic Key Feature Forward)詞法分析算法以及獨創的DLRD (Double Layer Recursive Descent)語法分析算法,極大減少了代碼量,降低了學習成本,并提升了用戶體驗
-
velocity
不僅可以用于界面展示(HTML, XML等)還可以生成輸入java代碼,SQL語句等文本格式。我們公司就是使用Velocity來做代碼的自動生成工具。
2. Velocity 的語法
關鍵字以 # 開頭,變量以 $ 開頭
2.1 定義變量
使用 #set 關鍵字
#set($name = "zhangsan")
#set(${h} = "hello $name") ##這里的name變量加不加 {} 都可以
#set($n = "${name}_new") ##這里的name變量就必須要加上{}了
#set($m = $n) ##重新賦值,如果有其他操作,需要向上面一樣加上 ""#set($p = {}) ##定義對象,Java中的Map
#set($a = []) ##定義數組,Java中的List#set($v = $person.age) ##屬性引用。 person是一個Java對象。
#set($v = $person.getName()) ##方法引用。
#set($v = $person.getName($type)) ##方法引用(帶參數)。
2.2 變量的使用
以 $ 者 ${} 使用變量
#set($name = "zhangsan") ##定義變量
$name ##使用變量
${name} ##使用變量
${name}_abc ##必須加 {}
abc_$name ##可以不用加 {}
2.3 循環
使用 #foreach .... #end 使用循環
#set($list = ["北京", "上海", "深圳", "杭州"]) ##定義一個集合 #foreach($item in $list) 熱門城市 ---> $item, 排名:[$foreach.count] #$foreach.index 是從0開始
#end
2.4 if判斷
使用 #if(condition) ... #elseif(condition) ... #else ... #end 進行條件判斷
#set($value = 1) ##定義一個變量#if($value == 0) value的結果是: $!value
#elseif($value == 1) value的結果是: $!value
#else value的結果大于1
#end//對象obj不為空才會執行里面的邏輯
#if($obj) ..... #end//對象obj為空才會執行里面的邏輯
#if(!$obj) ..... #end#等于字符串"abc" 才會執行里面的邏輯
if($obj == 'abc') ...... #end
2.5 關系操作符
可以使用 &&(與), ||(或), !(非) 來進行復雜的條件判斷
#set($name = "")
#if(!$name) ##用于判空,如果是空,則為false, 取反后為true $!name 的年齡是: 13
#end #set($key = "velocity")
#set($flag = true)
#set($list = ["北京", "上海"])
#if($key && $key.contains("v") && $flag && $list.size() > 1) ## key 不為空并且包含v, flag 為true, list 元素數量大于1 條件成立......
#end
3.Velocity的使用
3.1 導入依賴
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
3.2 定義模板
文件名以 .vm 結尾 (例如:hello.vm)
#if($c == 15)-----> hello: $!name
#end#foreach($item in $list)集合中的元素:${item} , 索引:【$foreach.index】
#end$person.name 的 生日是 $person.birthday,年齡是 $person.getAge()
3.3 定義引擎并解析模板
public class VelocityTest {public static void main(String[] args) throws IOException {//1.定義一個模板引擎VelocityEngine ve = new VelocityEngine();ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());ve.init();//2.指定一個模板Template t = ve.getTemplate("hello.vm");VelocityContext ctx = new VelocityContext();//設置字符串ctx.put("c", 15);ctx.put("name", "velocity");//設置集合List<String> temp = new ArrayList<>();temp.add("北京");temp.add("杭州");temp.add("海南");ctx.put( "list", temp);//設置對象ctx.put("person", new Person("秋官", 30, LocalDate.now()));//合并到模板中, 可以是文件中//FileWriter fw = new FileWriter("demo.html");//t.merge(ctx, fw);//fw.close();StringWriter sw = new StringWriter();t.merge(ctx, sw);System.out.println(sw);}@AllArgsConstructor@Datapublic static class Person {private String name;private int age;private LocalDate birthday;}
}
除此以外,Velocity還提供了 Velocity-Tools工具包,他是Veloctiy下的一個子模塊,參考gitee,Veloctiy-Tools主要包含2個部分:GenericTools和VelocityView ,前者提供了一些常用的工具類,比如DateTool, MathTool等等,后者主要是應用于web環境。
像我使用,使用velocity就是用來生成代碼,所以導入 velocity-engine-core 就足夠了,也沒有導入springboot集成的velocity starter。