1. 什么是Freemarker
- FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
- 目前企业中:主要用Freemarker做静态页面或是页面展示
一、Freemarker的入门
1.创建Maven project工程,jar包类型
2.添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>freemarker.demo</groupId>
<artifactId>freemarkerDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
</dependencies>
</project>
3.创建模版文件
<html>
<head>
<title>demo</title>
<meta charset="utf-8">
</head>
<body>
<#--freemarker的注解部分-->
<!--html的注释-->
${name},欢迎你。${message}
</body>
</html>
4.创建StartDemo.java生成模版文件
package test.demo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class StartDemo {
public static void main(String[] args) throws Exception {
//创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对应的版本号
Configuration configuration=new Configuration(Configuration.getVersion());
//设置模版文件所在的绝对路径
configuration.setDirectoryForTemplateLoading(new File("/Users/xiayubao/eclipse-workspace/freemarkerDemo/src/main/resources/"));
//设置模版文件使用的字符集,一般使用utf-8
configuration.setDefaultEncoding("utf-8");
//加载模版,创建一个模版对象
Template template=configuration.getTemplate("demo.ftl");
//创建一个模版使用的数据集,可以是pojo也可以是map,一般是map
Map map=new HashMap();
//向数据集中添加数据
map.put("name","小可爱");
map.put("message","喜欢你哦");
//创建一个输出流对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out=new FileWriter("/Users/xiayubao/Desktop/index.html");
//调用模板对象的process方法输出文件。
template.process(map, out);
//关闭流
out.close();
}
}
5.测试结果
二、Freemarker的指令
1.FreeMarker的模板文件
- 1.文本,直接输出的部分
- 2.注释,即<#–…-->格式不会输出
- 3.插值(Interpolation):即${…}或者#{…}格式的部分,将使用数据模型中的部分替代输出
- 4.FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
<html>
<body>
<#-- 注释部分 -->
<br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1>
<p>We have these animals:
<u1>
<#-- 使用FTL指令 -->
<#list animals as being>
<li>${being.name} </li>
<#list>
<u1>
</body>
</html>
2.include指令
可以引入html,也可以是另一个模版
<#include "include.html"/>
<#include "/common/copyright.ftl" encoding=”GBK”>
3.if指令
在freemarker的模版中,=和==的效果是一样的。
<#if success=true>
输出什么?
<#else>
也输出一些什么?
</#if>
4.list指令
- 主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.
- item_index:当前变量的索引值
- item_has_next:是否存在下一个对象
- break:跳出迭代
<#list nameList as names>
${names}
</#list>
5.import指令
- 类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。
<#import path as hash>
6.assign指令
- assign指令用于为该模板页面创建或替换一个顶层变量。
- 就是用于在页面上定义变量
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
姓名是:${value}
<#assign same as above... in namespacehash>
<#assign name>
capture this
</#assign>
<#assign name in namespacehash>
capture this
</#assign>
代码
package test.demo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class StartDemo {
public static void main(String[] args) throws Exception {
//创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对应的版本号
Configuration configuration=new Configuration(Configuration.getVersion());
//设置模版文件所在的绝对路径
configuration.setDirectoryForTemplateLoading(new File("/Users/xiayubao/eclipse-workspace/freemarkerDemo/src/main/resources/"));
//设置模版文件使用的字符集,一般使用utf-8
configuration.setDefaultEncoding("utf-8");
//加载模版,创建一个模版对象
Template template=configuration.getTemplate("demo.ftl");
//创建一个模版使用的数据集,可以是pojo也可以是map,一般是map
Map map=new HashMap();
//向数据集中添加数据
map.put("name","小可爱");
map.put("message","喜欢你哦");
map.put("success", true);
List goodsList=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);
goodsList.add(goods1);
goodsList.add(goods2);
goodsList.add(goods3);
map.put("goodsList", goodsList);
map.put("point", 102920122);
//创建一个输出流对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out=new FileWriter("/Users/xiayubao/Desktop/index.html");
//调用模板对象的process方法输出文件。
template.process(map, out);
//关闭流
out.close();
}
}
<html>
<head>
<title>demo</title>
<meta charset="utf-8">
</head>
<body>
<#--freemarker的注解部分-->
<!--html的注释-->
${name},欢迎你。${message}
<#assign linkman="周先生">
联系人:${linkman}
<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话:${info.mobile} 地址:${info.address}
<#if success=true>
你已通过实名认证
<#else>
你未通过实名认证
</#if>
<#list goodsList as goods>
${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
</#list>
共 ${goodsList?size} 条记录
<#include "head.ftl">
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
累计积分:${point}
累计积分:${point?c}
<#if aaa??>
aaa变量存在
<#else>
aaa变量不存在
</#if>
${aaa!'-'}
</body>
</html>