一:我们为什么使用网页静态化?
我们都知道静态化网页可以提供很好的用户体验,一些大型的新闻类网站中的文字新闻就是采用了静态化的页面,还有电商项目中商品的详情页也是使用了静态化网页,从中可以看出这些数据量都是很庞大的而且一般都不会发生改变,对于这样的数据都可以采用网页静态化的技术.
二:网页静态化的优点?
1.使用网页静态化可以缓解数据库的压力,我们不需要频繁的查询数据库.
2.静态化的页面有利于我们做SEO优化,提高网站的竞争力.
3.如果我们将网页以纯静态化的展示就可以使用Nginx这样的高性能服务器部署,Nginx大约可以承载5万的并发量.
三:什么是freemarker?
从百度百科中我们可以看出freemarker是一个用java语言编写的模板引擎,基于模板来生成文本,在实际的项目中freemarker与web容器无关,它不仅可以用作表现层的实现技术,而且还可以生成java,xml,jsp等.
四:freemarker的入门程序
1.首先我们创建一个普通的maven工程
2.引入freemarker的jar包依赖
3.怎么来创建模板文件?
一般模板文件中有四种元素:
(1)文本,可以直接输出的内容
(2)注释,使用<#-- -->格式
(3)插值,即${..}部分,将使用数据模型中的内容代替输出
(4)FTL指令,注意指令的前面都是加"#"的,比较重要的内容,稍后会详细讲解
4.创建一个模板文件test.ftl(注意释ftl格式的文件,即freemarker template language)
<html> <head> <meta charset="utf-8"> <title>Freemarker 入门程序 </title> </head> <body> <#--只是一个注释,不会有任何输出 --> ${name},你好。${message} </body> </html>
5. 生成文件的程序:
package com.study; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.File; import java.io.FileWriter; import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) throws Exception { // 第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是freemarker 的版本号。 //虽然这个构造器已经过时了,但不影响我们使用 Configuration configuration = new Configuration(Configuration.getVersion()); //第二步:设置模板文件所在的路径,这就看你放在哪里了, // 直接在模板文件上右键copy path,然后复制的路径再把文件名删掉,为了省事我直接抛出IO异常 configuration.setDirectoryForTemplateLoading( new File("D:\\dev\\workspace\\untitled2\\freemarker\\src\\main\\ftl")); //第三步:设置模板文件使用的字符集。一般就是 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","你很卡哇伊"); //第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。 FileWriter fileWriter = new FileWriter(new File("D:\\test.html")); //第七步:调用模板对象的 process 方法输出文件。 template.process(map,fileWriter); //第八步:关闭流 fileWriter.close(); } }
6.运行main方法,如果没问题后,就可以看到D盘下新生成了一个test.html,打开这个网页后的效果:
右键查看网页源代码:
从这可以看出,freemarker把我们以前的name和message替换成了我们自己定义的数据.
五:接下来就是比较重要的FTL指令:
1.assign指令,此指令用于在页面上定义变量
(1)定义简单类型的变量
<#assign num="666"> num:${num}</br>
(2)定义对象类型变量
<#assign info={"mobile":"123456","address":"地球"}> mobile:${info.mobile}<br> address:${info.address}<br>
(3)再次执行main函数生成页面的代码后,运行结果:
2.include指令,此指令用于模板之间的嵌套,当然也可嵌套HTML文件等
<#include "test02.ftl"> <#include "1.html">
我们在同一个目录下分别添加了如上两个文件
test02.ftl的内容
<html> <head> <meta charset="utf-8"> <title>HTML </title> </head> <body> <#assign num2="888"> num:${num2}</br> </body> </html>
1.html的内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>999999999</h1> </body> </html>
最后运行效果:
3.if指令
用法:
<#if num="66"> 6666666666 <#else > 9999999999 </#if>
而且你可以使用"=",也可以使用"=="
4.list指令
在我们上面写的main方法中添加map数据后面继续写:
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} name:${goods.name} price:${goods.price}<br> </#list>
运行效果:
如果我们需要获取索引值,则可以使用变量名+"_index"的方式获取
5.内建函数
基本语法:变量+?+函数名称
(1)获取集合的大小
集合的总记录数:${goodsList?size}
(2)转换json字符串为对象
<#assign text="{'bank':'工商银行','account':'1111111111111111111111111'}" /> <#assign data=text?eval /> 开户行:${data.bank} 账号:${data.account}
(3)日期格式化
在我们上面写的main方法中添加map数据后面继续写:
map.put("today", new Date());
然后模板中改写:
当前日期:${today?date} <br> 当前时间:${today?time} <br> 当前日期+时间:${today?datetime} <br> 日期格式化: ${today?string("yyyy 年 MM 月")}
运行效果:
(4)数字转化为字符串
在我们上面写的main方法中添加map数据后面继续写:
map.put("shu",12345678);
然后利于插值表达式获取数据,实际上此时已近转为字符串了:
${shu}
但是运行的效果是:.
发现它是利用","进行分离的,如果想去除","可以使用内建函数c,注意是小写的c
${shu?c}
(5)空值处理运算符
如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但
是有些时候,有的变量确实是 null,怎么解决这个问题呢?
<1>判断某变量是否存在:??
<#if aaa??> aaa 变量存在 <#else> aaa 变量不存在 </#if>
如果添加了一个判断,即使在代码中没有对变量赋值,运行程序时也不会报错
<2>缺失变量默认值:!
我们除了可以判断是否为空值,也可以使用!对 null 值做转换处理
${aaa!'-'}
如果aaa为null,则会输出 -,而且在代码中不对aaa赋值也不会报错
(6)运算符
<1>算术运算符
FreeMarker 表达式中完全支持算术运算,FreeMarker 支持的算术运算符包括:+, - , * , / , %
<2>逻辑运算符
逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误
<3>比较运算符
1) =或者==:判断两个值是否相等.
2) !=:判断两个值是否不等.
3) >或者 gt:判断左边值是否大于右边值
4) >=或者 gte:判断左边值是否大于等于右边值
5) <或者 lt:判断左边值是否小于右边值
6) <=或者 lte:判断左边值是否小于等于右边值
注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,
否则会产生错误,而且 FreeMarker 是精确比较,"x ","X"是不等的.其它的运行符可以作用于
数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,
因为 FreeMarker 会把>解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,
如:<#if (x>y)>