##Freemarker
1.减少访问数据库的次数,减少服务器的压力
2.网页静态化有利于SEO(搜索引擎优化)
3.静态页面之后,可以部署在Nginx里,可以承载5W的并发
####原理
读取模板,将模板中的变量用JAVA objects来替换最后用IO的方式输出。
入门Demo
1.引入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
2.创建文件模板
模板的四种元素
1.文本,直接输出的部分
2.注释,<#-- -->
3.插值,${…},使用数据模型中的部分替代输出
4.FTL FreeMarker指令,与HTML标记类似,名字前面加#区分,不输出
创建模板
1.在resource下创建 test.ftl
<html>
<head>
<meta charset="utf-8">
<title>Freemarker 入门小 DEMO </title>
</head>
<body>
<#--我只是一个注释,我不会有任何输出 -->
$你好。{name},你好。${message}
</body>
</html>
2.生成文件(在java目录下面)
使用步骤:
第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker 的版本号。
第二步:设置模板文件所在的路径。
第三步:设置模板文件使用的字符集。一般就是 utf-8.
第四步:加载一个模板,创建一个模板对象。
第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
第七步:调用模板对象的 process 方法输出文件。
第八步:关闭流
代码部分:
public ststic void main(String[] args){
//1.创建配置类 (Configiration静态化方法获得版本号)
Configuration configuration=new Configuration(Configuration.getVersion());
//2.设置模板所在的目录
configuration.setDirectoryForTemplateLoading(new
File("D:/pinyougou_work/freemarkerDemo/src/main/resources/"));
//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();
}
FTL指令
#####1.简单类型:
<#assign linkman="周先生">
联系人:${linkman}
#####2.定义对象类型
<#assign info={"mobile":"123456789"},{"address":"河道边"}
电话:${info.mobile} 地址:${info.address}
#####3.include 模板文件的嵌套
3.1 创建新的模板head.ftl
<h1>此处将被添加到test.ftl模板中</h1>
3.2 在test.ftl中添加head.ftl
<#include "head.ftl">
#####4.if指令
<#if success=true>
已经认证通过
<#else>
未通过
<#/if>
在上述的main方法中,加上
map.put("success",true)
注意:在freemarker里,== 和= 的意义是一样的
#####5.list指令
5.1在test.ftl中添加
<#list goodsList as goods>
${goods_index+1} 商品名称:${goods.name} 商品价格:{$goods.price}
<#/list>
5.2 在main方法中对变量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);
6.内建函数
内奸函数语法格式:变量+?+函数名称
6.1 获取集合大小
使用size函数实现
共${goodsList?size}条记录
6.2 将JSON字符串转换成对象
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:$账号:{data.bank} 账号:${data.account}
6.3 日期格式化
在main方法中对变量赋值:
dataModel.put("today",newDate());
在模板文件中加入
当前日期:${today?date}
当前时间:${today?time}
当前日期+时间:${today?datetime}
日期格式化:${today?string("yyyy年MM月")}
6.4 数字转换成字符串
在main方法中加入
map.put("point", 102920122);
在test.ftl中修改
累计积分:${point}
显示效果:累计积分:102920122
累计积分:${point?c}
显示效果:累计积分:102,920,122
6.5 空值处理运算符
如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但 是有些时候,有的变量确实是 null,怎么解决这个问题呢?
6.5.1 判断变量是否真实存在
语法:variable?? 如果变量真实存在,返回true,不存在返回false
<#if a??>
a变量存在
<#else>
a变量不存在
</#if>
6.6 缺失变量默认值: “!”
除了可以判断是否为空值,也可以使用 ! 对 null值做转换处理
在test.ftl中加入
${a!'-'}
a为变量,内容为- 即使main方法中 不对a赋值,也不会报错