教育行業(yè)網(wǎng)站模板最新軍事戰(zhàn)爭新聞消息
Springboot集成Freemarker
- 一、前言🔥
- 二、環(huán)境說明🔥
- 三、Freemarker 介紹🔥
- 四、環(huán)境搭建&&快速入門🔥
- 4.1 創(chuàng)建測試工程
- 4.2 配置文件
- 4.3 創(chuàng)建模型類
- 4.4 創(chuàng)建模板
- 4.5 創(chuàng)建controller
- 4.6 創(chuàng)建啟動類
- 4.7 測試
- 五、Freemarker 基礎(chǔ)🔥
- 基礎(chǔ)語法種類
- 集合指令(List和Map)
- if指令
- 運(yùn)算符
- 邏輯運(yùn)算符
- 空值處理
一、前言🔥
上一期,我是帶著大家入門了SpringBoot集成Kafka
,今天我再來一期Freemarker的零基礎(chǔ)教學(xué)吧。不知道大家對kafka有多少了解,反正我就是從搭建開始,然后再加一個簡單演示,這就算是帶著大家了個門哈,剩下的我再后邊慢慢出教程給大家說。
二、環(huán)境說明🔥
演示環(huán)境:idea2021 + springboot 2.3.1REALSE + Freemarker
三、Freemarker 介紹🔥
FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發(fā)產(chǎn)品的組件。
模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。 那就意味著要準(zhǔn)備數(shù)據(jù)在真實(shí)編程語言中來顯示,比如數(shù)據(jù)庫查詢和業(yè)務(wù)運(yùn)算, 之后模板顯示已經(jīng)準(zhǔn)備好的數(shù)據(jù)。在模板中,你可以專注于如何展現(xiàn)數(shù)據(jù), 而在模板之外可以專注于要展示什么數(shù)據(jù)。
常用的java模板引擎還有哪些?
Jsp、Freemarker、Thymeleaf 、Velocity 等。
1.Jsp 為 Servlet 專用,不能單獨(dú)進(jìn)行使用。
2.Thymeleaf 為新技術(shù),功能較為強(qiáng)大,但是執(zhí)行的效率比較低。
3.Velocity從2010年更新完 2.0 版本后,便沒有在更新。Spring Boot 官方在 1.4 版本后對此也不在支持,雖然 Velocity 在 2017 年版本得到迭代,但為時已晚。
四、環(huán)境搭建&&快速入門🔥
freemarker作為springmvc一種視圖格式,默認(rèn)情況下SpringMVC支持freemarker視圖格式。
需要創(chuàng)建Spring Boot+Freemarker工程用于測試模板。
4.1 創(chuàng)建測試工程
創(chuàng)建一個freemarker-demo 的測試工程專門用于freemarker的功能測試與模板的測試。
pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>suihao-test</artifactId><groupId>com.suihao</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>freemarker-demo</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><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></project>
4.2 配置文件
配置application.yml
server:port: 8881 #服務(wù)端口
spring:application:name: freemarker-demo #指定服務(wù)名freemarker:cache: false #關(guān)閉模板緩存,方便測試settings:template_update_delay: 0 #檢查模板更新延遲時間,設(shè)置為0表示立即檢查,如果時間大于0會有緩存不方便進(jìn)行模板測試suffix: .ftl #指定Freemarker模板文件的后綴名
4.3 創(chuàng)建模型類
在freemarker的測試工程下創(chuàng)建模型類型用于測試
package com.suihao.freemarker.entity;import lombok.Data;import java.util.Date;@Data
public class Student {private String name;//姓名private int age;//年齡private Date birthday;//生日private Float money;//錢包
}
4.4 創(chuàng)建模板
resources下創(chuàng)建templates,此目錄為freemarker的默認(rèn)模板存放目錄。
在templates下創(chuàng)建模板文件 01-basic.ftl ,模板中的插值表達(dá)式最終會被freemarker替換成具體的數(shù)據(jù)。
<!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中的數(shù)據(jù)展示:</b><br/>
姓名:${stu.name}<br/>
年齡:${stu.age}
<hr>
</body>
</html>
4.5 創(chuàng)建controller
創(chuàng)建Controller類,向Map中添加name,最后返回模板文件。
package com.xuecheng.test.freemarker.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;import java.util.Map;@Controller
public class HelloController {@GetMapping("/basic")public String test(Model model) {//1.純文本形式的參數(shù)model.addAttribute("name", "freemarker");//2.實(shí)體類相關(guān)的參數(shù)Student student = new Student();student.setName("小明");student.setAge(18);model.addAttribute("stu", student);return "01-basic";}
}
4.6 創(chuàng)建啟動類
package com.suihao.freemarker;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class FreemarkerDemotApplication {public static void main(String[] args) {SpringApplication.run(FreemarkerDemotApplication.class,args);}
}
4.7 測試
請求:http://localhost:8881/basic
五、Freemarker 基礎(chǔ)🔥
基礎(chǔ)語法種類
1、注釋,即<#-- -->,介于其之間的內(nèi)容會被freemarker忽略
<#--我是一個freemarker注釋-->
2、插值(Interpolation): 即 ${…} 部分,freemarker會用真實(shí)的值代替 ${…}
Hello ${name}
3、FTL指令:和HTML標(biāo)記類似,名字前加#予以區(qū)分,Freemarker會解析標(biāo)簽中的表達(dá)式或邏輯。
<# >FTL指令</#>
4、文本,僅文本信息,這些不是freemarker的注釋、插值、FTL指令的內(nèi)容會被freemarker忽略解析,直接輸出內(nèi)容。
<#--freemarker中的普通文本-->
我是一個普通的文本
集合指令(List和Map)
1、數(shù)據(jù)模型:
在HelloController中新增如下方法:
@GetMapping("/list")
public String list(Model model){//------------------------------------Student stu1 = new Student();stu1.setName("小強(qiáng)");stu1.setAge(18);stu1.setMoney(1000.86f);stu1.setBirthday(new Date());//小紅對象模型數(shù)據(jù)Student stu2 = new Student();stu2.setName("小紅");stu2.setMoney(200.1f);stu2.setAge(19);//將兩個對象模型數(shù)據(jù)存放到List集合中List<Student> stus = new ArrayList<>();stus.add(stu1);stus.add(stu2);//向model中存放List集合數(shù)據(jù)model.addAttribute("stus",stus);//------------------------------------//創(chuàng)建Map數(shù)據(jù)HashMap<String,Student> stuMap = new HashMap<>();stuMap.put("stu1",stu1);stuMap.put("stu2",stu2);// 3.1 向model中存放Map數(shù)據(jù)model.addAttribute("stuMap", stuMap);return "02-list";
}
2、模板:
在templates中新增02-list.ftl文件
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Hello World!</title>
</head>
<body><#-- list 數(shù)據(jù)的展示 -->
<b>展示list中的stu數(shù)據(jù):</b>
<br>
<br>
<table><tr><td>序號</td><td>姓名</td><td>年齡</td><td>錢包</td></tr>
</table>
<hr><#-- Map 數(shù)據(jù)的展示 -->
<b>map數(shù)據(jù)的展示:</b>
<br/><br/>
<a href="###">方式一:通過map['keyname'].property</a><br/>
輸出stu1的學(xué)生信息:<br/>
姓名:<br/>
年齡:<br/>
<br/>
<a href="###">方式二:通過map.keyname.property</a><br/>
輸出stu2的學(xué)生信息:<br/>
姓名:<br/>
年齡:<br/><br/>
<a href="###">遍歷map中兩個學(xué)生信息:</a><br/>
<table><tr><td>序號</td><td>姓名</td><td>年齡</td><td>錢包</td> </tr>
</table>
<hr></body>
</html>
👆上面代碼解釋:
${k_index}:
index:得到循環(huán)的下標(biāo),使用方法是在stu后邊加"_index",它的值是從0開始
if指令
if 指令即判斷指令,是常用的FTL指令,freemarker在解析時遇到if會進(jìn)行判斷,條件為真則輸出if中間的內(nèi)容,否則跳過內(nèi)容不再輸出。
- 指令格式
<#if ></if>
1、數(shù)據(jù)模型:
使用list指令中測試數(shù)據(jù)模型,判斷名稱為小紅的數(shù)據(jù)字體顯示為紅色。
2、模板:
<table><tr><td>姓名</td><td>年齡</td><td>錢包</td></tr><#list stus as stu><tr><td >${stu.name}</td><td>${stu.age}</td><td >${stu.mondy}</td></tr></#list></table>
3、輸出:
姓名為“小強(qiáng)”則字體顏色顯示為紅色。
運(yùn)算符
1、算數(shù)運(yùn)算符
FreeMarker表達(dá)式中完全支持算術(shù)運(yùn)算,FreeMarker支持的算術(shù)運(yùn)算符包括:
- 加法: +
- 減法: -
- 乘法: *
- 除法: /
- 求模 (求余): %
模板代碼
<b>算數(shù)運(yùn)算符</b>
<br/><br/>100+5 運(yùn)算: ${100 + 5 }<br/>100 - 5 * 5運(yùn)算:${100 - 5 * 5}<br/>5 / 2運(yùn)算:${5 / 2}<br/>12 % 10運(yùn)算:${12 % 10}<br/>
<hr>
除了 + 運(yùn)算以外,其他的運(yùn)算只能和 number 數(shù)字類型的計(jì)算。
2、比較運(yùn)算符
- =或者==:判斷兩個值是否相等.
- !=:判斷兩個值是否不等.
- >或者gt:判斷左邊值是否大于右邊值
- >=或者gte:判斷左邊值是否大于等于右邊值
- <或者lt:判斷左邊值是否小于右邊值
- <=或者lte:判斷左邊值是否小于等于右邊值
= 和 == 模板代碼
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Hello World!</title>
</head>
<body><b>比較運(yùn)算符</b><br/><br/><dl><dt> =/== 和 != 比較:</dt><dd><#if "xiaoming" == "xiaoming">字符串的比較 "xiaoming" == "xiaoming"</#if></dd><dd><#if 10 != 100>數(shù)值的比較 10 != 100</#if></dd></dl><dl><dt>其他比較</dt><dd><#if 10 gt 5 >形式一:使用特殊字符比較數(shù)值 10 gt 5</#if></dd><dd><#-- 日期的比較需要通過?date將屬性轉(zhuǎn)為data類型才能進(jìn)行比較 --><#if (date1?date >= date2?date)>形式二:使用括號形式比較時間 date1?date >= date2?date</#if></dd></dl><br/>
<hr>
</body>
</html>
Controller 的 數(shù)據(jù)模型代碼
@GetMapping("operation")
public String testOperation(Model model) {//構(gòu)建 Date 數(shù)據(jù)Date now = new Date();model.addAttribute("date1", now);model.addAttribute("date2", now);return "03-operation";
}
比較運(yùn)算符注意
- =和!=可以用于字符串、數(shù)值和日期來比較是否相等
- =和!=兩邊必須是相同類型的值,否則會產(chǎn)生錯誤
- 字符串 “x” 、"x " 、"X"比較是不等的.因?yàn)镕reeMarker是精確比較
- 其它的運(yùn)行符可以作用于數(shù)字和日期,但不能作用于字符串
- 使用gt等字母運(yùn)算符代替>會有更好的效果,因?yàn)?FreeMarker會把>解釋成FTL標(biāo)簽的結(jié)束字符
- 可以使用括號來避免這種情況,如:<#if (x>y)>
邏輯運(yùn)算符
- 邏輯與:&&
- 邏輯或:||
- 邏輯非:!
邏輯運(yùn)算符只能作用于布爾值,否則將產(chǎn)生錯誤 。
模板代碼
<b>邏輯運(yùn)算符</b><br/><br/><#if (10 lt 12 )&&( 10 gt 5 ) >(10 lt 12 )&&( 10 gt 5 ) 顯示為 true</#if><br/><br/><#if !false>false 取反為true</#if>
<hr>
空值處理
1、判斷某變量是否存在使用 “??”
用法為:variable??,如果該變量存在,返回true,否則返回false
例:為防止stus為空報(bào)錯可以加上判斷如下:
<#if stus??><#list stus as stu>......</#list></#if>
2、缺失變量默認(rèn)值使用 “!”
-
使用!要以指定一個默認(rèn)值,當(dāng)變量為空時顯示默認(rèn)值
例: ${name!‘’}表示如果name為空顯示空字符串。 -
如果是嵌套對象則建議使用()括起來
例: ${(stu.bestFriend.name)!‘’}表示,如果stu或bestFriend或name為空默認(rèn)顯示空字符串。