目录
1.为什么要使用网页静态化技术
网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道。
对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。
另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。
2.什么是Freemarker
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
3.入门小Demo
(1)引入maven依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
(2)创建模板文件
模板文件中四种元素
1、文本,直接输出的部分
2、注释,即<#--...-->格式不会输出
3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
test.ftl
<html>
<head>
<meta charset="utf-8">
<title>Freemarker入门小Demo </title>
</head>
<body>
<#--我只是一个注释,我不会有任何输出 -->
${name},你好。${message}<br/>
</body>
</html>
(3)生成文件
public static void main(String[] args) throws IOException, TemplateException {
//1.创建一个Configuration对象
Configuration configuration = new Configuration(Configuration.getVersion());
//2.设置模板文件使用的字符集
configuration.setDefaultEncoding("utf-8");
//3.设置模板文件所在的目录
configuration.setDirectoryForTemplateLoading(new File("F:\\IdeaProjects\\spring-data-redis\\freemarker_01\\src\\main\\resources"));
//4.加载一个模板,创建一个模板对象
Template template = configuration.getTemplate("test.ftl");
//5.创建一个模板使用的数据集
Map map = new HashMap();
map.put("name", "程序员");
map.put("message", "欢迎来到freemarker静态页面");
//6.创建输出流
FileWriter writer = new FileWriter("f:\\test.html");
//7.输出模板文件
template.process(map, writer);
//8.关闭流
writer.close();
}
页面效果如下:
4.FTL指令
(1)定义简单类型
<#assign linkman="jack ma"/>
联系人:${linkman}<br/>
(2)定义对象类型
<#assign info={"mobile":"10086",'address':'北京海淀'} >
电话:${info.mobile} 地址:${info.address}<br/>
5.include指令
此模板用于模板文件的嵌套
创建模板文件head.ftl
<h1>欢迎来到程序员的天堂</h1>
修改test.ftl,在模板文件中引入head.ftl
<#include "head.ftl">
页面效果如下:
6.if指令
在模板文件上添加
在freemarker的判断中,可以使用= 也可以使用==
<#if success=true>
你已通过实名认证<br/>
<#else>
你未通过实名认证<br/>
</#if>
在代码中对success变量赋值
map.put("success", false);
7.list指令
代码中对变量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);
在模板文件上添加
-----商品列表-----<br/>
<#list goodsList as goods>
${goods_index} : ${goods.name} ${goods.price}<br/>
页面效果如下:
8.内建函数
内建函数语法格式: 变量+?+函数名称
(1)获取集合大小
共 ${goodsList?size} 条记录
(2)转换JSON字符串为对象
-----内置对象:eval 将json字符串转为对象-----<br/>
<#assign student="{'name':'zhangsan','age',18}"/>
<#assign data=student?eval/>
姓名:${data.name} 年龄: ${data.age}<br/>
(3)日期格式化
代码中对变量赋值:
map.put("today",new Date());
在模板文件中加入:
-----日期格式化-----<br/>
当前日期:${today?date}<br/>
当前时间:${today?time}<br/>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy年MM月")}<br/>
(4)数字转换为字符串
代码中对变量赋值:
map.put("money",155774879);
在模板文件中加入:
-----数字转换为字符串-----<br/>
${money}<br/> <!-- 155,774,879 -->
<!-- 若不想显示分隔符,使用内置函数c -->
${money?c}<br/>
(5)空值处理运算符
如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但是有些时候,有的变量确实是null,怎么解决这个问题呢?
判断某变量是否存在: ??
<#if aaa??>
aaa 变量存在
<#else>
aaa 变量不存在
</#if>
缺失变量默认值: !
<!-- 空值处理运算符 变量后面加! 若变量为null,则返回!之后的值 -->
${aaa!'aaa不存在'}
<#-- 在代码中不对aaa赋值,也不会报错了 -->
页面效果如下: