【Java】SpringBoot项目整合FreeMarker加快页面访问速度
文章目录
- 什么是FreeMarker?
- 它的优点有那些?
- 使用方式
什么是FreeMarker?
Freemarker是一个模板引擎技术,它可以将数据和模板结合起来生成最终的输出。它是一种用于生成文本输出(如HTML、XML、JSON等)的通用模板引擎。
FreeMarker 提供了一种将模板和数据分离的方式,使得开发人员可以专注于业务逻辑和数据准备,而将视图的生成交给模板引擎处理。它引入了模板语言,使用简洁的表达式和指令来描述数据的显示和处理方式。
通过使用Freemarker,开发人员可以将动态内容与静态模板分离,实现更清晰、更可维护的代码。模板可以含有一些特殊的标记和占位符,称为表达式,用于表示数据的插入、循环、条件判断和字符格式化等操作。这些表达式和指令的执行会在渲染过程中动态地将数据填充到模板中,生成最终的输出结果。
Freemarker 的主要特点包括:
强大的模板语言:Freemarker 提供了丰富的模板语法,支持基本的逻辑判断、循环迭代、变量引用、过滤器、宏定义等功能,使开发人员能够灵活地控制输出的内容。
分离视图和业务逻辑:通过将视图的生成和数据处理分离,开发人员可以更好地组织代码,提高代码的可读性和可维护性,并促进团队的协作开发。
缓存和模板重用:Freemarker 具有内置的缓存机制,可以缓存渲染过的模板结果,避免重复的模板渲染。它支持模板片段的定义和重用,可以减少冗余的模板代码。
扩展性和定制性:Freemarker 支持自定义的指令和函数,可以根据需要扩展和定制模板引擎的功能。
Freemarker 广泛应用于各种Web应用程序的开发中,特别适用于MVC架构中的视图层。它在数据展示、报表生成、电子邮件模板、代码生成等方面都有很好的应用效果。
它的优点有那些?
Freemarker是一种模板引擎技术,它通过在应用程序中使用模板来动态生成输出。虽然Freemarker本身并不能直接减少数据库的访问次数,但它可以在应用程序的视图层(View)中帮助减少数据库访问的需求。下面是一些Freemarker如何实现这一点的方式:
缓存机制:Freemarker具有内置的缓存机制,可以在生成输出时缓存已渲染的模板。如果相同的数据和模板再次请求生成输出,Freemarker可以直接从缓存中提供结果,而无需重新访问数据库。这样可以减少数据库访问的次数,提高应用程序的性能。
模板重用:Freemarker支持模板片段的定义和重用。通过将模板划分为可重用的片段,可以减少对数据库的访问需求。当页面的某些部分在多个页面中共享时,可以将这些部分的模板片段定义一次,并在需要时重用,而不是在每个页面都单独加载数据。
数据预处理:在将数据传递给模板进行渲染之前,可以在应用程序的服务层(Service)或控制器层(Controller)对数据进行处理和整合。这样可以减少模板中对数据库的查询需求。通过预处理和整合数据,可以将复杂逻辑从模板中移除,降低数据库访问的次数。
缓存数据库查询结果:在应用程序的服务层或控制器层中,可以使用缓存技术将数据库查询的结果缓存起来。当下一次请求相同的查询结果时,可以直接从缓存中获取,而无需再次访问数据库。这样可以减少数据库的访问次数。
使用方式
当使用Spring Boot整合Freemarker作为视图模板引擎时,需要进行一些配置和编码工作。以下是一个简单的示例,展示了如何在Spring Boot项目中使用Freemarker:
配置pom.xml文件,添加相关依赖:
<!-- Spring Boot Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Freemarker Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在application.properties或application.yml中配置Freemarker相关属性:
# Freemarker配置
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftl
创建一个Controller类,处理请求并返回Freemarker模板视图:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class MyController {@RequestMapping("/")public String home(Model model) {model.addAttribute("message", "Hello, Freemarker!");return "index"; // 返回模板名称,不含后缀}
}
创建一个Freemarker模板文件,位于src/main/resources/templates目录下,比如index.ftl:
<!DOCTYPE html>
<html>
<head><title>Freemarker Example</title>
</head>
<body><h1>${message}</h1>
</body>
</html>
在上述示例中,MyController类中的home方法处理根路径的请求,将一个名为message的属性添加到Model对象并设置其值为"Hello, Freemarker!"。该方法返回的字符串"index"指定了要使用的Freemarker模板,Spring Boot会自动匹配到名为"index.ftl"的模板文件。
当用户访问根路径"/"时,Spring Boot会调用home方法,并将模板中的${message}表达式替换为模型中的属性值。最终生成的HTML响应将包含"Hello, Freemarker!"的文本。
这只是一个简单的示例,你可以根据需要在模板中使用Freemarker的更多特性和语法。通过控制器类、模板文件和属性传递,你可以构建出复杂而动态的页面。记得将这些代码放在适当的包目录下,并根据实际需求进行调整和扩展。
相关文章:
【Java】SpringBoot项目整合FreeMarker加快页面访问速度
文章目录 什么是FreeMarker?它的优点有那些?使用方式 什么是FreeMarker? Freemarker是一个模板引擎技术,它可以将数据和模板结合起来生成最终的输出。它是一种用于生成文本输出(如HTML、XML、JSON等)的通用…...
conda环境下安装opencv-python包
conda环境下安装opencv-python包 一、#查看环境 conda info --env# conda environments: # base D:\ProgramData\Anaconda3二、激活base环境 进入conda环境 conda init cmd.exe conda activate base三、根据版本号,下载对应的 python-opencv…...
JVM面试题--类加载器
什么是类加载器,类加载器有哪些 类加载子系统,当java源代码编译为class文件之后,由他将字节码装载到运行时数据区 BootStrap ClassLoader 启动类加载器或者叫做引导类加载器,是用c实现的,嵌套在jvm内部,…...
js怎么计算当前一周的日期
你可以使用 JavaScript 的 Date 对象来计算当前一周的日期。首先,你需要获取当前日期,然后使用 Date 对象的 getDay 方法获取当前是星期几(星期日是 0,星期一是 1,以此类推)。然后,你可以根据当前是星期几来计算出本周…...
【图论】差分约束
一.情景导入 x1-x0<9 ; x2-x0<14 ; x3-x0<15 ; x2-x1<10 ; x3-x2<9; 求x3-x0的最大值; 二.数学解法 联立式子2和5,可得x3-x0<23;但式子3可得x3-x0<15。所以最大值为15; 三.图论 但式子多了我们就不好解了࿰…...
13 springboot项目——准备数据和dao类
13.1 静态资源下载 https://download.csdn.net/download/no996yes885/88151513 13.2 静态资源位置 css样式文件放在static的css目录下;static的img下放图片;template目录下放其余的html文件。 13.3 创建两个实体类 导入依赖:lombok <!…...
Java 基础进阶总结(一)反射机制学习总结
文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言,对象的各种信息在程序运行时便已经确认下来了,内…...
ERROR: transport error 202: gethostbyname: unknown host报错解决方案
Java 9 syntax for remote debugger: -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005Java 8 不适用 *:port,应该使用: -agentlib:jdwptransportdt_socket,servery,suspendn,address5005参考 https://stackoverflow.com/questions/50344957/ja…...
PyTorch高级教程:自定义模型、数据加载及设备间数据移动
在深入理解了PyTorch的核心组件之后,我们将进一步学习一些高级主题,包括如何自定义模型、加载自定义数据集,以及如何在设备(例如CPU和GPU)之间移动数据。 一、自定义模型 虽然PyTorch提供了许多预构建的模型层&#…...
JavaEE——SpringMVC中的常用注解
目录 1、RestController (1)、Controller (2)、ResponseBody 2、RequestMappping (1)、定义 (2)、使用 【1】、修饰方法 【2】、修饰类 【3】、指定方法类型 【4】、简化版…...
【严重】Metabase 基于H2引擎的远程代码执行漏洞
漏洞描述 Metabase 是一个开源的数据分析和可视化工具。 由于 CVE-2023-38646 的补丁(从H2 JDBC连接字符串中删除INIT脚本以防止命令注入)修复不完全,Metabase 仍受到命令注入的影响。攻击者可使用 H2 作为数据库引擎,通过 /api/setup/validate 端点发…...
0基础学习VR全景平台篇 第75篇:多现场
多现场是指将多台设备的直播画面整合到一个直播活动链接里面,让用户自行选择切换要看哪个直播画面的功能。既可以是同一个活动的不同角度直播,也可以是异地的直播。多现场不需要导播台,并且可以同时支持平面直播和VR直播的混合切换。多现场仅…...
html:去除input/textarea标签的拼写检查
默认情况下,textarea 会启动拼写和语法检查,表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时,我们并不需要拼写检查,可以通过配置属性spellcheck"false" 去除拼写和语法检…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:创建自定义提示模板和含有Few-Shot示例的提示模板]
分类目录:《自然语言处理从入门到应用》总目录 创建自定义提示模板 假设我们希望LLM根据函数名称生成该函数的英文语言解释。为了实现这个任务,我们将创建一个自定义的提示模板,以函数名称作为输入,并格式化提示模板以提供函数的…...
d3dx9_30.dll如何修复,分享几种一键修复方法
d3dx9_30.dll是DirectX 的一个动态链接库文件,它包含了一些用于图形和游戏的函数和资源。在了解d3dx9_30.dll的解决方法和丢失原因之前,我们先来了解一下DirectX。DirectX是一套由微软开发的多媒体和游戏编程接口(API)集合。它提供…...
6.8 稀疏数组
6.8 稀疏数组 稀疏数组是一种数据结构,在程序中数据结构的思想,是非常重要的。例如 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义…...
ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试
配置环境 1. C11 检查G版本,查看是否支持C11 一般g版本大于4.7即可 g -v 2. Pangolon 地址:https://github.com/stevenlovegrove/Pangolin 先安装OpenGL,Glew ### 编译orb-slam3发现pangolin编译错误排查的环境问题 sudo apt install p…...
Vue中对对象内容调用的Demo
目录 1.对象作为数据: 2.对象数组 在Vue中,你可以通过对象的键来调用对象中的各个部分的内容。下面是一些使用Vue调用对象各部分内容的示例: 1.对象作为数据: 如果你在Vue实例的数据中有一个对象,你可以使用点语法来…...
语音识别 — 特征提取 MFCC 和 PLP
一、说明 语音识别是一种技术,通过计算机和软件系统,将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言,并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域,如语音助手…...
BES 平台 SDK之按键的配置
本文章是基于BES2700 芯片,其他BESxxx 芯片可做参考,如有不当之处,欢迎评论区留言指出。仅供参考学习用! BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示! 一&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
