FreeMarker使用

说明: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\resourcesconfiguration.setDirectoryForTemplateLoading(new File("模板所在的目录"));//设置字符集configuration.setDefaultEncoding("utf-8");//加载模板文件,模板文件名,如mode.ftlTemplate 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://xiahunao.cn/news/1619891.html

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

相关文章

网络模型分析

# 用户空间和内核空间 # 阻塞IO # 非阻塞IO # IO多路复用 IO多路复用-select 内核中遍历找到就绪的fd并保留&#xff0c;不匹配的就置为0&#xff0c; 以上的操作重复&#xff0c;知道所有的FD都完成 IO多路复用-poll IO多路复用-epoll IO多路复用-事件通知机制 很多进程都要用…

魔鬼之城

题目描述 在一个被分割为N*M个正方形房间的矩形魔鬼之城中&#xff0c;一个探险者必须遵循下列规则才能跳跃行动。他必须从(1, 1)进入&#xff0c;从(N, M)走出&#xff1b;在每一房间的墙壁上都写了一个魔法数字&#xff0c;是1&#xff5e;13之内的自然数&#xff1b;探险者可…

心灵毒药之CIA篇(二)

2019独角兽企业重金招聘Python工程师标准>>> 工欲善其事,必先利其器,而且最好是最锋利,最合适的器.因为器能成为你身体的延伸部分,同时还可以成为你信心的来源. 磨器的耐心,用器的巧心,藏器的无心. 转载于:https://my.oschina.net/piginwind/blog/713487

啊,万恶的this

一、全局下&#xff0c;this一般都指向window 全局下&#xff0c;ES5非严格模式&#xff0c;下面的this都是window。 console.log(this); function abc(){console.log(this); } abc();二、对象中的this 1、最常见的this情况&#xff1a; var a100;var obj{a:1,b:function()…

关押罪犯

题目&#xff1a; 描述S 城现有两座监狱&#xff0c;一共关押着 NNN 名罪犯&#xff0c;编号分别为 111 ~ NNN。他们之间的关系自然也极不和谐。 很多罪犯之间甚至积怨已久&#xff0c;如果客观条件具备则随时可能爆发冲突。 我们用 “怨气值”&#xff08;一个正整数值&#…

罪恶

&#xff0d;&#xff0d;&#xff0d;&#xff0d; 罪恶 还是属于闲得慌&#xff0c;瞎拍。也许您会帮我想个更棒的标题&#xff0c;或者干脆叫“无题”。 转载于:https://www.cnblogs.com/hzy5901/archive/2010/03/16/5871737.html

游戏开发学什么?四步修炼骨灰级高手

游戏开发学什么&#xff1f;四步修炼骨灰级高手 近日App Store公布了2013年年度最佳游戏奖项&#xff0c;复古风格的捕鱼游戏《奇葩钓鱼》荣获了iPhone平台上年度最佳游戏的殊荣&#xff0c;拥有独特视觉效果的横版冒险游戏《罪恶之地》夺得了iPad平台上年度最佳游戏的桂冠。…

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

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

3D飞镖游戏源码ios版

一款ios 3D飞镖游戏源码,通过物理引擎和重力感应来控制飞镖向目标物体击中&#xff01;游戏比较简单&#xff0c;可以学习一下3D游戏的基本开发. 源码下载&#xff1a; http://code.662p.com/view/6262.html 开发平台&#xff1a; 在xcode 4.3编译通过&#xff0c;iphone4&am…

PS飞镖靶的制作

首先我们在Ps中新建一个600像素*600像素的画布&#xff0c;设置分辨率300/200都可以。 步骤如下&#xff1a; 1.拉出两条参考线&#xff0c;一条垂直居中&#xff0c;一条水平居中。 2.用椭圆工具在两参考线中心点拉出一个圆形&#xff0c;设置颜色红色。用矩形选框工具裁剪掉3…

[SCOI2011]飞镖[数学模拟]

2335: [SCOI2011]飞镖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 482 Solved: 152[Submit][Status][Discuss] Description 飞镖是在欧洲颇为流行的一项运动。它的镖盘上分为20个扇形区域&#xff0c;分别标有1到20的分值&#xff0c;每个区域中有单倍、双倍和三倍的区…

【题解】[SCOI2011] 飞镖

模拟题 红靶子的我们先不考虑。 如果是 {1,2,2} &#xff0c; {2,2,3} 这种只涉及两种倍数的话&#xff0c;我们想到不定方程&#xff1a; axby c 的通解形式&#xff08;a,b,c 为常数&#xff09;&#xff0c;从而探讨 x,y 在规定取值内是否有解。 探讨 {1,2,3} 的情况。 …

搭载双筒飞镖?这款无人机太危险

折叠式的设计使之方便携带&#xff0c;堪称猎犬好搭档。 近日&#xff0c;基于SuperDrone无人机&#xff0c;南非Haevic公司改造了一款搭载飞镖枪的无人机——DartDrone&#xff0c;专为兽医及狩猎人员研发。 据悉&#xff0c;SuperDrone是一款采用可折叠结构的六翼无人机&…

BZOJ2335: [SCOI2011]飞镖

Description 飞镖是在欧洲颇为流行的一项运动。它的镖盘上分为20个扇形区域&#xff0c;分别标有1到20的分值&#xff0c;每个区域中有单倍、双倍和三倍的区域&#xff0c;打中对应的区域会得到分值乘以倍数所对应的分数。例如打中18分里面的三倍区域&#xff0c;就会得到54分。…

飞镖(bzoj 2335)

Description 飞镖是在欧洲颇为流行的一项运动。它的镖盘上分为20个扇形区域&#xff0c;分别标有1到20的分值&#xff0c;每个区域中有单倍、双倍和三倍的区域&#xff0c;打中对应的区域会得到分值乘以倍数所对应的分数。例如打中18分里面的三倍区域&#xff0c;就会得到54分。…

飞镖和招聘

4月16日 公司里面玩飞镖的同事越来越多了&#xff0c;不少人都得了飞镖综合症&#xff08;手酸、腰酸、对休息时间非常敏感&#xff09;。除了飞镖游戏本身的吸引力&#xff0c;我还发现它有很多和我们从事猎头 招聘非常相似的特征&#xff1a; Know how to close the game. 懂…

java设计飞镖游戏_3分钟手把手带你使用Unity制作“扔飞镖游戏”

原标题&#xff1a;3分钟手把手带你使用Unity制作“扔飞镖游戏” 日落西山红霞飞~战士打靶把营归呀巴扎嘿。今天我制作一个简单的打靶游戏(扔飞镖) 在制作之前首先要思考这个游戏需要什么对象&#xff0c;很简单&#xff0c;一只飞镖、一个靶。 这里我把飞镖设置成了刚体&#…

Leetcode——1453. 圆形靶内的最大飞镖数量

墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0],[0,2],[0,-…

打印飞镖图形

打印如图下非标 代码如下 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<string.h> int main() {int n 0;while (scanf("%d", &n) 1){//上n行int i 0;for (i 0; i < n; i){int j 0;for (j 0…

【数据结构与算法】之深入解析“圆形靶内的最大飞镖数量”的求解思路与算法示例

一、题目要求 墙壁上挂着一个圆形的飞镖靶,现在请你蒙着眼睛向靶上投掷飞镖。投掷到墙上的飞镖用二维平面上的点坐标数组表示,飞镖靶的半径为 r,请返回能够落在任意半径为 r 的圆形靶内或靶上的最大飞镖数。示例 1:输入:points = [[-2,0],[2,0],[