当一个大型网站并发量很大时, 同一时间大量的访问导致服务器压力加大以及数据库数据交换频繁.大型动态网站之所以可以做到能快速响应高并发,它们都是尽量让自己的网站静态化,当然这种静态化绝不是把网站就做成静态网站,而是在充分理解了静态网站在提升网站响应速度的基础上对动态网站进行改良。
网页静态化
在java领域,表现层技术主要有三种:JSP、FreeMarker、Velocity。
- JSP
- 可以书写Java代码, 不能实现前后端分离
- 支持JSP标签
- 支持表达式语言(EL)
- 官方标准, 第三方标签库多
- 性能良好
- Velocity
- 不能书写Java代码, 严格的前后端分离
- 性能良好
- 可以使用表达式语言(EL)
- 不是官方标准, JSP标签支持不好, 第三方标签库少
- FreeMarker
- 不能书写Java代码, 严格的前后端分离
- 性能不错
- JSP标签支持良好
- 内置大量常用功能
- 使用表达式语言
- 宏定义(类似jsp标签)非常方便
- 不是官方标准, 第三方标签库没有JSP多
FreeMarker
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
使用FreeMarker
导入FreeMarker相关jar包
- 官网
1
2
3
4
5<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>一般步骤
- 1、创建一个模板文件, 扩展名一般为
ftl
- 里面的数据采用EL表达式, 如
${name}
, 那么数据里面需要包含name
这个字段 - 如果生成的模板出现中文乱码, 注意检查模板中
1
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- 里面的数据采用EL表达式, 如
- 2、创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
- 3、设置模板文件所在的路径。
- 4、设置模板文件使用的字符集。一般就是utf-8.
- 5、加载一个模板,创建一个模板对象。
- 6、创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
- 7、创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
- 8、调用模板对象的process方法输出文件。
- 9、关闭流。
1 | package com.coppco.freemarker; |
模板的语法
- Map, 通过
${key}
取值 - pojo, 通过
${属性}
取值 - Map中的pojo, 通过
${key.属性}
取值 - pojo中包装pojo, 通过
${属性.属性}
取值 - 集合中数据, 使用:
1
2
3
4
5<#list teacherList as teacher>
${teacher.name} //pojo的属性
${teacher.age}
${teacher_index} //获取下标
</#list> - 判断
1
2
3<#if student_index % 2 == 0>
<#else>
</#if> 日期类型格式化, 如果是Date对象, 直接使用会报错.
- 使用
${date?date}
, 解析结果为2017-7-10
- 使用
${date?time}
, 解析结果为7:29:39
- 使用
${date?datetime}
, 解析结果为2017-7-10 7:31:09
- 使用
${date?string(pattern)}
, 根据自己定义的日期格式化格式, 解析日期. 如传入yyyy-MM-dd HH:mm:ss
, 解析结果为2017-07-10 07:33:27
- 使用
Null值处理
- Freemarker中获取一个不存在的值或者值为Null时会报异常
- 默认值:
${key!"我是默认值"}
- 空字符串:
${key!}
- 使用
<#if>
判断Null值时 使用<#if key??>
1
2
3
4
5<#if val??>
//不为空
<#else>
//值为空
</#if>
- 引入其他模板
1
<#include "hello.ftl">
FreeMarker和Spring整合
导入相关jar包
1 | <dependency> |
和Spring整合
1 | <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> |
整合测试
1 | @Autowired |