什么是freemarker:
freemarker是apache的一个开源的模板引擎.
作用:
freemaker模板引擎可以通过模板和数据生成静态化页面.
优点:
- 提前根据模板和数据生成静态化页面通过 io流将页面写入到硬盘上, 访问的时候直接访问.就不用访问数据库了, 可以大大提高数据库的高并发读取性能. 使数据库访问量降低.
- 由于页面是提前生成好的, 所以访问速度快, 客户体验好
- 由于html不需要tomcat解析浏览器可以直接访问, 所以给tomcat降低高并发访问压力.
使用场景:
a. 新闻网站新闻页面通过freemarker提前生成好
b. 电商网站商品详情页面通过freemarker提前生成好
原则: 页面有固定的样式, 并且一次生成多次读取, 尽量少的改动数据
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,
缓存比较适合小规模的数据,
而网页静态化比较适合大规模且相对变化不太频繁的数据。
和freemarker同类型的数据:
velocity也是一个模板引擎框架, 但是现在被freemarker替代了.
freemarker生成静态化页面:
页面 = 模板 + 数据
模板:
模板在freemarker中是以.ftl为后缀名的文件, 在模板中可以使用html标签, css, js,图片等静态资源
模板中可以使用el表达式获取数据, 但是无法使用jstl标签来判断和循环, 所以模板引擎会有自己的一套
标签库供我们使用.
数据:
数据一般存储在关系型数据库或者redis或者mongodb中获取.
freemarker Demo
一、创建目录和模板文件
test.ftl
<html>
<head>
<meta charset="utf-8">
<title>Freemarker小DEMO </title>
</head>
<body>
<#--我只是一个注释,我不会有任何输出 -->
${name},你好。${message}
</body>
</html>
二、模拟生成页面流程
public class TestFreemarker {
public static void main(String[] args) throws Exception {
//1. 创建模板引擎初始化对象
Configuration conf = new Configuration();
//2. 加载模板所在目录位置
conf.setDirectoryForTemplateLoading(new File("D:\\intelijIdeaWorkSpace3\\freemarkerDemo\\src\\main\\resources\\ftl"));
//3. 加载模板对象
Template template = conf.getTemplate("test.ftl");
//4. 模拟假数据, 这个数据是需要放入模板中的
Map<String, Object> rootMap = new HashMap<String, Object>();
/**
* 模板获取string类型数据
*/
rootMap.put("name", "张三");
rootMap.put("message", "欢迎来到神奇世界!");
/**
* 模拟List集合数据
*/
List<String> personList = new ArrayList<String>();
personList.add("青龙");
personList.add("白虎");
personList.add("朱雀");
personList.add("玄武");
rootMap.put("personList", personList);
/**
* 模拟Map数据
*/
Map<String, String> personMap = new HashMap<String, String>();
personMap.put("001", "饕鬄" );
personMap.put("002", "穷奇" );
personMap.put("003", "混沌" );
rootMap.put("personMap", personMap);
//5. 创建io流, 流中指定文件的输出位置和文件名
Writer out = new FileWriter(new File("hello.html"));
//6. 生成
template.process(rootMap, out);
//7. 关闭流
out.close();
}
}
freemarker 常用指令
在模板中插值:即${…}部分,展示数据
<#-- 模拟获取string类型数据 -->
${name},你好。${message}
1、 assign 此指令用于在页面上定义一个变量
(1)定义简单类型:
<#assign linkman="周先生">
联系人:${linkman}
(2)定义对象类型:
<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话:${info.mobile} 地址:${info.address}
2、 include 此指令用于模板文件的嵌套
创建模板文件head.ftl
<h1>欢迎来到电商平台</h1>
我们修改test.ftl,在模板文件中使用include指令引入刚才我们建立的模板
<#include "head.ftl"/>
3、 if 判断指令
<#if success == true>
你已通过实名认证
<#else>
你未通过实名认证
</#if>
4、 list 循环遍历指令
<#list goodsList as goods>
${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
</#list>
----------------------------------------------------------------------------------------
<#-- 模拟获取List集合数据 -->
<#list personList as person>
<#if person_index == 0>
这是第一次循环
<#else>
这是第${person_index + 1}次循环
</#if>
集合索引: ${person_index}
${person}
</#list>
---------------------------------------------------------------------------------------
<#-- 模拟获取Map数据 -->
<#list personMap?keys as key>
map中的key为: ${key} map中的value为: ${personMap[key]}
</#list>
变量+_index得到索引
5、 函数
size:获取集合大小
${goodsList?size}
日期格式化函数
map.put("today", new Date());
当前日期:${today?date} <br>
当前时间:${today?time} <br>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy年MM月")}
长串数字显示
map.put("point", 102920122);
累计积分:${point}
页面显示:102,920,122
发现数字会以每三位一个分隔符显示,有些时候不需要这个分隔符,就需要将数字转换为字符串,使用内建函数c
累计积分:${point?c}
页面显示:102920122
6、 空值处理运算符
(1)判断某变量是否存在:“??”
用法为: 变量??,如果该变量存在,返回true,否则返回false
<#if aaa??>
aaa变量存在
<#else>
aaa变量不存在
</#if>
(1)缺失变量默认值:“!”
使用 ! 对null值做转换处理
${aaa!'-'}
在代码中不对aaa赋值,也不会报错了 ,当aaa为null则返回“!”后边的内容 “-”
测试模板(.ftl)(补充)
<html>
<head>
<meta charset="utf-8">
<title>Freemarker小DEMO </title>
</head>
<body>
<#include "head.ftl"/>
<#--我只是一个注释,我不会有任何输出 -->
${name},你好。${message}
<#assign linkman="周先生">
<#assign linkman="李先生">
联系人:${linkman}
<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话:${info.mobile} 地址:${info.address}
<#-- 模拟获取List集合数据 -->
<#list personList as person>
<#if person_index == 0>
这是第一次循环
<#else>
这是第${person_index + 1}次循环
</#if>
集合索引: ${person_index}
${person}
</#list>
共 ${personList?size} 条记录
<#-- 模拟获取Map数据 -->
<#list personMap?keys as key>
map中的key为: ${key} map中的value为: ${personMap[key]}
</#list>
当前日期:${today?date} <br>
当前时间:${today?time} <br>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy年MM月")}
${point}
累计积分:${point?c}
<#if aaa??>
aaa变量存在
<#else>
aaa变量不存在
</#if>
${aaa!'这个aaa变量不存在'}
</body>
</html>