freemarker
1.什么是freemarker?
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
2.freemarker模板中的四种元素
1)文本:直接输出的部分,
2)注释:即<#--...-->格式不会输出,
3)插值:即${..},将使用数据模型中的部分代替输出,
4)ftl指令:freemarker指令,和html类似,名字前加#予以区分,不会输出。
3.freemarker入门小demo
1)在pom.xml中加入以下依赖
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
2)创建一个简单的模板文件,test.ftl
<html> <head> <meta charset="utf-8"> <title>Freemarker入门小DEMO </title> </head> <body> <#--我只是一个注释,我不会有任何输出 --> ${name},你好。${message} </body> </html>
3)生成文件
使用步骤:
第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。
第二步:设置模板文件所在的路径。
第三步:设置模板文件使用的字符集。一般就是 utf-8.
第四步:加载一个模板,创建一个模板对象。
第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
第七步:调用模板对象的 process 方法输出文件。
第八步:关闭流
代码如下:
package com.gh;import freemarker.template.Configuration;import freemarker.template.Template;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.*;public class FreemarkerDemo { public static void main(String[] args) throws Exception { //1.创建配置类 Configuration configuration=new Configuration(Configuration.getVersion()); //2.设置模板所在的目录 configuration.setDirectoryForTemplateLoading(new File("F:\\idea_code\\hlt-parent\\hlt-freemarker-demo\\src\\main\\resources")); //3.设置字符集 configuration.setDefaultEncoding("utf-8"); //4.加载模板 Template template = configuration.getTemplate("test.ftl"); //5.创建数据模型 Map map=new HashMap(); map.put("name", "tom "); map.put("message", "hello world!"); //6.创建Writer对象 Writer out =new FileWriter(new File("d:abc\\test.html")); //7.输出 template.process(map, out); //8.关闭Writer对象 out.close(); }}
运行结果:
4.ftl指令
1)assign指令
此指令用于在页面上定义一个变量
1.定义简单类型
<#assign linkman="周先生"> 联系人:${linkman}
2.定义对象类型
<#assign info={"mobile":"13301231212",‘address‘:‘北京市昌平区王府街‘} > 电话:${info.mobile} 地址:${info.address}
运行结果:
2)include指令
此指令用于模板文件的嵌套,创建模板文件head.ftl,在test.ftl中通过include指令引入head.ftl
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我是头信息 </body> </html>
在test.ftl中加入以下内容就可以将head.ftl里面的内容加入到test.ftl中
<#include "head.ftl">
3)if指令
语法规则:<#if> 、<#else>、在if里面加入判断规则即可
例如:在test.ftl中加入如下内容
<#if success=true> 你已通过英语四级考试 <#else> 你未通过英语四级考试 </#if>
在代码中对str变量赋值
map.put("success",true);
在freemarker中判断既可以用=也可以用==
4)list指令
在代码中对list进行赋值
List list=new ArrayList(); 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); list.add(goods1); list.add(goods2); list.add(goods3); map.put("list",list);
模板中加入以下内容
----商品价格表----<br> <#list goodsList as goods> ${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br> </#list>
如果想在循环中得到索引,使用循环变量+_index就可以得到。
5)获取集合大小
我们通常使用size函数来实现
${list?size}
6)转换json字符串为对象
通过eval函数来实现
<#assign text="{‘bank‘:‘工商银行‘,‘account‘:‘10101920201920212‘}" /> <#assign data=text?eval /> 开户行:${data.bank} 账号:${data.account}
7)日期格式化
在代码中加入
map.put("today",new Date());
在模板中加入
当前日期:${today?date} <br> 当前时间:${today?time} <br> 当前日期+时间:${today?datetime} <br> 日期格式化: ${today?string("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒")}
运行结果:
8)数字转化为字符串
在代码中加入
map.put("number",123456789);
在模板中加入
分数:${number}
页面显示:
我们发现数字每三位会用“,”分隔开,如果我们不想显示逗号,可以通过内建函数c来去掉,例如
分数:${number?c}
9)判断某变量是否存在
用法为:str??,如果该变量存在,返回true,否则返回false
<#if aaa??> aaa变量存在 <#else> aaa变量不存在 </#if>
10)缺失变量默认值
我们除了可以判断是否为空值,也可以使用!对null值做转换处理
${aaa!‘-‘}
在代码中不对aaa赋值,也不会报错了 ,当aaa为null则返回!后边的内容-
5.运算符
1)算术运算符
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
2)逻辑运算符
逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误
3)比较运算符
表达式中支持的比较运算符有如下几个:
1 =或者==:判断两个值是否相等.
2 !=:判断两个值是否不等.
3 >或者gt:判断左边值是否大于右边值
4 >=或者gte:判断左边值是否大于等于右边值
5 <或者lt:判断左边值是否小于右边值
6 <=或者lte:判断左边值是否小于等于右边值
6.内建函数
FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来转换输出变量。
字符串相关常用的内建函数:
1. html:对字符串进行HTML编码;
2. cap_first:使字符串第一个字母大写;
3. lower_case:将字符串转成小写;
4. upper_case:将字符串转成大写;
集合相关常用的内建函数:
1. size:获得集合中元素的个数;
数字值相关常用的内建函数:
1. int:取得数字的整数部分。