velocity-engine-core是什么?Velocity模板引擎的使用

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。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++封裝、繼承(單繼承)、多態詳細分析。

系列文章目錄 文章目錄 系列文章目錄摘要一、基本概念二、多態的分類三、多態的實現3.1 類型兼容與函數重寫3.2 動態聯編與靜態聯編3.3 虛函數3.4 動態多態的實現過程 總結參考文獻 摘要 多態性特征是 C中最為重要的一個特征&#xff0c;熟練使用多態是學好 C的關鍵&#xff0…

Kotlin關鍵字二——constructor和init

在關鍵字一——var和val中最后提到了構造函數&#xff0c;這里就學習下構造函數相關的關鍵字: constructor和init。 主要構造(primary constructor) kotlin和java一樣&#xff0c;在定義類時就自動生成了無參構造 // 會生成默認的無參構造函數 class Person{ }與java不同的是…

configure腳本的常用參數

下面是一些常用的configure選項參數及其解釋&#xff1a; --prefix<directory>&#xff1a;指定安裝目錄--with-<package>&#xff1a;指定依賴的外部庫或軟件包--enable-<feature>&#xff1a;啟用某個特性--disable-<feature>&#xff1a;禁用某個特…

原創 | 數據的確權、流通、入表與監管研究(一):數據與確權

作者&#xff1a;張建軍&#xff0c;中國電科首席專家&#xff0c;神州網信技術總監 本文約7100字&#xff0c;建議閱讀10分鐘 本文主要介紹數據與數據分類、數據確權規則、數據的所有權與其他權利等方面內容&#xff0c;并進行案例分析。 2022年12月發布的《關于構建數據基礎制…

Linux 和 macOS 的主要區別在哪幾個方面呢?

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

uniapp實戰 —— 彈出層 uni-popup (含vue3子組件調父組件的方法)

效果預覽 彈出的內容 src\pages\goods\components\ServicePanel.vue <script setup lang"ts"> // 子組件調父組件的方法 const emit defineEmits<{(event: close): void }>() </script><template><view class"service-panel"…

ALSA Compress-Offload API

概述 從 ALSA API 的早期開始&#xff0c;它就被定義為支持 PCM&#xff0c;或考慮到了 IEC61937 等固定比特率的載荷。參數和返回值以幀計算是常態&#xff0c;這使得擴展已有的 API 以支持壓縮數據流充滿挑戰。 最近這些年&#xff0c;音頻數字信號處理器 (DSP) 常常被集成…

git如何配置多個遠程倉庫,并且進行切換

一、配置多個遠程倉庫并進行切換&#xff0c;請按照以下步驟進行操作&#xff1a; 打開命令行終端&#xff0c;并進入您的 Git 倉庫所在的目錄。添加第一個遠程倉庫&#xff0c;使用以下命令&#xff1a;git remote add origin <第一個遠程倉庫的 URL>這里將遠程倉庫命名…

C# .NET平臺提取PDF表格數據,并轉換為txt、CSV和Excel表格文件

處理PDF文件中的內容是比較麻煩的事情&#xff0c;特別是以表格形式呈現的各種數據。為了充分利用這些寶貴的數據資源&#xff0c;我們可以通過程序提取PDF文件中的表格&#xff0c;并將其保存為更易于處理和分析的格式&#xff0c;如txt、csv、xlsx&#xff0c;從而更方便地對…

leetcode面試經典150題——35 螺旋矩陣

題目&#xff1a; 螺旋矩陣 描述&#xff1a; 給你一個 m 行 n 列的矩陣 matrix &#xff0c;請按照 順時針螺旋順序 &#xff0c;返回矩陣中的所有元素。 示例&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;[1,2,3,6,9,8,7,4,5] 提示&…

Redis Geo操作地理位置

Redis Geo 使用場景API列表名詞API列表Springboot使用mavenyamlTest 注意事項 Redis Geo 是Redis在3.2版本中新增的功能&#xff0c;用于存儲和操作地理位置信息 使用場景 滴滴打車&#xff1a;這是一個對地理位置精度要求較高的場景。通過使用Redis的GEO功能&#xff0c;滴滴…

12月8日作業

使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數&#xff1b;將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷u界面上輸入的賬號是否為"admin"&#xff0c;…

kafka學習筆記--安裝部署、簡單操作

本文內容來自尚硅谷B站公開教學視頻&#xff0c;僅做個人總結、學習、復習使用&#xff0c;任何對此文章的引用&#xff0c;應當說明源出處為尚硅谷&#xff0c;不得用于商業用途。 如有侵權、聯系速刪 視頻教程鏈接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;從入門到調優…

Day54力扣打卡

打卡記錄 出租車的最大盈利&#xff08;動態規劃&#xff09; 鏈接 class Solution:def maxTaxiEarnings(self, n: int, rides: List[List[int]]) -> int:d defaultdict(list)for start, end, w in rides:d[end].append((start, end - start w))f [0] * (n 1)for i in…

文章解讀與仿真程序復現思路——電力自動化設備EI\CSCD\北大核心《考慮源網荷效益的峰谷電價與峰谷時段雙層優化模型》

這個標題涉及到電力定價和能源效益的優化模型。讓我來分解一下&#xff1a; 峰谷電價&#xff1a;這是一種電力定價策略&#xff0c;即在一天內不同時間段設定不同的電價。通常&#xff0c;高峰時段&#xff08;需求高&#xff09;的電價相對較高&#xff0c;而低谷時段&#x…

人工智能學習9(LightGBM)

編譯工具&#xff1a;PyCharm 文章目錄 編譯工具&#xff1a;PyCharm lightGBM原理lightGBM的基礎使用案例1&#xff1a;鳶尾花案例2&#xff1a;絕對求生玩家排名預測一、數據處理部分1.數據獲取及分析2.缺失數據處理3.數據規范化4.規范化輸出部分數據5.異常數據處理5.1刪除開…

利用私域運營的四大策略實現企業營銷目標

私域運營指的是企業利用各種網絡技術和工具&#xff0c;以自己的平臺為基礎&#xff0c;建立、維護、更新和升級與用戶的私人關系。這種運營模式讓企業能更準確地了解客戶需求和喜好&#xff0c;通過定制化服務、優惠政策、個性化體驗等方式&#xff0c;獲取更多的客戶價值。相…

Child Mind Institute - Detect Sleep States(2023年第一次Kaggle拿到了銀牌總結)

感謝 感謝艾兄&#xff08;大佬帶隊&#xff09;、rich師弟&#xff08;師弟通過這次比賽機械轉碼成功、耐心學習&#xff09;、張同學&#xff08;也很有耐心的在學習&#xff09;&#xff0c;感謝開源方案&#xff08;開源就是銀牌&#xff09;&#xff0c;在此基礎上一個月…

基于Lucene的全文檢索系統的實現與應用

文章目錄 一、概念二、引入案例1、數據庫搜索2、數據分類3、非結構化數據查詢方法1&#xff09; 順序掃描法(Serial Scanning)2&#xff09;全文檢索(Full-text Search) 4、如何實現全文檢索 三、Lucene實現全文檢索的流程1、索引和搜索流程圖2、創建索引1&#xff09;獲取原始…

模板與泛型編程

函數模板 顯示實例化 區別定義與聲明 T是模板形參 int是模板實參 inpunt是函數形參 3是函數實參 顯示實例化 模板必須實例化可見 翻譯單元一處定義原則 與內聯函數異同 引入原因&#xff1a;函數模板是為了編譯器兩個階段的處理 內聯函數是為了能在編譯期展開 模板實參的類…