Freemarker模板引擎技术
-
了解模板引擎原理
-
掌握Freemarker常用语法
-
Freemarker项目实战
1、什么是模板引擎?
答:模板引擎的目标是"数据 + 模板 = 结果"
模板引擎将数据与展现有效“解耦”。
主流的模板引擎
JSP (Java Server Page)
Freemaker (模板引擎)
Beetl
Freemarker是免费开源的模板引擎技术
Freemarker脚本为Freemarker Template Language (拓展名 .ftl)
Freemarker提供了大量内建函数来简化开发
JSP与Freemarker的比较
比较项目 | JSP | Freemarker |
---|---|---|
官方标准 | 是 | 否 |
执行方式 | 编译型 | 解释性 |
执行效率 | 高 | 低 |
开发效率 | 低 | 高 |
拓展能力 | 弱 | 强 |
数据提取 | JSTL+EL | 内置标签 |
如何使用Freemarker
在网站上输入freemarker.aphache.org 下载解压后将jar文件添加到工程中
之后编辑器会推荐下载一个编辑器,下载即可。
在类中使用Freemarker的步骤
1、加载模板
//导入相关的包,创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
//指定版本号
设置加载目录
config.setClassForTemplateLoading(FreemarkerSample1.class, "");
//第一个参数是.ftl文件在那个类下面
//第二个参数是传入空字符串代表当前包的意思
//得到模板对象
Template t = config.getTemplate("sample1.ftl");
// 2、创建数据
Map<String,Object> date = new HashMap<>();
date.put("site", "新浪");
date.put("url", "http://www.sina.com");
// 3、产生输出
t.process(date,new OutputStreamWriter(System.out));
FTL取值
${属性名} 取值,可对属性进行计算
${属性名!默认值} 使用默认值
${属性名?string} 格式化输出
Freemarker对javabean 也有着良好的支持
定义一个computer类,其中包含一些字段
data.put("date", new Date());
data.put("number",837183.883217);
Map<String,Object> info = new HashMap<>();
info.put("cpu", "i5-7740");
//实例化computer对象
Computer c1 = new Computer( "123456", "Thinkpad", 1, "李四", new Date(), 12900f, info );
data.put("computer", c1 );
在ftl文件中可以使用如下代码提取数据:
<#-- 这是一段注释 -->
${site}
${url}
<#-- !默认值 -->
${author!"不存在的属性"}
${date?string("yyyy年MM月dd日 HH:mm:ss SSS")}
${number?string("0.00")}
SN:${computer.sn}
型号:${computer.model}
状态:${computer.state}
用户:${computer.user}
采购时间:${computer.dop?string("yyyy年MM月dd日")}
采购价格:${computer.price?string("0.00")}
配置信息
------------------
CPU:${computer.info["cpu"]} //info为Map类型的数据,[]内填写key值
内存:${computer.info["memory"]!"无内存信息"}
if 分支判断
示例:
假设需要根据学生成绩判断其等级,其中student.score存储学生成绩,在ftl文件中
//值得注意的是,在freemarker中,判断字符串是否相等,可以直接使用 '=='号
<#if student.grade == "A" >
优秀
</#if>
<#-- ??用来判断对象是否为空,true不为空,false为空 -->
<#if computer.user??>
用户:${computer.user}
</#if>
switch分支判断
<#switch computer.state>
<#case 1>
状态:正在使用
<#break>
<#case 2>
状态:闲置
<#break>
<#case 3>
状态:已作废
<#break>
<#default>
状态:无效状态
</#switch>
List 迭代列表
<#list student as stu >
<li>${stu_index} - ${stu.name} </li>
</#list>
List迭代Map
<#list map?keys as key>
${key}:${map[key]}
</#list>
List迭代Map
<#list computer_map?keys as k>
${k}-${computer_map[k].model}
${computer_map[k].price?string("0.00")}
</#list>
使用内建函数
函数名 | 说明 | 示例 |
---|---|---|
lower_case/upper_case | 大小写转换 | “abcdef”?upper_case |
cap_first | 首字母大写 | “jackson”?cap_first |
index_of | 查找字符索引 | “abcdef”?index_of(“b”) |
length | 返回字符串长度 | “abcdef”?length |
round/floor/ceiling | 四舍五入/上下取整 | pi?floor |
size | 得到集合元素总数 | student?size |
first / last | 获取第一个/最后一个元素 | students?first |
sort_by | 按某个属性对集合排序 | list?sort_by(“time”) |
${name?cap_first}
${brand?upper_case}
${brand?length}
${words?replace("blood","*****")}
${words?index_of("blood")}
<#-- 利用string实现三目运算符的操作 -->
${(words?index_of("blood3")!=-1)?string("包含敏感词汇","不包含敏感词汇")}
${n?round}
${n?floor}
${n?ceiling}
公司共有${computers?size}台电脑
第一台:${computers?first.model}
最后一台:${computers?last.model}
<#list computers?sort_by("price")?reverse as c >
${c.sn}-${c.price}
</#list>
Freemarker官方中文文档:http://freemarker.foofun.cn/dgui_quickstart_template.html
Freemarker与java整合
1、引入freemarker.jar包
在Webcontent的WEB-INF目录下的lib文件中将jar文件复制进去,加入到工程中去
在web.xml的配置文件中 ,配置好相关配置
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/WEB-INF/ftl</param-value> //#路径写死了
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
在WEB-INF目录下创建ftl文件,测试