将动态页面转化成静态的html,降低与数据库的交互次数,提高页面的访问速度。就是服务器在请求来之前把已经固定好的东西先编译好了,等请求来了再动态的填数据,不要等请求来了什么都没做忙得半死。
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力。而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(搜索引擎优化)。将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。
利用第三方提供的模板引擎,生成对应的html,常见的模板引擎有:thymeleaf、freemarker、velocity。
freemarker是apache的一个开源的模板引擎,它基于模板来生成文本输出。freemaker模板引擎可以通过模板和数据生成静态化页面。
1. 提前根据模板和数据生成静态化页面通过io流将页面写入到硬盘上, 访问的时候直接访问。就不用访问数据库了, 可以大大提高数据库的高并发读取性能,使数据库访问量降低.。
2. 由于页面是提前生成好的, 所以访问速度快, 客户体验好。
3. 由于html不需要tomcat解析浏览器可以直接访问, 所以给tomcat降低高并发访问压力。
1.新闻网站新闻页面通过freemarker提前生成好
2.电商网站商品详情页面通过freemarker提前生成好
其原则是:页面有固定的样式, 并且一次生成多次读取,尽量少的改动数据
原理图;
模板:
1.模板在freemarker中是以.ftl为后缀名的文件, 在模板中可以使用html标签, css, js,图片等静态资源。
2.模板中可以使用el表达式获取数据, 但是无法使用jstl标签来判断和循环, 所以模板引擎会有自己的一套标签库供我们使用.
数据:
数据一般存储在关系型数据库或者redis或者mongodb中获取.
文本:直接输出的部分
注释:即<#--...-->格式不会输出
插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出
①assign指令
该指令用于在页面上定义一个变量,这个变量可以是简单类型,也可以是对象类型。
<#-- 定义一个myname变量 -->
<#assign myname = "柳成荫">
<#-- 定义一个myObj变量 -->
<#assign myObj = {"pet":"柯基","age":2}>
${myname}的宠物${myObj.pet}今天${myObj.age}岁啦!
②list指令
遍历集合,_has_next用于判断是否还有下一元素,_index表示索引下标
<#list userList as user>
下标:${user_index},姓名:${user.name},年龄:${user.age}
<#-- _has_next用于判断是否还有下一个元素 -->
<#if user_has_next>下一个数据是:#if>
#list>
③if指令
<#if myname="柳成荫">
myname是柳成荫
<#else>
myname不是柳成荫
#if>
④include指令
<#include "header.ftl">
内建函数语法格式:变量+?+函数名称
①获取集合大小
<#-- 获取集合大小 -->
userList集合共有${userList?size}个元素
②转换JSON字符串为对象
<#-- 转换JSON字符串为对象 -->
<#assign jsonStr="{'name':'九月清晨','age':'25'}" />
<#assign data=jsonStr?eval/>
姓名:${data.name},年龄:${data.age}
③日期格式化
<#-- 日期格式化 -->
当前日期:${today?date}
当前时间:${today?time}
当前日期+时间:${today?datetime}
日期格式化:${today?string("yyyy年MM月")}
④数字转换为字符串
数字直接显示,会出现逗号,需要使用?c进行转换。
<#-- 数字转换成字符串,数字直接显示会出现逗号 -->
正常打印price:${price}
去除逗号:${price?c}
⑤空值处理运算符
<#-- 空值处理运算符,判断是否为空值 -->
<#if price??>
price变量存在
<#else>
price变量不存在
#if>
⑥缺失变量默认值:“!”
<#-- 缺失变量默认值,可以判空,也可以对null做转换处理 -->
${price!'变量为空!'}
①算数运算符
FreeMarker支持的算术运算符包括:+, - , * , / , %
${1+5}
②逻辑运算符 - 逻辑运算符只能作用于布尔值,否则将产生错误
1、逻辑与:&& 2、逻辑或:|| 3、逻辑非:!
③比较运算符
1 =或者==:判断两个值是否相等
2 !=:判断两个值是否不等.
3 >或者gt:判断左边值是否大于右边值
4 >=或者gte:判断左边值是否大于等于右边值
5 <或者lt:判断左边值是否小于右边值
6 <=或者lte:判断左边值是否小于等于右边值
注意事项:=和!=可以用于字符串,数值和日期来比较是否相等,=和!=两边必须是相同类型的值,否则会产生错误。
①创建Maven工程(Jar工程)
②引入pom依赖
org.freemarker
freemarker
2.3.23
③创建模板文件,在resources文件下创建一个ftl文件夹,并在该文件夹下创建一个MyFreemark.ftl文件
④创建一个Peole类
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}
⑤创建测试类
public class TestFreemarker {
public static void main(String[] args) throws Exception{
// 1.创建配置
Configuration configuration = new Configuration(Configuration.getVersion());
// 2.设置模板所在的目录 - 绝对位置
configuration.setDirectoryForTemplateLoading(new File("F:\\Programming Study\\MavenProject\\freeMarkProject\\src\\main\\resources\\ftl"));
// 3.设置字符集 - html页面的字符集
configuration.setDefaultEncoding("utf-8");
// 4.设置加载的模板
Template template = configuration.getTemplate("MyFreemark.ftl");
// 用户集合
List userList = new ArrayList();
userList.add(new User("用户1",18));
userList.add(new User("用户2",20));
userList.add(new User("用户3",22));
// 5.设置数据
Map map = new HashMap();
map.put("name","柳成荫");
map.put("message","欢迎登录!");
map.put("userList",userList);
map.put("today",new Date());
map.put("price",199710);
// 6.生成的文件叫什么名字,放在哪里
Writer out = new FileWriter(new File("d:\\testFreemark.html"));
// 7.输出
template.process(map,out);
// 8.关闭IO流
out.close();
}
}
⑥效果