Freemarker 网页静态化技术
网页静态化
应用场景:适用于需要显示大量数据和信息的网页。
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同。缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(搜索引擎优化)。
如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。Nginx只能部署静态页面
Freemarker
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
Freemarker入门Demo
1、创建工程,引入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
2、 创建模板文件:test.ftl
<html>
<head>
<meta charset="utf-8">
<title>freemarker入门demo</title>
</head>
<body>
<#-- 这个Freemarker的注释标签 -->
${name},你好!${message}!!!
</body>
</html>
3.、编写实现方法
public static void main(String[] args) throws IOException, TemplateException {
//创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。
Configuration configuration = new Configuration(Configuration.getVersion());
//设置模板所在目录
configuration.setDirectoryForTemplateLoading(new File("F:\\MyProject\\Freemarker_Demo\\src\\main\\resources"));
//设置字符集,一般就是 utf-8
configuration.setDefaultEncoding("utf-8");
//获取模板对象
Template template = configuration.getTemplate("test.ftl");
//创建数据模型,map集合
Map map = new HashMap();
//创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
map.put("name","李兴海");
map.put("message","欢迎,欢迎,热烈欢迎");
//创建一个输出流对象writer,一般创建 FileWriter 对象,指定生成的文件名
Writer out = new FileWriter((new File("C:\\Users\\Administrator\\Desktop\\test.html")));
//调用模板对象的 process 方法输出文件。
template.process(map,out);
//关闭流
out.close();
}
FTL指令
1、 assign指令
用于在模板中定义变量,变量可以是字符串,也可以是对象
<#assign linkMan="李先生">
联系人:${linkMan}<br/>
<#assign info={"tel":"18887706954","address":"中国xxx省xx市"}>
电话:${info.tel},地址:${info.address}
2、include指令
用于引入其他的模板文件
<#include "head.ftl">
3、if …else 指令
用于判断。这里的赋值可以用"=“也可以用”=="。当使用到变量时,变量需要被定义
map.put("success",true);
<#if success=true>
成功!
<#else>
失败!
</#if>
4、list 指令
自带了一个差值指令:${xxx_index},用于获取集合中的索引
设置变量:
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);
设置模板文件:
<#list goodsList as goods>
${goods_index} 商品名称:${goods.name};价格:${goods.price}<br/>
</#list>
内建(内置)函数
语法:
变量+?+函数
1. 获取集合大小:size
一共 ${goodsList ? size} 条记录!
2. 把json字符串转为对象:eval
<#assign text="{'bank':'农业银行','account':'84654354698765'}">
<#assign data = text ? eval />
银行:${data.bank},账号:${data.account}
3. 日期格式 : date / time / datetime / string()
map.put("today",new Date());
当前日期:${today ? date}<br/>
当前时间:${today ? time}<br/>
当前日期+时间:${today ? datetime}<br/>
日期格式化:${today ? string("yyyy年MM月dd日 hh:mm:ss")}
4. 将数字转换为字符串 : c
freemarker默认会把数字每3位分割,加","
map.put("point",8546519);
积分:${point}
把","去掉:
积分:${point ? c}
运算符
1. 空值处理运算符
如果在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但是有些时候,有的变量确实是null.
方式一 : 使用"??"来做空值判断 , 如果该变量存在 , 返回true , 否则返回false .
<#if aaa??>
aaa存在,值为:${aaa}
<#else>
aaa不存在
</#if>
方式二 : 可以使用"!"对null值做转换处理
在代码中不对aaa赋值,也不会报错了 ,当aaa为null, 则返回!后边的内容
${ aaa!'不存在'}
2. 算数运算符
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括 : +, - , ***** , / , %
3. 逻辑运算符
逻辑运算符有如下几个: <#if
aaa=true && bbb=false>
</#if>
逻辑与 : &&
逻辑或 : ||
逻辑非 : !
注意 : 逻辑运算符只能作用于布尔值,否则将产生错误
4. 比较运算符
注意 :
1、字符串不能使用大于 ,大于等于, 小于 ,小于等于
2、=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,
3、 FreeMarker是精确比较,“x”,"x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果 ( FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况)