页面静态化

article/2025/10/29 18:59:13

前言

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

1、什么是页面静态化

先来了解一下静态化技术:所谓的静态化技术就是 将查询好的数据填充到模板中,然后将生成的html写入到指定的文件中。页面静态化就是使用静态化技术生成html页面。

2、为什么要进行页面静态化

像电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。页面静态化的好处如下:

  • 静态页面相对于动态页面更容易被搜索引擎收录。
  • 访问静态页面不需要经过程序处理,因此可以提高运行速度。
  • 减轻服务器负担。
  • HTML页面不会受Asp相关漏洞的影响。

网页静态化技术是为了减轻数据库的访问压力,比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。

3、如何进行页面静态化

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

4、使用Freemarker进行页面静态化

(1)准备模板

模板一般由我们根据数据模型的结构来进行编写的,模板只有一个,但是数据模型的不同,那么按照模型+数据的组合可以产生不同的html页面。
在这里插入图片描述

将模板放在test包下的classpath下的templates文件夹下,那么我就用这个test.ftl模板来进行测试了。
模板内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>Hello ${name}<br><br>集合中的学生个数:${stus?size}<table style="font-size:20px;font-weight:bolder;"><tr><td>序号</td><td>姓名</td><td>年龄</td><td>钱包</td></tr><!-- 遍历List --><!-- 判断为空 --><#if stus??><#list stus as stu><tr <#if stu.name=='落落'>style="color:orange;"</#if>><td>${stu_index+1}</td><td <#if stu.age gt 17>style="background:pink;"</#if>>${stu.name}</td><td <#if stu.age gt 17>style="background:pink;"</#if>>${stu.age}</td><td>${stu.money}</td></tr></#list></#if></table><br><br>输出stu0学生信息:<br>姓名:${(stuMap['stu0'].name)!'对象不存在'}<br>年龄:${(stuMap['stu0'].age)!'对象不存在'}<br>钱包:${(stuMap['stu0'].money)!'对象不存在'}<br><hr>输出stu2学生信息:<br>姓名:${(stuMap.stu2.name)!'对象不存在'}<br>年龄:${(stuMap.stu2.age)!'对象不存在'}<br>钱包:${(stuMap.stu2.money)!'对象不存在'}<br>生日:${(stuMap.stu2.birthday?string("yyyy年MM月dd日"))!'对象不存在'}<br>账户余额:${account?c}<hr>遍历Map中全部学生信息:<br><table><tr><td>序号</td><td>姓名</td><td>年龄</td><td>钱包</td></tr><!-- 遍历出map中的全部key --><#list stuMap?keys as k><tr><!-- 通过map的key来取值 --><td>${k_index+1}</td><td>${stuMap[k].name}</td><td>${stuMap[k].age}</td><td>${stuMap[k].money}</td></tr></#list></table><hr>json字符串转为对象:<#assign text="{'bank':'建设银行','name':'老云','tel':'124523431','money':'9000.7'	}"/><#assign data=text?eval/>开户行:${data.bank}<br>客户名称:${data.name}<br>联系方式:${data.tel}<br>账户余额:${data.money}
</body>
</html>

(2)pojo
实体类如下:

public class Student {@Getter@Setterprivate String name;//姓名@Getter@Setterprivate int age;//年龄@Getter@Setterprivate Date birthday;//生日@Getter@Setterprivate Float money;//工资@Getter@Setterprivate List<Student> friends;//朋友列表@Getter@Setterprivate Student bestFriend;//最好的朋友}

(3)yml配置

  ## freemarker模板配置freemarker:cache: false ##关闭缓存settings:template_update_delay: 0  # 检查模板更新时间

这里就简单配置了。

(4)pom依赖
引入freemarker的依赖:

		<!-- freemarker模板依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId><version>2.3.4.RELEASE</version></dependency>

(5)测试
这里我直接在测试包下写了,如下:

@SpringBootTest
public class TestFreemarker {//测试基于ftl模板生成html文件@Testpublic void testGenerateHtml() throws Exception {//定义配置类对象Configuration configuration = new Configuration(Configuration.getVersion());//获取classpath路径String classpath = this.getClass().getResource("/").getPath();//模板文件所在目录File file = new File(classpath + "/templates/");//加载模板所在目录configuration.setDirectoryForTemplateLoading(file);//获取配置类对象获取模板Template template = configuration.getTemplate("test.ftl");//获取模型数据Map map = this.getMap();//进行静态化,得到字符串String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);//将字符串转为输入流InputStream inputStream = IOUtils.toInputStream(content);//输入流对象OutputStream outputStream = new FileOutputStream(new File("d:/test.html"));//流复制IOUtils.copy(inputStream, outputStream);//关闭流outputStream.close();inputStream.close();System.out.println("文件已生成!");}//模型数据用静态数据来代替public Map getMap() {Map map = new HashMap<>();map.put("name", "陈长生");//List数据List<Student> stus = new ArrayList<>();Student stu0 = new Student();stu0.setName("陈长生");stu0.setAge(19);stu0.setMoney(3000.5f);stu0.setBirthday(new Date());Student stu3 = new Student();stu3.setName("徐有容");stu3.setAge(18);stu3.setMoney(10000.5f);stu3.setBirthday(new Date());Student stu2 = new Student();stu2.setName("落落");stu2.setAge(17);stu2.setMoney(5030.5f);stu2.setBirthday(new Date());List<Student> frieList = new ArrayList<>();frieList.add(stu0);frieList.add(stu3);stu2.setFriends(frieList);// 设置好友列表stu2.setBestFriend(stu0);// 设置最好的朋友stus.add(stu0);stus.add(stu2);stus.add(stu3);// 存到数据模型中map.put("stus", stus);//Map数据Map <String,Student> stuMap = new HashMap<>();stuMap.put("stu0", stu0);stuMap.put("stu2", stu2);stuMap.put("stu3", stu3);map.put("stuMap", stuMap);map.put("account",45243243);return map;}}

运行这个测试方法,控制台输出如下:
在这里插入图片描述
那么这个方法run成功了,去d盘根路径查看:
在这里插入图片描述
查看html内容:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>Hello 陈长生!<br><br>集合中的学生个数:3<table style="font-size:20px;font-weight:bolder;"><tr><td>序号</td><td>姓名</td><td>年龄</td><td>钱包</td></tr><!-- 遍历List --><!-- 判断为空 --><tr ><td>1</td><td style="background:pink;">陈长生</td><td style="background:pink;">19</td><td>3,000.5</td></tr><tr style="color:orange;"><td>2</td><td >落落</td><td >17</td><td>5,030.5</td></tr><tr ><td>3</td><td style="background:pink;">徐有容</td><td style="background:pink;">18</td><td>10,000.5</td></tr></table><br><br>输出stu0学生信息:<br>姓名:陈长生<br>年龄:19<br>钱包:3,000.5<br><hr>输出stu2学生信息:<br>姓名:落落<br>年龄:17<br>钱包:5,030.5<br>生日:20201224<br>账户余额:45243243<hr>遍历Map中全部学生信息:<br><table><tr><td>序号</td><td>姓名</td><td>年龄</td><td>钱包</td></tr><!-- 遍历出map中的全部key --><tr><!-- 通过map的key来取值 --><td>1</td><td>落落</td><td>17</td><td>5,030.5</td></tr><tr><!-- 通过map的key来取值 --><td>2</td><td>徐有容</td><td>18</td><td>10,000.5</td></tr><tr><!-- 通过map的key来取值 --><td>3</td><td>陈长生</td><td>19</td><td>3,000.5</td></tr></table><hr>json字符串转为对象:开户行:建设银行<br>客户名称:老云<br>联系方式:124523431<br>账户余额:9000.7
</body>
</html>

可以看到,数据模型填充到了模板中,二者结合生成了一个新的html页面,用浏览器打开这个页面:
在这里插入图片描述
那么使用freemarker作为模板进行页面静态化就完成了。

5、总结
页面静态化就是获取到模板,获取到数据模型,然后模板+数据模型最终生成html页面。


http://chatgpt.dhexx.cn/article/1ZM8Ctl6.shtml

相关文章

img标签图片自适应的样式

问题&#xff1a; img标签宽高固定的情况下&#xff0c;上传的图片尺寸不一致&#xff0c;会导致图片被拉伸变形&#xff0c;影响页面美观。 解决方法&#xff1a; 用css3的object-fit 属性、object-position 属性可以解决&#xff0c;代码如下&#xff1a; <!DOCTYPE htm…

图片自适应屏幕大小

有时候美工给过来的图片不规范&#xff0c;用户手机屏幕大小不一样。可能导致在不同的用户手机上显示效果不一样&#xff0c;这时候需要对图片的显示做自适应。 一把来说自适应可以根据需求&#xff0c;做成宽高固定显示屏幕大小。但对于一些长图可能出现图片被压缩在一个屏幕…

响应式图像--图片自适应大小

Foreword 做项目的过程中遇到了一个图片拉伸的问题&#xff0c;做的是手机端的页面&#xff0c;当让其以电脑端页面显示的时候&#xff0c;图片被拉伸的有那么点丑&#xff01;所以改改它&#xff01; Why 为什么会出现这样的情况呢&#xff1f; 1、因为图片是放在盒子…

HTML网页图片背景以及图片自适应设置

关于HTML网页图片背景以及图片自适应设置 Test 1 背景图片需要用到标签中的background属性 图片背景需要显示的位置是网页的身体部分即在body中显示&#xff0c;因此background属性应该放在body标签内 本次使用图片的大小为4808*2704像素&#xff0c;这是图片原来的样子 这是…

html图片自动适应,css如何让图片自适应?

要使图片能够自适应显示&#xff0c;我们一般可以通过设置CSS样式&#xff0c;让图片作为父元素的背景图片&#xff0c;再设置相关属性来实现。下面我们来看一下使用css设置图片自适应的方法。 css设置图片自适应示例&#xff1a; HTML代码&#xff1a;title css代码&#xff1…

【前端】js实现图片自适应

前言&#xff1a; 前几天写第一版代码的时候&#xff0c;测试跟我说&#xff0c;你这用户上传图片显示有问题啊&#xff0c;图像不是被拉宽就是被拉长了&#xff0c;不行啊。因为我给el-image设计的是固定长宽&#xff0c;如果图片不是这个比例&#xff0c;那直接就会变形了&am…

谈一下图片的自适应

在工作中经常遇到要求图片自适应的需求&#xff0c;下面就谈一下我在工作中经常使用的一些方法 单独使用img标签的情况 单独使用img的时候&#xff0c;可以只设置width就可以了&#xff0c;height不用设置&#xff0c;因为img不设置height&#xff0c;它会自动根据图片的比例…

浅谈图片宽度自适应解决方案

在网页设计中&#xff0c;随着响应式设计的到来&#xff0c;各种响应式设计方案层出不穷。对于图片响应式的问题也有很多前端开发人员在进行研究。比较好的图片响应式设想便是在不同的屏幕分辨率下使用不同实际尺寸的图片&#xff0c;而达到在高速网络环境中使用大或超大高清图…

浅谈图片展示、图片自适应解决方案

文章目录 导读CSS 解决方案background-size&#x1f437;background-size: contain&#xff1b;&#x1f437;background-size&#xff1a;100%&#xff1b;&#x1f437;background-size:cover; object-fit&#x1f437;object-fit: contain&#xff1b;&#x1f437;object-f…

实时即未来,大数据项目车联网之项目基石与前瞻【一】

文章目录 写在前面车联网项目全新升级 车联网行业背景介绍车联网技术汽车行业新能源汽车 车联网行业技术车辆网行业产业链与国内知名企业 车联网项目车联网技术架构和技术选型车联网项目的架构搭建 写在前面 车联网项目全新升级 更全 8-》21篇 更细 -》 图文并茂、部分代码首…

开发一个大数据项目的架构与流程

如果我们想做一个数据分析项目&#xff0c;我们就应该清楚数据的处理流程。 我们大致可以分为: 数据采集——数据存储——数据清洗——数据分析——数据可视化和数据挖掘、二次分析 在以上流程处理完成之后&#xff0c;会进入调度阶段&#xff1a;将数据采集、清洗、分析、导出…

大数据项目大致流程

1、提出需求-需要和多个部门负责人进行协商&#xff1a;关于项目的可行性分析 2、需求分析-进行需求调研&#xff08;研究竞品&#xff09;、市场调研&#xff0c;如果是给甲方做产品&#xff0c;需要和甲方协商需求细则 3、技术选型-需要多个开发部门的人员参与协商 考虑的…

大数据项目之电商数仓、数据仓库概念、项目需求及架构设计

文章目录 1.数据仓库概念2. 项目需求及架构设计2.1 项目需求分析2.1.1 采集平台2.1.2 离线需求2.1.3 实时需求2.1.4 思考题 2.2 项目框架2.2.1 技术选型2.2.2 系统数据流程设计2.2.3 框架版本选型2.2.3.1 Apache框架版本 2.2.4 服务器选型2.2.4.1 物理机&#xff1a;2.2.4.2 云…

大数据项目开发进度(实时更新)

文章目录 前言项目概述项目进度第一周0525-0529&#xff1a;第二周0601-0605&#xff1a;第三周0608-0612&#xff1a;第四周0615-0621&#xff1a;&#xff08;周末加班&#xff09;第五周0622-0628&#xff1a;&#xff08;周末加班&#xff09;第六周0629-0705&#xff1a;&…

大数据项目需求分析

以大数据项目为主线&#xff0c;技术理论与项目实践相结合&#xff0c;按照大数据项目的开发流程逐步推进&#xff0c;本文主要讲解项目的需求分析、架构设计以及离线和实时数据流程设计&#xff0c;然后提前规划好大数据项目需要的集群&#xff0c;按照项目的实现逻辑&#xf…

大数据项目篇--项目架构图

文章目录 离线架构离线架构-表信息离线架构-ETL信息 实时架构 离线架构 离线架构-表信息 离线架构-ETL信息 实时架构

客快物流大数据项目学习框架

文章目录 客快物流大数据项目学习框架 前言 一、项目简介 二、功能介绍 三、项目背景 四、服务器资源规划 五、技术亮点及价值 六、智慧物流大数据平台 客快物流大数据项目学习框架 前言 利用框架的力量&#xff0c;看懂游戏规则&#xff0c;才是入行的前提 大多数人…

大数据项目流程

一、项目流程 1&#xff09;需求概况&#xff1a;实现目标是什么&#xff1f; ——— 通过大数据获取什么信息 2&#xff09;需求分析&#xff1a;用什么样的数据&#xff0c;实现什么样的效果。 数据源的考量&#xff08;数据的种类和量的大小&#xff09;&#xff0c;数据…

农业大数据项目

小白学苑开始承接大数据定制项目和大数据实训项目啦&#xff01;欢迎联系合作&#xff01; 下面是近期客户定制的农业大数据项目结果展示&#xff1a; 一、项目需求&#xff1a; 搭建一个基于Hadoop大数据分析框架的农业大数据系统&#xff0c;该系统框架以我国农业的水果产业…