Freemarker快速入門

Freemarker概述

FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數據, 并用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
在這里插入圖片描述

環境搭建

  1. 工程依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- apache 對 java io 的封裝工具庫 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency></dependencies>
  1. application.yml配置文件
server:port: 8881 #服務端口
spring:application:name: freemarker-demo #指定服務名freemarker:cache: false  #關閉模板緩存,方便測試settings:template_update_delay: 0 #檢查模板更新延遲時間,設置為0表示立即檢查,如果時間大于0會有緩存不方便進行模板測試suffix: .ftl               #指定Freemarker模板文件的后綴名

在resources\templates\目錄下創建01-basic.ftl文件

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Hello World!</title>
</head>
<body>
<b>普通文本 String 展示:</b><br><br>
Hello ${name} <br>
<hr>
<b>對象Student中的數據展示:</b><br/>
姓名:${stu.name}<br/>
年齡:${stu.age}
<hr>
</body>
</html>

創建控制器

package com.heima.freemarker.controller;import com.heima.freemarker.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/basic")public String hello(Model model){model.addAttribute("name","freemarker");Student student = new Student();student.setName("小明");student.setAge(18);model.addAttribute("stu",student);return "01-basic";}
}

Freemarker指令語法

基礎語法

  1. 注釋:<#-- -->
  2. 插值:${…}部分,freemarker會用真實的值代替${…}
  3. FTL(FreeMarker Template Language)指令:<# >FTL指令</#>
  4. 文本:不加任何標記會被直接輸出

FTL指令

  • 集合指令-List:<#list></#list>
<#list stus as stu><tr><td>${stu_index+1}</td> <!--從零開始--><td>${stu.name}</td><td>${stu.age}</td><td>${stu.money}</td></tr></#list>

上面的stus是model中的一個列表屬性。

  • 集合指令-Map
輸出stu1的學生信息:<br/>
姓名:${stuMap['stu1'].name}<br/>
年齡:${stuMap['stu1'].age}<br/>
<br/>
<a href="###">方式二:通過map.keyname.property</a><br/>
輸出stu2的學生信息:<br/>
姓名:${stuMap.stu2.name}<br/>
年齡:${stuMap.stu2.age}<br/><br/>

變量map

 <#list stuMap?keys as key><tr><td>${key_index+1}</td><td>${stuMap[key].name}</td><td>${stuMap[key].age}</td><td>${stuMap[key].money}</td></tr></#list>
  • if指令
<#if expression>
<#else>
</#if>

在freemarker中,判斷是否相等,=與==號等價

空值處理

  1. 判斷某變量是否存在使用“??”
    用法為:variable??,如果該變量存在,返回true,否則返回false
<#if stus??><#list stus as stu></#list>
</#if>
  1. 缺失變量默認使用"!"
    列如,${name!‘’}表示如果name為空顯示空字符串

內建函數

內建函數語法格式:變量+?+函數名稱

  1. stus集合的大小:${stus?size}
  2. 日期格式化:
    在這里插入圖片描述3. 將json字符串轉為對象
<#assign text="{'bank':'工商銀行','account': '102313213123'}">
<#assign data=text?eval/>
開戶行:${data.bank} 賬號:${data.account}

輸出靜態化文件

實現思路

使用freemarker原生Api將頁面生成html文件
在這里插入圖片描述

@SpringBootTest(classes = FreemarkerDemoApplication.class)
@RunWith(SpringRunner.class)
public class FreemarkerTest {@Autowiredprivate Configuration configuration;@Testpublic void test() throws IOException, TemplateException {Template template = configuration.getTemplate("02-list.ftl");/*** 合成方法*/template.process(getData(),new FileWriter("g:/list.html"));}private Map getData(){Map<String,Object> map = new HashMap<>();//------------------------------------Student stu1 = new Student();stu1.setName("小強");stu1.setAge(18);stu1.setMoney(1000.86f);stu1.setBirthday(new Date());//小紅對象模型數據Student stu2 = new Student();stu2.setName("小紅");stu2.setMoney(200.1f);stu2.setAge(19);//將兩個對象模型數據存放到List集合中List<Student> stus = new ArrayList<>();stus.add(stu1);stus.add(stu2);//向model中存放List集合數據map.put("stus",stus);//------------------------------------//創建Map數據HashMap<String,Student> stuMap = new HashMap<>();stuMap.put("stu1",stu1);stuMap.put("stu2",stu2);// 3.1 向model中存放Map數據map.put("stuMap", stuMap);return map;}
}

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

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

相關文章

操作系統:生態思政

操作系統&#xff1a;生態思政 操作系統&#xff08;OS&#xff09;作為數字世界的基石&#xff0c;其意義遠超單純的技術平臺。它構建了一個包含開發者、用戶、硬件廠商在內的復雜生態系統&#xff0c;其設計理念、運行規則與生態治理模式&#xff0c;無不深刻映射著特定的價…

二進制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 學習筆記:自定義構建和發布配置

Rust 學習筆記&#xff1a;自定義構建和發布配置 Rust 學習筆記&#xff1a;自定義構建和發布配置發布配置文件自定義 profile 的選項 Rust 學習筆記&#xff1a;自定義構建和發布配置 發布配置文件 在 Rust 中&#xff0c;發布配置文件是預定義的和可定制的概要文件&#xf…

優化 Transformer 模型:基于知識蒸餾、量化技術及 ONNX

Transformer 模型非常強大&#xff0c;但往往太大太慢&#xff0c;不適合實時應用。為了解決這個問題&#xff0c;我們來看看三種關鍵的優化技術&#xff1a;知識蒸餾、量化和ONNX 圖優化。這些技術可以顯著減少推理時間和內存使用。 為了說明每種技術的利弊&#xff0c;我們以…

Vue3中Axios的使用-附完整代碼

前言 首先介紹一下什么是axios Axios 是一個基于 promise 網絡請求庫&#xff0c;作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests 官方網站…

@Pushgateway自定義腳本推送數據

文章目錄 Pushgateway 自定義腳本推送數據1. 目的2. 適用范圍3. 前提條件4. 操作流程4.1 確定指標類型和格式4.2 編寫推送腳本方法一:使用 curl 命令行推送方法二:使用 Python 腳本推送方法三:使用 Python 客戶端庫推送4.3 設置定時任務4.4 驗證數據5. 高級配置5.1 使用基本…

Git 使用規范指南

Learn Git Branching 1Git 基礎使用流程 1.1初始化與克隆 # 初始化本地倉庫 git init# 克隆遠程倉庫 git clone <repo_url> 一般拉取代碼&#xff0c;直接在文件夾界面打開bash&#xff0c;git clone就行了 1.2日常開發流程 1拉取最新代碼 git pull origin <branc…

設計模式——備忘錄設計模式(行為型)

摘要 備忘錄設計模式是一種行為型設計模式&#xff0c;用于在不破壞封裝性的前提下&#xff0c;捕獲對象的內部狀態并在需要時恢復。它包含三個關鍵角色&#xff1a;原發器&#xff08;Originator&#xff09;、備忘錄&#xff08;Memento&#xff09;和負責人&#xff08;Car…

動態規劃十大經典題型狀態轉移、模版等整理(包括leetcode、洛谷題號)

動態規劃十大經典題目整理 0-1 背包問題&#xff08;0-1 Knapsack Problem&#xff09; LeetCode題號&#xff1a;無直接對應洛谷OJ題號&#xff1a;P1048狀態轉移方程&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i])C代碼模板&#xff1a; int dp[capacity 1…

簡單transformer運用

通俗易懂解讀&#xff1a;hw04.py 文件內容與 Transformer 的應用 這個文件是一個 Python 腳本&#xff08;hw04.py&#xff09;&#xff0c;用于完成 NTU 2021 Spring 機器學習課程的 HW4 作業任務&#xff1a;揚聲器分類&#xff08;Speaker Classification&#xff09;。它…

redis的哨兵模式和Redis cluster

目錄 一. redis的主從復制 二. 哨兵模式 2.1 定義 2.2 作用 2.3 配置實例 三. Redis cluster 3.1 定義 3.2 作用 3.3 配置實例 1. 新建集群文件目錄 2. 準備可執行文件到每個文件夾 3. 開啟群集功能 4. 啟動redis節點 5. 查看是否啟動成功 6. 啟動集群 7. 測試…

簡述八大排序(Sort)

1.插入排序 1.1直接插入排序 給定一組數據&#xff0c;若數據只有一個肯定是有序的&#xff0c;我們將無序數據一個個插入到已有序的數據中。用i遍歷無序數據&#xff0c;j遍歷有序數據&#xff0c;找到合適插入位置&#xff0c;用tmp存放目標插入數據&#xff0c;將其與j對應…

xcode 編譯運行錯誤 Sandbox: rsync(29343) deny(1) file-write-create

解決方法 方法一&#xff1a;修改Targets -> Build Settings 中 ENABLE_USER_SCRIPT_SANDBOXING 設置 NO 方法二&#xff1a;項目使用cocoaPods進行三方管理 且 使用了 use_frameworks&#xff0c;把 use_frameworks 注釋掉,然后重新自行pod install

linux系統中防火墻的操作

防火墻 開放ssh端口 sudo ufw allow 22/tcp # 允許 SSH 連接 sudo ufw enable開放防火墻端口 sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS&#xff08;如果需要&#xff09; sudo ufw enable查看擋墻防火墻設置 sudo ufw status刪除其中一條防火墻規…

[特殊字符] 超強 Web React版 PDF 閱讀器!支持分頁、縮放、旋轉、全屏、懶加載、縮略圖!

在現代 Web 項目中&#xff0c;PDF 瀏覽是一個常見需求&#xff1a;從政務公文到合同協議&#xff0c;PDF 文件無處不在。但很多方案要么體驗不佳&#xff0c;要么集成復雜。今天&#xff0c;我給大家帶來一個開箱即用、功能全面的 PDF 預覽組件 —— [PDFView](https://www.np…

設計模式——策略設計模式(行為型)

摘要 策略設計模式是一種行為型設計模式&#xff0c;它定義了一系列算法并將每個算法封裝起來&#xff0c;使它們可以相互替換。該模式讓算法的變化獨立于使用算法的客戶&#xff0c;從而使得算法可以靈活地切換和擴展。其主要角色包括策略接口、具體策略類和環境類。策略模式…

DeepSeek-R1-0528,官方的端午節特別獻禮

DeepSeek&#xff1a;端午安康&#xff01;刻在國人骨子里的浪漫 2025 年 05 月 28 日 | DeepSeek 端午特別獻禮 當粽葉飄香時&#xff0c;DeepSeek 悄然帶來一份節日驚喜 版本號 DeepSeek-R1-0528 正式上線 官方賦予它的靈魂是&#xff1a; 思考更深 推理更強 用戶通過官網…

mac安裝brew時macos無法信任ruby的解決方法

背景 在使用如下腳本安裝brew時&#xff0c;遇到安裝ruby&#xff0c;macos不信任外部軟件&#xff0c;在安全性點擊信任仍然無法安裝。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"如何解決 本地安裝好符…

2025音頻傳輸模塊全球選購指南:高品質音頻體驗的品牌之選

隨著無線技術的迅猛發展&#xff0c;音頻傳輸模塊&#xff08;Audio Transmission Module&#xff09;已成為高品質音頻體驗的關鍵技術之一。它們廣泛應用于智能家居、無線耳機、會議系統、廣播設備以及專業音頻領域。面對市場上多樣化的產品&#xff0c;如何選擇適合自己需求的…

解析樓宇自控系統:分布式結構的核心特點與優勢展現

在建筑智能化發展的進程中&#xff0c;樓宇自控系統作為實現建筑高效運行與管理的關鍵&#xff0c;其系統結構的選擇至關重要。傳統的集中式樓宇自控系統在面對日益復雜的建筑環境和多樣化的管理需求時&#xff0c;逐漸暴露出諸多弊端&#xff0c;如可靠性低、擴展性差、響應速…