FreeMarker使用

news2024/11/17 13:30:33

说明:FreeMake可以通过设置一个模板,使用一些语法规则,可根据返回的VO数据填充到这个模板中,生成一个静态。这个技术,在项目中可以实现如预览页面的功能,将查询完成的VO数据按照这个模板填充,生成一个静态页面返回给前端就可以了。

官网说明如下:

Apache FreeMarker™ is a template engine: a Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data. Templates are written in the FreeMarker Template Language (FTL), which is a simple, specialized language (not a full-blown programming language like PHP). Usually, a general-purpose programming language (like Java) is used to prepare the data (issue database queries, do business calculations). Then, Apache FreeMarker displays that prepared data using templates. In the template you are focusing on how to present the data, and outside the template you are focusing on what data to present.(官方语)

翻译如下:

Apache FreeMarker™ 是一个模板引擎:一个Java库,用于根据模板和不断变化的数据生成文本输出(HTML网页、电子邮件、配置文件、源代码等)。模板是用FreeMarker模板语言(FTL)编写的,这是一种简单、专业的语言(不是像PHP这样成熟的编程语言)。通常,通用编程语言(如Java)用于准备数据(发布数据库查询、进行业务计算)。然后,Apache FreeMarker使用模板显示准备好的数据。在模板中,您关注的是如何呈现数据,而在模板之外,您则关注的是要呈现什么数据。

FreeMarker简单语法

FreeMarker中常用的语法和表达式如下:

(1)插值表达式

java代码

Map map = new HashMap();
map.put("name", "张三");
map.put("message", "hello freemarker!!!");
map.put("linkman", "小王");

FreeMarker模板

<#--1.插值表达式-->
我是:${name}
你好,${message}
<br>
<hr>
联系人:${linkman}
<br>

页面效果

在这里插入图片描述

(2)assign指令

assign指令可以选择本地声明,即在模板中写,也可使用数据模式中的数据;

java代码

User user = new User();
user.setUsername("小明");
user.setPassword("123456");
map.put("user", user);

FreeMarker模板

<#--2.assign指令:本地声明-->
<#assign info={"mobile":"12345678910","address":'杭州市'}>
电话:${info.mobile} 地址:${info.address}
<br>

<#--2.assign指令:数据模型-->
用户名:${user.username}
密码:${user.password}

页面效果

在这里插入图片描述

(3)if指令

java代码

map.put("success", true);

FreeMarker模板

<#--3.if指令-1-->
<#assign success=false>
<#if success>
    你已通过实名认证
<#else>
    你未通过实名认证
</#if>
<br>
<hr>

<#--3.if指令-2-->
<#assign number1 = 10>
<#assign number2 = 5>
<#if number1 + number2 gte 20 || number1 - number2 lt 2>
    number1 * number2 : ${number1 * number2}
<#else>
    number1 / number2  : ${number1 / number2}
</#if>
<br>
<hr>

<#--3.if指令-3-->
<#assign var = 999>
<#if var == 999>
    var = 999
<#elseif var == 888>
    var = 888
<#else >
    var = 111
</#if>
<br>
<hr>

页面效果

在这里插入图片描述

(4)集合遍历

可在Map作为对象,也可使用实体类作为对象;

java代码

	List goodsList = new ArrayList();
	
	Map goods1 = new HashMap();
	goods1.put("name", "苹果");
	goods1.put("price", 5.8);
	
	Map goods2 = new HashMap();
	goods2.put("name", "香蕉");
	goods2.put("price", 2.5);
	
	Map goods3 = new HashMap();
	goods3.put("name", "橘子");
	goods3.put("price", 3.2);
	
	goodsList.add(goods1);
	goodsList.add(goods2);
	goodsList.add(goods3);
	
	map.put("goodsList", goodsList);
	
	User user1 = new User();
	user1.setUsername("小强");
	user1.setPassword("123456");
	
	User user2 = new User();
	user2.setUsername("小红");
	user2.setPassword("123456");
	
	ArrayList<User> users = new ArrayList<User>();
	users.add(user1);
	users.add(user2);
	map.put("users", users);

FreeMarker模板

<#--4.集合遍历-1-->
<#list goodsList as goods>
    商品名称: ${goods.name} 价格:${goods.price} 索引:${goods_index + 1}<br>
</#list>
<br>

<#list users as user >
    用户名:${user.username}====密码:${user.password}<br>
</#list>
<br>

<#--4.集合遍历-2-->
<#list ["winter", "spring", "summer", "autumn"] as x>
    ${x}<br>
</#list>
<br>
<hr>

页面效果

在这里插入图片描述

(5)字符串输出

FreeMarker模板

<#--5.字符串输出,支持以下四种方式
    (1)通过变量直接输出
    (2)通过字符串常量输出
    (3)通过表达式输出
    (4)通过字符串拼接输出
-->
<#assign name="zhangsan"/>
<br><br>
hello ${name} <br>
${"hello"}${name}<br>
${"Hello ${name} !"} <br>
${"Hello " + name + " !"}<br>
<br>
<hr>

页面效果

在这里插入图片描述

(6)字符串常量

FreeMarker模板

<#--6.声明一个字符串常量,加r表示原始字符串-->
<#assign cname=r"特殊字符完成输出(http:\\www.baidu.com)">
${cname}
<br>
<hr>

页面效果

在这里插入图片描述

(7)字符串截取

FreeMarker模板

<#--7.字符串截取
    通过下标直接获取下标对应的字母
    起点下标..结尾下标截取字符串
-->
字符串截取 :<br>
通过下标直接获取下标对应的字母:${name[2]}<br>
起点下标..结尾下标截取字符串:${name[0..5]}
<br>
<hr>

页面效果

在这里插入图片描述

(8)运算符

FreeMarker模板

<#--8.运算符,注意运算符不要写在大括号外面-->
<#assign number1 = 10>
<#assign number2 = 5>
算数运算:<br>
"+" : ${number1 + number2}<br>
"-" : ${number1 - number2}<br>
"*" : ${number1 * number2}<br>
"/" : ${number1 / number2}<br>
"%" : ${number1 % number2}<br>
<br>
<hr>

页面效果

在这里插入图片描述

(9)函数

java代码

map.put("dTime", new Date());

FreeMarker模板

<#--9.函数
    语法:${变量名?内联函数名称}
    具体函数名称参考官方文档:https://freemarker.apache.org/docs/ref_builtins_string.html
-->
内建/内建函数:<br>
<#assign data = "abcd1234">
第一个字母大写:${data?cap_first}
所有字母小写:${data?lower_case}
所有字母大写:${data?upper_case}
<br>
<hr>

<#assign floatData = 12.84><br>
数值取整数:${floatData?int}<br>
获取集合的长度:${goodsList?size}<br>

时间格式化:<br>
<#--${dTime} 如果我们的模型是日期类型 必须要指定日期格式 -->
${dTime?date}<br>
${dTime?time}<br>
${dTime?datetime}<br>
${dTime?string("yyyy/MM/dd")}
<br>
<hr>

页面效果

在这里插入图片描述

(10)自定义函数

java代码

map.put("nullList", null);

FreeMarker模板

<#--10.自定义函数:判断是否为空或者为null
    固定写法:模型数据名称??
-->
判断是否为空或者为null:<br>
<#if nullList??>
    <#list nullList as null >
        ${null.name} - ${null.price}<br>
    </#list>
<#else>
    集合为空
</#if>

页面效果

在这里插入图片描述

使用

第一步:添加依赖

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.32</version>
        </dependency>

第二步:创建模板

创建一个模板,后缀名是.ftl如下,我在resource文件夹下创建了一个模板(mode.ftl),

在这里插入图片描述

内容如下

<html>
<head>
    <meta charset="utf-8">
    <title>Freemarker使用</title>
</head>
<body>


<#--1.插值表达式-->
我是:${name}
你好,${message}
<br>
<hr>
联系人:${linkman}
<br>

<#--2.assign指令:本地声明-->
<#assign info={"mobile":"12345678910","address":'杭州市'}>
电话:${info.mobile} 地址:${info.address}
<br>

<#--2.assign指令:数据模型-->
用户名:${user.username}
密码:${user.password}

<hr>

<#--3.if指令-1-->
<#assign success=false>
<#if success>
    你已通过实名认证
<#else>
    你未通过实名认证
</#if>
<br>
<hr>

<#--3.if指令-2-->
<#assign number1 = 10>
<#assign number2 = 5>
<#if number1 + number2 gte 20 || number1 - number2 lt 2>
    number1 * number2 : ${number1 * number2}
<#else>
    number1 / number2  : ${number1 / number2}
</#if>
<br>
<hr>

<#--3.if指令-3-->
<#assign var = 999>
<#if var == 999>
    var = 999
<#elseif var == 888>
    var = 888
<#else >
    var = 111
</#if>
<br>
<hr>


<#--4.集合遍历-1-->
<#list goodsList as goods>
    商品名称: ${goods.name} 价格:${goods.price} 索引:${goods_index + 1}<br>
</#list>
<br>

<#list users as user >
    用户名:${user.username}====密码:${user.password}<br>
</#list>
<br>

<#--4.集合遍历-2-->
<#list ["winter", "spring", "summer", "autumn"] as x>
    ${x}<br>
</#list>
<br>
<hr>

<#--5.字符串输出,支持以下四种方式
    (1)通过变量直接输出
    (2)通过字符串常量输出
    (3)通过表达式输出
    (4)通过字符串拼接输出
-->
<#assign name="zhangsan"/>
<br><br>
hello ${name} <br>
${"hello"}${name}<br>
${"Hello ${name} !"} <br>
${"Hello " + name + " !"}<br>
<br>
<hr>

<#--6.声明一个字符串常量,加r表示原始字符串-->
<#assign cname=r"特殊字符完成输出(http:\\www.baidu.com)">
${cname}
<br>
<hr>


<#--7.字符串截取
    通过下标直接获取下标对应的字母
    起点下标..结尾下标截取字符串
-->
字符串截取 :<br>
通过下标直接获取下标对应的字母:${name[2]}<br>
起点下标..结尾下标截取字符串:${name[0..5]}
<br>
<hr>


<#--8.运算符,注意运算符不要写在大括号外面-->
<#assign number1 = 10>
<#assign number2 = 5>
算数运算:<br>
"+" : ${number1 + number2}<br>
"-" : ${number1 - number2}<br>
"*" : ${number1 * number2}<br>
"/" : ${number1 / number2}<br>
"%" : ${number1 % number2}<br>
<br>
<hr>


<#--9.函数
    语法:${变量名?内联函数名称}
    具体函数名称参考官方文档:https://freemarker.apache.org/docs/ref_builtins_string.html
-->
内建/内建函数:<br>
<#assign data = "abcd1234">
第一个字母大写:${data?cap_first}
所有字母小写:${data?lower_case}
所有字母大写:${data?upper_case}
<br>
<hr>

<#assign floatData = 12.84><br>
数值取整数:${floatData?int}<br>
获取集合的长度:${goodsList?size}<br>

时间格式化:<br>
<#--${dTime} 如果我们的模型是日期类型 必须要指定日期格式 -->
${dTime?date}<br>
${dTime?time}<br>
${dTime?datetime}<br>
${dTime?string("yyyy/MM/dd")}
<br>
<hr>

<#--10.自定义函数:判断是否为空或者为null
    固定写法:模型数据名称??
-->
判断是否为空或者为null:<br>
<#if nullList??>
    <#list nullList as null >
        ${null.name} - ${null.price}<br>
    </#list>
<#else>
    集合为空
</#if>
</body>
</html>

第三步:编写测试类

在项目中创建一个测试类,里面读取FreeMarker模板,设置数据模型,并输出为html页面;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.example.pojo.User;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.*;

@SpringBootTest
public class MyTest {
    public static void main(String[] args) throws IOException, TemplateException {
        //创建freemarker的配置对象
        Configuration configuration = new Configuration(Configuration.getVersion());

        //设置模板文件所在目录,如C:\Users\10765\Desktop\XXX\freemarker_essay\freemarker_essay\src\main\resources
        configuration.setDirectoryForTemplateLoading(new File("模板所在的目录"));

        //设置字符集
        configuration.setDefaultEncoding("utf-8");

        //加载模板文件,模板文件名,如mode.ftl
        Template template = configuration.getTemplate("模板文件");
        
        // 准备模板文件中所需要的数据,通常是通过Map进行构造
        Map map = new HashMap();
        map.put("name", "张三");
        map.put("message", "hello freemarker!!!");

        map.put("linkman", "小王");

        map.put("success", true);

        User user = new User();
        user.setUsername("小明");
        user.setPassword("123456");
        map.put("user", user);

        List goodsList = new ArrayList();

        Map goods1 = new HashMap();
        goods1.put("name", "苹果");
        goods1.put("price", 5.8);

        Map goods2 = new HashMap();
        goods2.put("name", "香蕉");
        goods2.put("price", 2.5);

        Map goods3 = new HashMap();
        goods3.put("name", "橘子");
        goods3.put("price", 3.2);

        goodsList.add(goods1);
        goodsList.add(goods2);
        goodsList.add(goods3);

        map.put("goodsList", goodsList);

        User user1 = new User();
        user1.setUsername("小强");
        user1.setPassword("123456");

        User user2 = new User();
        user2.setUsername("小红");
        user2.setPassword("123456");

        ArrayList<User> users = new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        map.put("users", users);

        map.put("dTime", new Date());

        map.put("nullList", null);

        //准备输出流对象,用于输出静态文件
        Writer writer = new FileWriter("test.html");

        //输出 freemarker的数据模型的类型只能是map或是JavaBean对象
        template.process(map, writer);

        //关闭流
        writer.close();
    }
}

第四步:启动测试

执行程序,可以在项目的根目录下找到test.html文件,打开后就是数据按照模板填充的效果;

在这里插入图片描述

总结

类似于EasyExcel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/936236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…

python函数学习

def add(num1,num2):resultnum1num2print(f"函数add输出的结果是{result}")return result resultadd(int(num1), int(num2)) print(f"调用def add(num1,num2):这个函数最终返回的结果是: {result}")# 函数返回值 ②无返回值&#xff08;也就是说是返回值类…

python下载bilibili视频,下载合集,下载选集

一. 内容简介 bilibili视频下载&#xff0c;下载合集&#xff0c;下载选集 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1tO8xSmaqqoTxHI9P_UkDBw?pwd1234 提取码&#xff1a;1234 三.主要流程 3.1 …

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 一、理论 1.CA认证中心 &#xff08;1&#xff09;概念 CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户发放数字证…

C语言-内存分布(STM32内存分析)

C/C内存分布 一、内存组成二、静态区域文本段 &#xff08;Text / 只读区域 RO&#xff09;已初始化读写数据段&#xff08;RW data -- Initialized Data Segment&#xff09;未初始化数据段&#xff08;BSS -- Block Started by Symbol&#xff09; 三、动态区域堆&#xff08…

如何复刻稚晖君的ctrl-FOC-lite

一、simpleFOC版本工程使用clion重新打开为“Cmake”工程&#xff1a; 1、我删除了simpleFOC版本工程文件夹下的cmake-build-debug、.idea文件夹&#xff1b; 2、使用clion重新打开为“Cmake”工程&#xff0c;配置均按照稚晖君的教程进行的配置。 3、使用stm32cubeMX6.5版本重…

数仓--------简单了解

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

[Android]JNI的基础知识

目录 1.什么是JNI 2.配置JNI开发环境NDK 3.创建Native C类型的项目 4. 了解CMakeLists.txt 文件 5.了解native-lib.cpp 文件 6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法 1.什么是JNI JNI&#xff08;Java Native Interface&#xff09;是一…

SciencePlots 基本语法及特点

文章目录 简介安装 LaTeXSciencePlots 绘图示例 简介 用户有时需要根据期刊的配图绘制要求进行诸如字体、刻度轴、轴脊、图例等图层属性的定制化修改&#xff0c;耗时的同时也会容易导致用户忽略一些图层细节要求。 SciencePlots 作为一个专门用于科研论文绘图的第三方拓展工…

设计模式第九讲:常见重构技巧 - 去除不必要的!=

设计模式第九讲&#xff1a;常见重构技巧 - 去除不必要的! 项目中会存在大量判空代码&#xff0c;多么丑陋繁冗&#xff01;如何避免这种情况&#xff1f;我们是否滥用了判空呢&#xff1f;本文是设计模式第九讲&#xff0c;讲解常见重构技巧&#xff1a;去除不必要的! 文章目录…

机房安全之道:构筑坚固的网络防线

引言&#xff1a; 在数字化时代&#xff0c;机房成为了许多组织和企业的核心基础设施&#xff0c;承载着重要的数据和应用。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线&#xff0c;保护机房免受攻击的方…

代码随想录打卡—day42—【DP】— 8.27 01背包基础

1 01背包基础 背包概述&#xff1a; 1.1 01背包是什么 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1.2 01背包二维数组 二维数组还…

JavaSE 集合框架及背后的数据结构

目录 1 介绍2 学习的意义2.1 Java 集合框架的优点及作用2.2 笔试及面试题 3 接口 interfaces3.1 基本关系说明3.2 Collection 常用方法说明3.3 Collection 示例3.4 Map 常用方法说明3.5 Map 示例 4 实现 classes5 Java数据结构知识体系5.1 目标5.2 知识点 1 介绍 集合&#xf…

【运维】hadoop集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

java 高级面试题整理(薄弱技术-2023)

session 和cookie的区别和联系 session1.什么是session Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存在客户端浏览器中&#xff0c;而Session保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上。这就…

Docker容器:docker consul的注册与发现及consul-template

Docker容器&#xff1a;docker consul的注册与发现及consul-template守护进程 一.docker consul的注册与发现介绍 1.什么是服务注册与发现 &#xff08;1&#xff09;服务注册与发现是微服务架构中不可或缺的重要组件。 &#xff08;2&#xff09;为解决服务都是单节点的&a…

基于动物迁徙算法优化的BP神经网络(预测应用) - 附代码

基于动物迁徙算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于动物迁徙算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.动物迁徙优化BP神经网络2.1 BP神经网络参数设置2.2 动物迁徙算法应用 4.测试结果&#xff1a;5…

IT论坛测试

目录 一、项目介绍 项目名称 项目简介 相关技术 项目展示 二 、测试用例设计和功能测试 测试用例设计 注册页面 登陆页面 首页面 发布帖子页面 修改个人信息页面 功能测试 注册页面 登录页面 首页面 发布帖子页面 修改个人信息页面 三、接口测试 1.Junit单…

HAproxy+keepalived高可用配置搭建

目录 一、概述 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;核心功能 &#xff08;三&#xff09;关键特性 &#xff08;四&#xff09;应用场景 二、安装 1&#xff09;拓补图 2&#xff09;配置 &#xff08;一&#xff09;内核配置 &#xff08;二…