创建模板四种元素

1、文本,直接输出的部分
2、注释,即<#—…—>格式不会输出
3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
4、FTL 指令:FreeMarker 指令,和 HTML 标记类似,名字前加#予以区分,不会输出。

入门Demo

1.创建MAVEN项目,引入依赖

  1. <dependency>
  2. <groupId>org.freemarker</groupId>
  3. <artifactId>freemarker</artifactId>
  4. <version>2.3.23</version>
  5. </dependency>

2.创建简单的模板文件

在resources下创建模板freemark.tfl

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>Freemarker 入门小 DEMO </title>
  5. </head>
  6. <body>
  7. <#--我只是一个注释,我不会有任何输出 -->
  8. ${name},你好。${message}
  9. </body>
  10. </html>

3.创建demo

FreeMarkDemo
image.png

  1. /**
  2. * 静态页面demo
  3. */
  4. public class FreeMarkDemo {
  5. public static void main(String[] args) throws IOException, TemplateException {
  6. //1.创建配置类
  7. Configuration configuration = new Configuration(Configuration.getVersion());
  8. //2.设置模板所在的目录
  9. configuration.setDirectoryForTemplateLoading(new File("D:\\Develop\\project\\pinyougou\\shangcheng\\freemark\\src\\main\\resources"));
  10. //3.设置字符集
  11. configuration.setDefaultEncoding("utf-8");
  12. //4.加载模板
  13. Template template = configuration.getTemplate("freemark.tfl");
  14. //5.创建数据模型
  15. Map map = new HashMap();
  16. map.put("name", "张三 ");
  17. map.put("message", "换用使用FreeMark模板!");
  18. //6.创建 Writer 对象
  19. Writer out = new FileWriter(new File("D://test.html"));
  20. //7.输出
  21. template.process(map, out);
  22. //8.关闭 Writer 对象
  23. out.close();
  24. }
  25. }

4.生成的模板页面

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>Freemarker 入门小 DEMO </title>
  5. </head>
  6. <body>
  7. 张三 ,你好。换用使用FreeMark模板!
  8. </body>
  9. </html>

5.页面展示
image.png

FTL指令

1.assign

此指令用于在页面上定义一个变量

1.1.简单类型

<#assign>
image.png

  1. <#assign linkman="周先生">
  2. 联系人:${linkman}

注意:
插值得到不是一个字符串格式的数据,只是将原有的内容原封不动的放在那个位置
FreeMarker - 图4
该操作会默认value所对应的内容是一个变量,需要在插值表达式外加引号,声明式一个字符串

1.2.定义对象类型

image.png

  1. <#assign info={"mobile":"13301231212",'address':'北京市'} >
  2. 电话:${info.mobile} 地址:${info.address}

2. include 指令

此指令用于模板文件的嵌套
准备:
创建模板文件 head.ftl
image.png

  1. <h1>FreeMark欢迎您</h1>

我们修改 test.ftl,在模板文件中使用 include 指令引入刚才我们建立的模板

image.png

  1. <#include "head.ftl">

展示效果:
image.png

3. if指令

对数据进行判断
image.png

  1. <#assign success=true>
  2. <#if success = true>
  3. success值为true
  4. <#else >
  5. success值为false
  6. </#if>

效果展示
image.png

4.list指令

(1)对list进行赋值
在方法中对map集合绑定一个list
image.png

  1. List goodsList=new ArrayList();
  2. Map goods1=new HashMap();
  3. goods1.put("name", "苹果");
  4. goods1.put("price", 5.8);
  5. Map goods2=new HashMap();
  6. goods2.put("name", "香蕉");
  7. goods2.put("price", 2.5);
  8. Map goods3=new HashMap();
  9. goods3.put("name", "橘子");
  10. goods3.put("price", 3.2);
  11. goodsList.add(goods1);
  12. goodsList.add(goods2);
  13. goodsList.add(goods3);
  14. map.put("goodsList", goodsList);

(2)修改模板页面
image.png

  1. <#list goodsList as goods>
  2. 水果:${goods.name}:价格${goods.price}<br>
  3. </#list>

(3)展示效果
image.png

内建函数

内建函数语法格式: 变量+?+函数名称

1. size 获取集合大小

需改模板
image.png

  1. 共${goodsList?size}条记录

展示结果
image.png

2. eval 格式化代码

image.png

  1. <#assign msg = "{'phone':'57575757','addr':'上海'}"/>
  2. <#assign data = msg?eval>
  3. 电话:${data.phone},地址:${data.addr}

image.png

3. 日期格式化

(1)方法中添加日期对象
image.png

  1. map.put("date", new Date());

(2)修改模板
image.png

  1. 当前日期:${date?date} <br>
  2. 当前时间:${date?time} <br>
  3. 当前日期+时间${date?datetime}<br>
  4. 格式化时间${date?string("yyyy年MM月dd日")}

(3)展示
image.png
**

4.数字的输出和格式化

方法中添加数字
image.png

  1. // 添加数字
  2. map.put("num",12345678);

(1)输出数字

修改模板
image.png

  1. ${num}


展示结果:
image.png
输出的是一串带有逗号分隔的数字

(2) c 格式化成字符串

image.png

展示结果
image.png**
输出的是没有分隔开的数字

5 ?? 空值处理运算符

(1)修改模板
一般在没有定义变量的情况下使用时会报错的
image.png

  1. <#if aaa??>
  2. aaa存在
  3. <#else>
  4. aaau不存在
  5. </#if>

(2)页面展示
image.png
**

6.缺失变量默认值:“!”

(1)修改模板
image.png

  1. ${aaa!"aaa不存在"}

(2)页面展示
image.png

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文件夹下

  1. pagedir=d:\\item\\

注意:
如果磁盘上没有该路径则会报错找不到位置

2.applicationcontex-service.xml中配置freemarker解析器

image.png

  1. <!-- 加载配置文件 -->
  2. <!-- 如果依赖包中配置了加载properties,此处不需要再次加载 -->
  3. <!--<context:property-placeholder location="classpath*:properties/*.properties"/>-->
  4. <!-- freemarker解析器 -->
  5. <bean id="freemarkerConfig"
  6. class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  7. <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
  8. <property name="defaultEncoding" value="UTF-8"/>
  9. </bean>

加载核心容器的方法
image.png```

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. version="2.5">
  6. <!-- 加载spring容器 -->
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath*:spring/applicationContext*.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. </web-app>

3.创建service方法

image.png
注意:
如果是分布式开发service不要引错包,用阿里的包

  1. @Service
  2. public class ItemPageServiceImpl implements ItemPageService {
  3. @Autowired
  4. private FreeMarkerConfigurer freeMarkerConfigurer;
  5. @Value("${pagedir}")
  6. private String pageDir;
  7. @Autowired
  8. private TbGoodsMapper goodsMapper;
  9. @Autowired
  10. private TbGoodsDescMapper goodsDescMapper;
  11. /**
  12. * 通过商品id生成静态页面
  13. *
  14. * @param goodsId 商品id
  15. * @return 是否成功
  16. */
  17. @Override
  18. public boolean genItemHtml(Long goodsId) {
  19. Configuration configuration = freeMarkerConfigurer.getConfiguration();
  20. try {
  21. Template template = configuration.getTemplate("item.ftl");
  22. // 创建数据模型
  23. Map<Object, Object> modelMap = new HashMap<>();
  24. //根据id查询goods表
  25. TbGoods goods = goodsMapper.selectByPrimaryKey(goodsId);
  26. // 将数据封装到模板中
  27. modelMap.put("goods", goods);
  28. // 查询desc表数据
  29. TbGoodsDesc goodsDesc = goodsDescMapper.selectByPrimaryKey(goodsId);
  30. // 封装到模型中
  31. modelMap.put("goodsDesc", goodsDesc);
  32. // 创建输出流
  33. FileWriter fileWriter = new FileWriter(pageDir + goodsId + ".html");
  34. // 创建模板并写出
  35. template.process(modelMap, fileWriter);
  36. fileWriter.close();
  37. } catch (IOException | TemplateException e) {
  38. e.printStackTrace();
  39. }
  40. return true;
  41. }
  42. }

4.创建模板文件

将模板文件放在WEB-INF/ftl文件夹下
image.png
注意:
要将模板放在配置文件指定的位置,否则会报错找不到指定文件