下面我们来介绍一下为什么要使用网页静态化技术.
门户网站中的新闻频道,或者文章类的频道,又或者电商类的网站,这些网站少说要有几百万个商品和详情页,如果每次访问这些页面都要从数据库查询信息的话那么数据库的压力可想而知.这时不少网站都会使用缓存技术来解决这个问题,今天我们要说的同样也可以减轻数据库访问压力的网页静态化技术Freemarker.
网页静态化技术和缓存技术有一个共同点,都是为了减轻数据库的访问压力,但是具体应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(网页优化)。
什么是freemarker
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
基本原理:
基本使用:Text.java
//使用步骤:
//第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。
//1.创建配置类
Configuration configuration=new Configuration(Configuration.getVersion());
//第二步:设置模板文件所在的路径。
configuration.setDirectoryForTemplateLoading(new File("模板文件的绝对路径"));
//第三步:设置模板文件使用的字符集。一般就是 utf-8.
configuration.setDefaultEncoding("utf-8");
//第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("test.ftl");
//第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
Map map=new HashMap();
map.put("name", "张三 ");
map.put("message", "欢迎来到神奇的freemarker世界!");
//第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
Writer out =new FileWriter(new File("d:\\test.html"));
//第七步:调用模板对象的 process 方法输出文件。
template.process(map, out);
//第八步:关闭流
out.close();
模板test.ftl:
<html>
<head>
<meta charset="utf-8">
<title>Freemarker入门小DEMO </title>
</head>
<body>
<#--我只是一个注释,我不会有任何输出 -->
${name},你好。${message}
</body>
</html>
freemarker的FTL指令:
- <#assign name=""> 该指令用于在页面定义一个变量(简单类型或者对象类型)
- <#include ""> 该指令用于模板文件的嵌套,减少重复代码的编写
- <#if 条件> 结果1 <#else> 结果2 </#if>
- <#list 集合 as 集合中的元素> </#list>
内建函数:语法格式:变量+?+函数名称
- 获取集合的大小 ${集合?size}
- 将JSON字符串转化为对象
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
- 日期格式化:
只显示日期:${对象?date},只显示时间:${对象?time},显示时间和日期:${对象?datetime}
日期格式化:${对象?String('自定义格式,如:yyyy年MM月')}
- 数字转换为字符串
数字显示时,每三位都有一个分隔符显示,如果不需要这个分隔符,用${对象?c}
freemarker与spring的整合:
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
//WEB-INF下的ftl文件夹用来存放模板,数据用FTL表达式来显示
java中数据的交互:
@Value("${pagedir}")//配置文件中指定生成静态网页的位置
private String pagedir;
@Autowired
private FreeMarkerConfig freeMarkerConfig;
Configuration configuration = freeMarkerConfig.getConfiguration();
Template template = configuration.getTemplate("item.ftl");//获得模板
Map dataModel=new HashMap<>();
//1.加载商品表数据
TbGoods goods = goodsMapper.selectByPrimaryKey(goodsId);
dataModel.put("goods", goods);
//2.加载商品扩展表数据
TbGoodsDesc goodsDesc = goodsDescMapper.selectByPrimaryKey(goodsId);
dataModel.put("goodsDesc", goodsDesc);
Writer out=new FileWriter(pagedir+goodsId+".html");
template.process(dataModel, out);
out.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}