首页 > 其他分享 >Freemarker模板引擎技术

Freemarker模板引擎技术

时间:2025-01-21 20:30:09浏览次数:3  
标签:Freemarker freemarker stuMap stu 引擎 模板 name

问题】当渲染文章数据时,由于文章的数据很多,直接去查询文章内容表的话,效率比较低。
解决】使用freemarker将文章的内容通过模板技术生成静态的html文件存储到minio中,这样用户就只需要拿着minio的url去minio里获取静态页面即可。效率大大提高
在这里插入图片描述

模板引擎

Freemarker是一种模板引擎:一种基于模板和要改变的数据,并用来生成输出文本(html网页、电子邮件、配置文件、源代码…)的通用工具。不是面向最终用户的,而是一个Java类库。
在这里插入图片描述

步骤

  1. 导入依赖
<dependencies>
    <!-- freemarker -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </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模板文件的后缀名(默认是.ftlh)

suffix的属性也可以是.html、.xml、.jsp等,但是一般是以ftl作为扩展名

  1. 在resources下创建templates,此目录为freemarker的默认模板存放目录。在templates下创建模板文件basic.ftl,模板中的插值表达式最终会被freemarker替换成具体的数据。
    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>
  1. 往模板里填数据,返回模板文件
@Controller // 因为要返回视图,而不是json字符串,所以这里不可以用@RestController
public class HelloController {
    @GetMapping("/basic")
    public String hello(Model model) {
        // name
        model.addAttribute("name", "xiaolin");
        // stu
        Student stu = new Student("03", 18);
        model.addAttribute("stu", stu);
        return "basic"; // 这里返回的数据必须和模板视图的名字一样,这样才能找到模板视图(别带后缀!!!)
    }
}

Freemarker指令语法

基础语法种类

1. 注释<#-- -->

介于其之间的内容会被Freemarker忽视

<#--我是一个freemarker注释-->

2. 插值表达式${...}

Freemarker会用真实的值替代${…}

Hello ${name}

3. FTL指令<#> </#>

名字前加#区分,Freemarker会解析标签中的表达式或逻辑。
例如:

<#list stus as stu>${stu.name}</#list> 

4. 文本

仅文本信息,不是freemarker的注释、插值、FTL指令的内容会被Freemarker忽略解析,直接输出内容。

<#--freemarker中的普通文本-->
我是一个普通的文本

集合指令(List、Map)

List

<table>
    <tr>
        <td>序号</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>钱包</td>
    </tr>
    <#--遍历数据 stu指的是集合里的每一个数据-->
    <#list stus as stu>
        <tr>
            <#--获取当前集合的下标-->
            <td>${stu_index + 1}</td>
            <td>${stu.name}</td>
            <td>${stu.age}</td>
            <td>${stu.money}</td>
        </tr>
    </#list>
</table>

Map

获取map中某个key对应的值
  1. 通过map['keyname'].property
姓名:${stuMap['stu1'].name}<br/>
年龄:${stuMap['stu1'].age}<br/>
  1. 通过map.keyname.property
姓名:${stuMap.stu2.name}<br/>
年龄:${stuMap.stu2.age}<br/>
遍历map
<table>
    <tr>
        <td>序号</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>钱包</td>
    </tr>
    <#--遍历数据 key指的是map中的每一个key-->
    <#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>
</table>

if指令

<#if 表达式>
<#else>
</if>

【例】:姓名为小红的数据字体显示为红色

<#if name = '小红'>
	<span style = "color: red">${name}</span>
	<#else>
		<span>${name}</span>
</if>

在Freemarker中,=== 是一样的

运算符

数值运算符

  1. 加法:+
  2. 减法:-
  3. 乘法:*
  4. 除法:/
  5. 求余:%

比较运算符

在这里插入图片描述

= 和 != 可以用于字符串、数值、日期来比较是否相等
= 和 != 两边必须是相同类型的值,否则会产生错误
字符串"x"和"x "和"X"比较是不相等的
gt代替>,因为Freemarker会把>解析成FTL标签结束的字符串,可以用括号避免这种情况,如:<#if (x > y)>

逻辑运算符

  1. 逻辑与:&&
  2. 逻辑或:||
  3. 逻辑非:!

空值处理

  1. 判断某个变量是否存在使用:“??”
    用法:变量??
    • 变量存在,返回true
    • 不存在,返回false
<#if stus??>
	<#list stus as stu>
		...
	<#list>
</#if>
  1. 缺失的变量使用:!
    用法:!默认值
    • 使用!要指定一个默认值,当变量为空时显示默认值
    • 如果是嵌套对象,要使用()括起来
<#--如果name为空显示空字符串''-->
${name!''}
<#--如果stu或name为空,默认显示空字符串''-->
${(stu.name)!''}

内建函数

语法格式:变量 + ? + 函数名称

  1. 集合大小
${集合名?size}
  1. 日期格式化
    显示日期+时间:${today?datetime}
    自定义格式化:${today?string("yyyy年MM月")}
    显示时分秒:${today?time}
    显示年月日:${today?date}
  2. 内建函数c
    【场景】:point是数值类型,使用${point}会显示这个数字的数值,每三位使用逗号分隔。如果不想显示为每隔三位分割的数字,可以使用c函数将数字型转成字符串输出。
    在这里插入图片描述
model.addAttribute("poin", 123456780L);

使用内建函数c:

${point?c}
  1. 将json字符串转为对象
<#--assign标签的作用:定义一个变量-->
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#--把json转成变量-->
<#assign data=text?eval />
开户行:${data.bank}
账号:${data.account}

注意:eval的使用可能不安全,如果传入的字符串内容不可控(比如来自用户输入),可能会导致安全问题(例如代码注入)

标签:Freemarker,freemarker,stuMap,stu,引擎,模板,name
From: https://blog.csdn.net/qq_57882997/article/details/145262781

相关文章

  • C++template模板
    目录函数模板(FunctionTemplate)示例:类模板(ClassTemplate)示例:模板参数(TemplateParameters)非类型模板参数示例:模板特化(TemplateSpecialization)示例:C++中的模板(Template)是一种强大的特性,允许程序员编写与类型无关的代码。模板可以用于函数和类,使得代码更加通用和可......
  • 2025年好用的AI搜索引擎
    2025年了,当然要用AI享受不受语言限制的互联网冲浪体验!网友们抱怨中文互联网信息质量已经十三年了 到了2025年,我们终于可以用中文浏览其它语言的宝藏信息了!大同搜索能搜到任何语言的高质量信息,自带网页翻译,主打一个信息大同。主页长这样,很简洁!搜一个“CNNRNN”试试,先......
  • 火山引擎数据飞轮2.0:聚焦Data+AI,驱动企业数智化转型
    数字化浪潮席卷全球,数据与人工智能的融合正给各行各业带来巨大变革,不仅重塑数据处理流程,更在决策支持、业务优化、产品创新等多个维度上展现巨大的潜力。 近期,火山引擎数智平台技术和产品专家受邀出席DataFun首届“数据与人工智能解决方案大会”,围绕数据飞轮2.0模式,及Data+AI......
  • 如何高效且安全地进行网站页面模板的修改?
    在现代网站建设中,页面模板的修改是提升用户体验、优化SEO排名以及保持网站美观度的重要手段。以下是详细的步骤:备份现有模板:在开始任何修改之前,请确保已经对当前使用的模板进行了完整备份。这可以防止意外错误导致的数据丢失。选择合适的编辑工具:根据所用的内容管理系统(CMS),如Wo......
  • 掌握这些技巧,让你轻松应对网站模板修改中的常见挑战
    注意事项解释遵循最佳实践始终按照官方文档推荐的方式来进行修改,避免直接编辑核心文件,以减少升级时出现问题的风险。考虑SEO影响模板中的元标签、标题标签等元素直接影响搜索引擎抓取效率,因此在修改时要格外小心,确保不会破坏原有SEO设置。维护一致性整个网站应......
  • 洛谷 P3397:地毯 ← “二维前缀和 + 二维差分”模板题
    【题目来源】https://www.luogu.com.cn/problem/P3397【题目描述】在n×n的格子上有m个地毯。给出这些地毯的信息,问每个点被多少个地毯覆盖。【输入格式】第一行,两个正整数n,m。意义如题所述。接下来m行,每行两个坐标(x1,y1)和(x2,y2),代表一块地毯,左上角......
  • 【C++提高篇】—— C++泛型编程之模板基本语法和使用的详解
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、模板的概念二、函数模板2.1函数模板的使用2.2函数模板注意事项2.3普通函数与函数模板的区别2.4普通函数与函数模板的调用规则2.5模板的局限性三、类模板3.1类模板的使用3.2类模板......
  • C++ 模板(函数模板与类模板)
    原文链接:https://www.cnblogs.com/1873cy/p/18398002模板模板介绍#C++提供了函数模板(functiontemplate)。所谓函数模板。实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡事函数体相同的函数都可以使用这个模板......
  • 如何修改网站模板结构:详细指南
    修改网站模板结构是提升网站设计和用户体验的重要步骤。以下是详细的修改步骤和注意事项,适用于各种类型的网站管理系统:备份网站文件:在进行任何文件修改之前,务必备份网站的所有文件和数据库。您可以使用FTP工具下载网站文件,或者通过网站托管商提供的备份功能进行备份。确保备......
  • 如何修改网站模板:详细教程
    修改网站模板是提升网站设计和用户体验的重要步骤。以下是详细的修改步骤和注意事项,适用于各种类型的网站管理系统:备份网站文件:在进行任何文件修改之前,务必备份网站的所有文件和数据库。您可以使用FTP工具下载网站文件,或者通过网站托管商提供的备份功能进行备份。确保备份文......