网页静态化技术 Freemarker
网页静态化解决方案在实际运用中比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道。对于电商网站的商品详细页(几百万的商品,同样的页面模板格局)来说,每个商品又有大量的信息,这样的情况同样也适用于网页静态化解决方案。
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不大频繁的数据。另外网页静态化还有利于 SEO(搜索引擎优化)
另外我们如果将网页以纯静态化的形式展现,就可以使用 Nginx这样的高性能的 Web服务器来部署。Nginx可以承载5万的并发,而 Tomcat只有几百。
一、什么是 Freemarker
FreeMarker是一款模板引擎:即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个 Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker最初的设计,是被用来在 MVC模式的 Web开发框架中生成 HTML页面的,没有被绑定到 Servlet或 HTML或任意 Web相关的东西上,它也可以用于非 Web应用环境中。
二、Freemarker 入门程序
【1】引入模板 Jar 包的依赖
模板文件中四种元素:
● 文本:直接输出的部分
● 注释:即<#--...-->格式不会输出,<!-- -->注释会输入到页面。
● 插值(Interpolation):即${..}部分,将使用 数据模型 中的部分替代输出
● FTL指令:FreeMarker指令,和 HTML标记类似,名字前加#予以区分,不会输出。
【3】Freemark 生成文件(将数据与模板进行关联)。主函数代码如下:
【4】FTL 指令:assign 指令:用于在页面上定义一个变量
① 定义简单类型:linkname 为变量
③ 运行效果如下:
include 指令:此指令用于模板文件的嵌套,创建嵌套文件 head.ftl
if 指令:在模板文件中进行逻辑判断,后台构造 success 变量的数据。
模板中添加 if 指令:
list 指令:循环实现列表的展示,后台构造 list 数据:
模板中添加 list 指令: *_index 为freemaker的内置属性,用来获取下表,从0开始
【5】内建函数:函数的语法:变量+?+函数名称
① 使用 size 函数实现 list 的长度:
② 转换 JSON 字符串为对象:变量=字符串+?+eval
③ 日期格式转化:变量+?+date 后台数据构建如下:
模板中获取日期、时间、日期时间组合和日期的格式转化,如下:
④ 数字转化为字符串(模板默认将数字进行了分割符切分),后台数据组装
效果如下:我们会发现数字会以每三位一个分隔符显示,有些时候我们不需要这个分隔符,就需要将数字转换为字符串,使用内建函数c:${point?c}
三、空值处理运算符
如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但是有些时候,有的变量确实是null,怎么解决这个问题呢?
【1】缺失变量赋值:“!”(我们除了可以判断是否为空值,也可以使用!对null值做转换处理)
【2】用法为:variable??,如果该变量存在,返回true,否则返回false
四、运算符
● 算数运算符
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
●逻辑运算符:逻辑运算符有如下几个:
逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误
● 比较运算符:表达式中支持的比较运算符有如下几个:
=或者==:判断两个值是否相等.
!=:判断两个值是否不等.
>或者gt:判断左边值是否大于右边值
>=或者gte:判断左边值是否大于等于右边值
<或者lt:判断左边值是否小于右边值
<=或者lte:判断左边值是否小于等于右边值
注意: =和!=可以用于比较字符串,数值和日期是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","X"是不等的。其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替 > 会有更好的效果,因为 FreeMarker会把 > 解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>