创建模板四种元素
1、文本,直接输出的部分
2、注释,即<#—…—>格式不会输出
3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
4、FTL 指令:FreeMarker 指令,和 HTML 标记类似,名字前加#予以区分,不会输出。
入门Demo
1.创建MAVEN项目,引入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
2.创建简单的模板文件
在resources下创建模板freemark.tfl
<html>
<head>
<meta charset="utf-8">
<title>Freemarker 入门小 DEMO </title>
</head>
<body>
<#--我只是一个注释,我不会有任何输出 -->
${name},你好。${message}
</body>
</html>
3.创建demo
FreeMarkDemo
/**
* 静态页面demo
*/
public class FreeMarkDemo {
public static void main(String[] args) throws IOException, TemplateException {
//1.创建配置类
Configuration configuration = new Configuration(Configuration.getVersion());
//2.设置模板所在的目录
configuration.setDirectoryForTemplateLoading(new File("D:\\Develop\\project\\pinyougou\\shangcheng\\freemark\\src\\main\\resources"));
//3.设置字符集
configuration.setDefaultEncoding("utf-8");
//4.加载模板
Template template = configuration.getTemplate("freemark.tfl");
//5.创建数据模型
Map map = new HashMap();
map.put("name", "张三 ");
map.put("message", "换用使用FreeMark模板!");
//6.创建 Writer 对象
Writer out = new FileWriter(new File("D://test.html"));
//7.输出
template.process(map, out);
//8.关闭 Writer 对象
out.close();
}
}
4.生成的模板页面
<html>
<head>
<meta charset="utf-8">
<title>Freemarker 入门小 DEMO </title>
</head>
<body>
张三 ,你好。换用使用FreeMark模板!
</body>
</html>
5.页面展示
FTL指令
1.assign
1.1.简单类型
<#assign>
<#assign linkman="周先生">
联系人:${linkman}
注意:
插值得到不是一个字符串格式的数据,只是将原有的内容原封不动的放在那个位置
该操作会默认value所对应的内容是一个变量,需要在插值表达式外加引号,声明式一个字符串
1.2.定义对象类型
<#assign info={"mobile":"13301231212",'address':'北京市'} >
电话:${info.mobile} 地址:${info.address}
2. include 指令
此指令用于模板文件的嵌套
准备:
创建模板文件 head.ftl
<h1>FreeMark欢迎您</h1>
我们修改 test.ftl,在模板文件中使用 include 指令引入刚才我们建立的模板
<#include "head.ftl">
3. if指令
对数据进行判断
<#assign success=true>
<#if success = true>
success值为true
<#else >
success值为false
</#if>
4.list指令
(1)对list进行赋值
在方法中对map集合绑定一个list
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);
(2)修改模板页面
<#list goodsList as goods>
水果:${goods.name}:价格${goods.price}<br>
</#list>
(3)展示效果
内建函数
1. size 获取集合大小
需改模板
共${goodsList?size}条记录
2. eval 格式化代码
<#assign msg = "{'phone':'57575757','addr':'上海'}"/>
<#assign data = msg?eval>
电话:${data.phone},地址:${data.addr}
3. 日期格式化
(1)方法中添加日期对象
map.put("date", new Date());
(2)修改模板
当前日期:${date?date} <br>
当前时间:${date?time} <br>
当前日期+时间${date?datetime}<br>
格式化时间${date?string("yyyy年MM月dd日")}
4.数字的输出和格式化
方法中添加数字
// 添加数字
map.put("num",12345678);
(1)输出数字
修改模板
${num}
(2) c 格式化成字符串
展示结果
**
输出的是没有分隔开的数字
5 ?? 空值处理运算符
(1)修改模板
一般在没有定义变量的情况下使用时会报错的
<#if aaa??>
aaa存在
<#else>
aaau不存在
</#if>
6.缺失变量默认值:“!”
(1)修改模板
${aaa!"aaa不存在"}
7.算数运算符
freemarker完全支持算数运算符 + - * / %
8.逻辑运算符
逻辑运算符有如下几个:
逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误
9.比较运算符
表达式中支持的比较运算符有如下几个:
1 =或者==:判断两个值是否相等.
2 !=:判断两个值是否不等.
3 >或者 gt:判断左边值是否大于右边值
4 >=或者 gte:判断左边值是否大于等于右边值
5 <或者 lt:判断左边值是否小于右边值
6 <=或者 lte:判断左边值是否小于等于右边值
注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值, 否则会产生错误,而且 FreeMarker 是精确比较,”x”,”x “,”X”是不等的.其它的运行符可以作用于 数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果, 因为 FreeMarker 会把>解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况, 如:<#if (x>y)>
spring框架集成freemarker
1.创建properties文件,放置静态页面存放位置
freemarker.properties
放在properties文件夹下
pagedir=d:\\item\\
2.applicationcontex-service.xml中配置freemarker解析器
<!-- 加载配置文件 -->
<!-- 如果依赖包中配置了加载properties,此处不需要再次加载 -->
<!--<context:property-placeholder location="classpath*:properties/*.properties"/>-->
<!-- freemarker解析器 -->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
加载核心容器的方法
```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3.创建service方法
注意:
如果是分布式开发service不要引错包,用阿里的包
@Service
public class ItemPageServiceImpl implements ItemPageService {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Value("${pagedir}")
private String pageDir;
@Autowired
private TbGoodsMapper goodsMapper;
@Autowired
private TbGoodsDescMapper goodsDescMapper;
/**
* 通过商品id生成静态页面
*
* @param goodsId 商品id
* @return 是否成功
*/
@Override
public boolean genItemHtml(Long goodsId) {
Configuration configuration = freeMarkerConfigurer.getConfiguration();
try {
Template template = configuration.getTemplate("item.ftl");
// 创建数据模型
Map<Object, Object> modelMap = new HashMap<>();
//根据id查询goods表
TbGoods goods = goodsMapper.selectByPrimaryKey(goodsId);
// 将数据封装到模板中
modelMap.put("goods", goods);
// 查询desc表数据
TbGoodsDesc goodsDesc = goodsDescMapper.selectByPrimaryKey(goodsId);
// 封装到模型中
modelMap.put("goodsDesc", goodsDesc);
// 创建输出流
FileWriter fileWriter = new FileWriter(pageDir + goodsId + ".html");
// 创建模板并写出
template.process(modelMap, fileWriter);
fileWriter.close();
} catch (IOException | TemplateException e) {
e.printStackTrace();
}
return true;
}
}
4.创建模板文件
将模板文件放在WEB-INF/ftl文件夹下
注意:
要将模板放在配置文件指定的位置,否则会报错找不到指定文件