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;如可靠性低、扩展性差、响应速…