[toc]

网页静态化技术Freemarker

FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

1. 网页静态化技术使用场景

​ 网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(Search Engine Optimization)。另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有三百到五百。

2. 页面静态化技术Freemarker入门Demo

2.1 引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   //tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>

//相关依赖
<dependencies>
<!--引入freemarker的jar包-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>

</dependencies>

2.2 Java代码控制生成Html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

public class genFreemarker {

@Test
public void test() throws Exception{
//第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。
Configuration configuration = new Configuration( Configuration.getVersion() );

//第二步:设置模板文件所在的路径。 抛出异常
configuration.setDirectoryForTemplateLoading( new File("D:\\javaCode\\freemarker\\src\\main\\resources\\") );

//第三步:设置模板文件使用的字符集。一般就是 utf-8.
configuration.setDefaultEncoding( "utf-8" );

//第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate( "index.ftl" );

//第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
Map map = new HashMap();
map.put( "name","taoge" );
map.put( "message","牛逼" );
map.put("success",true);

List list = new ArrayList<>();

list.add(new Good("taozi","25.4"));
list.add(new Good("lizi","5.4"));
list.add(new Good("juzi","2.4"));

map.put("list",list);

map.put("today",new Date());
map.put("point",1234567);
map.put("flag","1");

//第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
Writer writer = new FileWriter( new File("D:\\javaCode\\freemarker\\src\\main\\resources\\index.html") );

//第七步:调用模板对象的 process 方法输出文件。
template.process(map,writer);

//第八步:关闭流
writer.close();
}

}
//我们通过以上java代码以index.ftl为末班生成html静态页面,其中涉及到FTL的指令,如下

2.3 FTL指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
<#--include指令-->
<#include "header.ftl">

${name},你好${message}

<#-- 定义一个变量(简单类型) -->
<#assign linkman="涛先生">
联系人:${linkman}

<#--先定义,再输出数据。电话输出会有逗号因为是数值,可以使用字符串定义,或者使用内嵌函数c-->

<#assign taoge={"mobile":13855200338,"salary":50}>
电话:${taoge.mobile?c}
薪水:${taoge.salary}

<#--分支语句 =和== 一样-->
<#if success=true>
你已经验证通过了
<#else>
您没有验证通过
</#if>
<#--循环 -->
<#list list as good>
商品编号:${good_index+1}
商品名称:${good.name},
商品价格:${good.price}
<br/>

</#list>
<#--获取集合的长度-->
当前商品的条数是:${list?size}

<#assign xiaoxin="{'color':'black','height':'175'}"?eval>

${xiaoxin.color}
${xiaoxin.height}

<div>
<#--日期函数必须指定数据类型
date:年月日
time:时分秒
datetime:年月日时分秒
-->
${today?date}
${today?time}
${today?datetime}
<#--自定义日期格式的数据 -->
${today?string("yyyy/MM/dd")}

</div>

<div>
${point}
<#--去除分隔符c-->
${point?c}
</div>

<div>
判断空值:
<#if flag??>
<#--flag为null不存在-->
变量存在
<#else>
变量不存在
</#if>
</div>

<div>
<#--!"0" !添加缺失的默认值-->
${flag1!"0"}
${flag1!""}
${flag1!}
</div>
<#--运算符返回值只能是boolean类型的-->

//比较运算符
表达式中支持的比较运算符有如下几个: 
1 =或者==:判断两个值是否相等. 
2 !=:判断两个值是否不等. 
3 >或者gt:判断左边值是否大于右边值 
4 >=或者gte:判断左边值是否大于等于右边值 
5 <或者lt:判断左边值是否小于右边值 
6 <=或者lte:判断左边值是否小于等于右边值 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
字符串输出:
${"Hello ${name} !"} / ${"Hello " + name + " !"}
<#assign cname=r"特殊字符完成输出(http:\www.baidu.com)">
${cname}

字符串截取 :
通过下标直接获取下标对应的字母: ${name[2]}
起点下标..结尾下标截取字符串:${name[0..5]}

算数运算:
<#-- 支持"+"、"-"、"*"、"/"、"%"运算符 -->
<#assign number1 = 10>
<#assign number2 = 5>
"+" : ${number1 + number2}
"-" : ${number1 - number2}
"*" : ${number1 * number2}
"/" : ${number1 / number2}
"%" : ${number1 % number2}

比较运算符:
<#if number1 + number2 gte 12 || number1 - number2 lt 6>
"*" : ${number1 * number2}
<#else>
"/" : ${number1 / number2}
</#if>