【性能优化】页面静态化

文章目录

  • 概述
  • Freemarker
  • Freemarker入门案例
    • Freemarker指令
    • 环境搭建
    • 创建模板文件
    • 生成文件
  • 来源

概述

我们在使用购物网站的时候,会选择相应的商品点击查看详情,其实会发现每件商品的商品详情页面都是差不多的,除了一些数据外,其余结构布局都是一模一样的,那么是为每件商品都写一个详情页面吗?很显然这是不可能的,数以百万千万的商品都写页面,会把人逼疯。既然结构布局都一样,只是数据不同,那么有什么办法解决这种情况吗?使用页面静态技术可以很完美的解决。

一个页面等于模板加数据。页面静态化就是将页面模板和数据通过技术手段将二者合二为一,生成一个html网页文件。因此,我们需要获取模板,然后获取数据模型,那么模板+数据模型就可以生成一个html页面了。下面以Freemarker作为模板来实现页面静态化过程。

Freemarker

FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

Freemarker入门案例

Freemarker指令

assign指令

assign指令用于在页面上定义一个变量

(1)定义简单类型

<#assign linkman="周先生">
联系人:${linkman}

(2)定义对象类型

<#assign info={"mobile":"13812345678",'address':'北京市昌平区'} >
电话:${info.mobile}  地址:${info.address}

include指令

include指令用于模板文件的嵌套

(1)创建模板文件head.ftl

<h1>黑马程序员</h1>

(2)修改入门案例中的test.ftl,在test.ftl模板文件中使用include指令引入上面的模板文件

<#include "head.ftl"/>

if指令
if指令用于判断

(1)在模板文件中使用if指令进行判断

<#if success=true>你已通过实名认证
<#else>  你未通过实名认证
</#if>

(2)在java代码中为success变量赋值

map.put("success", true);

在freemarker的判断中,可以使用= 也可以使用==

list指令
list指令用于遍历

(1)在模板文件中使用list指令进行遍历

<#list goodsList as goods>商品名称: ${goods.name} 价格:${goods.price}<br>
</#list>

(2)在java代码中为goodsList赋值

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);

环境搭建

创建maven工程并导入Freemarker的maven坐标

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

创建模板文件

模板文件中有四种元素:

1、文本,直接输出的部分
2、注释,即<#–…–>格式不会输出
3、插值(Interpolation):即${…}部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出

Freemarker的模板文件后缀可以任意,一般建议为ftl。

在D盘创建ftl目录,在ftl目录中创建名称为test.ftl的模板文件,内容如下:


<html>
<head><meta charset="utf-8"><title>Freemarker入门</title>
</head>
<body><#--我只是一个注释,我不会有任何输出  -->${name}你好,${message}
</body>
</html>

生成文件

使用步骤:

第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。

第二步:设置模板文件所在的路径。

第三步:设置模板文件使用的字符集。一般就是 utf-8。

第四步:加载一个模板,创建一个模板对象。

第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。

第六步:创建一个 Writer 对象,一般创建 FileWriter 对象,指定生成的文件名。

第七步:调用模板对象的 process 方法输出文件。

第八步:关闭流。

public static void main(String[] args) throws Exception{//1.创建配置类Configuration configuration=new Configuration(Configuration.getVersion());//2.设置模板所在的目录 configuration.setDirectoryForTemplateLoading(new File("D:\\ftl"));//3.设置字符集configuration.setDefaultEncoding("utf-8");//4.加载模板Template template = configuration.getTemplate("test.ftl");//5.创建数据模型Map map=new HashMap();map.put("name", "张三");map.put("message", "欢迎来到传智播客!");//6.创建Writer对象Writer out =new FileWriter(new File("d:\\test.html"));//7.输出template.process(map, out);//8.关闭Writer对象out.close();
}

上面的入门案例中Configuration配置对象是自己创建的,字符集和模板文件所在目录也是在Java代码中指定的。在项目中应用时可以将Configuration对象的创建交由Spring框架来完成,并通过依赖注入方式将字符集和模板所在目录注入进去。

来源

页面静态化
页面静态化介绍

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

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

相关文章

【面试HOT200】滑动窗口篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

Helix QAC 2023.3版本发布,新增对C++20的支持等多个功能,实现100%MISRA C++:2023®规则覆盖

Helix QAC 2023.3预期能够在2023年第4季度发布的新MISRA C指南中实现100%的MISRA C:2023规则覆盖。 此外&#xff0c;该版本还增加了对C20语言的扩展支持&#xff0c;并对Perforce Validate平台&#xff0c;以及Helix QAC与Validate的集成进行了改进&#xff0c;包括使用体验与…

Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换

我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步&#xff0c;以去信任的方式促进了与其他区块链的无缝互操作性。 图片源自Gemini 在上一篇文章中&#xff0c;我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间…

c++ opencv使用drawKeypoints、line实现特征点的连线显示

前言 图像经过算子处理后得到若干特征点&#xff0c;使用opencv进行渲染显示出这些特征点并且连线&#xff0c;更直观的对比处理前后的一些差异性 demo核心代码 //画出特征点并连线 void drawFilterLinePoints(cv::Mat& srcMat, cv::Point2f pointStart, cv::Point2f po…

关于X86机器上运行GnuCobol的研究

1.安装GnuCobol 当前的稳定版本是 3.1.2,已经在各种平台上进行了广泛测试,并已投入商用。 下载地址为: https://phoenixnap.dl.sourceforge.net/project/gnucobol/gnucobol/3.1/gnucobol- 3.1.2.tar.bz2 1)上传压缩包至x86服务器; 2)通过tar -xvf gnucobol-3.1.2.tar.bz2…

程序员接私活平台有哪些?这8大程序员兼职平台让你收入直接翻倍!

接私活 对程序员这个圈子来说是一个热门话题&#xff0c;不说全部&#xff0c;应该大多数程序员都有过想要接私活的想法&#xff0c;但是很少有人在公开场合讨论私活的问题&#xff0c;似乎都在避嫌。就跟有人下班后跑滴滴一样&#xff0c;程序员私有时间接点活挣点钱不也很正常…

js 如何把一个json数据,组装成树形数据

在 JavaScript 中&#xff0c;可以使用递归的方式将一个 JSON 数据组装成树形数据。 以下是一个示例代码&#xff1a; function convertToTree(data) {const tree [];for (let i 0; i < data.length; i) {const node data[i];const parentId node.parentId;if (parent…

修改分区序列号的简单方法!

“我使用的是自己组装的电脑&#xff0c;安装了正版Win10操作系统。但奇怪的是&#xff0c;这台电脑看起来完全正常&#xff0c;但是每次启动时的分区序列号却总是不同。我现在要使用的软件需要依赖分区序列号进行注册&#xff0c;所以这个问题不解决我就没法使用软件。系统是正…

【机器视觉技术】:开创人工智能新时代

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1; 前言&#x1f324;️ 机器视觉技术的实现☁️ 图像采集☁️ 图像处理☁️ 数据建模☁️应用展示…

掌握你的Mac,iStat Menus带你了解mac系统状态

iStat Menus for mac是一款强大的mac系统状态监控工具&#xff0c;它能够提供实时的系统信息和性能监测&#xff0c;帮助用户全面了解和管理自己的Mac设备。无论是CPU、内存、网络、硬盘还是传感器数据&#xff0c;iStat Menus都能直观地展示&#xff0c;并且支持自定义布局和样…

仿东郊到家预约按摩小程序开发;

在这个快节奏的现代社会&#xff0c;人们对便捷、高效的服务需求日益增大。正因如此&#xff0c;到家预约系统上门按摩小程序应运而生&#xff0c;它结合了互联网技术和传统按摩服务&#xff0c;不仅满足了人们对便捷按摩服务的需求&#xff0c;还为商家提供了全新的商业价值。…

Glide结合OkHttp保证短信验证接口携带图形验证码接口返回Cookie值去做网络请求

一、实现效果 二、步骤 注意&#xff1a;仅展示核心部分代码 1、导入依赖 api com.github.bumptech.glide:glide:4.10.0 kapt com.github.bumptech.glide:compiler:4.10.0 api com.squareup.okhttp3:okhttp:3.11.0 api com.squareup.okhttp3:logging-interceptor:3.11.02、自…

记录-EasyCode代码生成-自定义代码模板

文章目录 controller&#xff1a;entity&#xff1a;mapper.java:mapper.xml:service:serviceImpl: 数据持久层使用MybatisPlus controller&#xff1a; ## controller控制层 ##导入宏定义 $!{define.vm}##设置表后缀&#xff08;宏定义&#xff09; #setTableSuffix("C…

做项目,要从学生思维里跳出来

今天分享下在23期群的聊天记录&#xff0c;关于做项目正确的思维&#xff0c;自己曾经走过一些弯路&#xff0c;希望大家能Get到。 做项目&#xff0c;一定要从学生思维里跳出来。 1.学生思维就是前期就想每个细节都要搞懂&#xff0c;感觉才能往下&#xff0c;其实像lora&…

[Java][单列集合+数组遍历方法]增强for循环学习体会

在Java的学习中&#xff0c;我们已经习惯了使用for循环来进行遍历操作。这种操作在普通的数组和字符串中是非常有效的。但是当我们引入了集合这个概念&#xff0c;并且将多个不同的字符串储存进某一个集合的时候&#xff0c;我们发现原先的for循环是依赖于数组索引或者字符串索…

我的CSDN创作纪念日

⭐前言 同志们&#xff0c;大家好&#xff01;我是乱码怪才&#xff0c;这篇博客我来分享一下我和CSDN的故事————一个人工智能学生和CSDN的相遇。 &#x1f496;相遇CSDN&#x1f496; 我在刚上大学的时候就下载了CSDN&#xff0c;那时候只是在平台上搜一些C语言的算法题…

基于可穿戴的健康监护终端--研究进展报告

基于可穿戴的健康监护终端--研究进展报告 1 引言2 传感器介绍2.1 呼吸速率传感器2.2 温度传感器2.3 心脏跳动传感器 3 论文介绍3.1 Effective Data Decision-Making and Transmission System Based on Mobile Health for Chronic Disease Management in the Elderly3.2 Design …

代码随想录算法训练营 ---第四十六天

第一题&#xff1a; 简介&#xff1a; 本题的重点在于确定背包容量和物品数量 确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 2.确定递推公式 如果确定dp[j] 是true&#xff0c;且…

C语言结构体数组实现一个简单的登录注册功能

实现登录注册 登录功能&#xff1a;设计了一个结构体数组用来记录系统中所存在的人。首先设置了一个管理员身份的存放在第一行。登录的时候首先判断账号是否存在于数组当中。进行遍历数组中的所有元素的操作来进行查询&#xff0c;若是可以查询到那么就可以来判断他的密码是否…

fatal: remote error: upload-pack: not our ref (未解决问题)

PX4使用 git submodule update --init --recursive报错 fatal: remote error: upload-pack: not our ref解决办法参考&#xff1a;https://stackoverflow.com/questions/61163082/why-does-git-submodule-update-fail-with-fatal-remote-error-upload-pack-not-o 感觉就是清…