Freemarker 简介
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.
FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序.
FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件,FreeMarker与Web容器无关,即在Web运行时.它并不知道Servlet或HTTP。
它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java文件等…
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)
特点
- 轻量级模板引擎,不需要Servlet环境就可以很轻松的嵌入到应用程序中
- 能生成各种文本,如html,xml,java,等
- 入门简单,它是用java编写的,很多语法和java相似
使用
默认扩展名为 .ftl,放在templates文件夹中,如果想改变,可以通过application配置文件中添加spring.freemarker.suffix=.html,更改后就会找.html结尾的文件模板
为什么使用Freemarker
- SpringBoot虽然支持jsp,但是官方不推荐使用
- SpringBoot官方推荐使用Thymeleaf模板引擎,但是Thymeleaf并没有Freemarker好用
Freemarker与Thymeleaf的比较
thymeleaf优点:
- 静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调
- springboot官方推荐方案
thymeleaf缺点:
- 模板必须符合xml规范,不方便使用,js脚本必须加入/*<![CDATA[ */标识 ]] ,否则一个&符号就会导致后台模板合成抛异常,而且错误信息巨不好找,在html中含有&等符号,还需要转义,太麻烦
取值
${值/对象名.属性名},如果对象可能为null,则使用 ${值/对象名.属性名!""}双引号中可选择如果为null时显示什么内容
获得boolean需要 ${布尔值?string(“true”,“false”)},获得日期需要 ${日期值?string(“yyyy-MM-dd”)}
不被当html解析
${值/对象名.属性名?html}
在页面中自定义变量
<#assign 属性名 = 属性值>
在List集合取值
<#list 要遍历的集合名 as item>
${item} 取值
</#list>
对Map集合取值
<#list map?keys as key>
${key}: ${map[key]}
</#list>
if判断
<#if 条件>
条件成功后显示的内容
<#else>
上面条件不成立后显示的内容
</#if>
if-else 判断
<#if 条件>
条件成功后显示的内容
<#else>
上面条件不成立后显示的内容
</#if>
if-elseif-else判断
<#if 条件1>
条件1成立后显示的内容
<#elseif 条件2>
条件2成立后显示的内容
<#elseif 条件…>
…
<#else>
上面条件不成立后显示的内容
</#if>
引入其他模板
<#include “/cc.html”>
在idea中使用freemarker
pom添加依赖(可在创建项目时添加)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 在templates下创建freemarker
- controller
- 在freemarker页面中引入js
freemarker页面的一些使用代码
ftl页面:
<body>
第一个freemarker页面
<br />
${stu1.stuDate?string("yyyy-MM-dd")} <#--时间类型取值-->
<br />
${stu1.stuSex?string("男","女")} <#--boolean类型取值-->
<br />
${stu1.stuAge!"20"} <#--如果属性是空 可以直接!默认为空,也可以!"xx" 默认为xx-->
<br>
${stu1.stuName} <#--取值-->
<br>
<#assign num = 18><#--自定义变量-->
${num}
<hr>
<#list list1 as li> <#--遍历list集合-->
${li} <br>
</#list>
<hr>
<#list map1?keys as key> <#--遍历map集合-->
${key}: ${map1[key]}
</#list>
<hr>
<#assign num1 = 18>
<#if num1 < 18 > <#--判断条件 -->
你还小 <#--判断成立输出的内容-->
<#else>
你成年了
</#if>
<hr>
<#if num1 lt 20>
num1<20
<#elseif num1 gt 20> <#--注意 大于号不可以使用时,应转义 gt 小于可以使用(lt) -->
num1>20
<#else>
num1=18
</#if>
<hr>
</body>
controller层
@RestController
public class FreeController {
@RequestMapping("toIndex")
public ModelAndView free(){
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
Stu stu = new Stu();
stu.setStuId(1);
stu.setStuName("<font color='red'>zxf</font>");
/*stu.setStuAge(18);*/
stu.setStuSex(true);
stu.setStuDate(new Date());
mv.addObject("stu1",stu);
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
mv.addObject("list1",list);
Map<String,String> map = new HashMap<>();
map.put("a","a1");
map.put("b","b1");
map.put("c","c1");
map.put("d","d1");
map.put("e","e1");
mv.addObject("map1",map);
return mv;
}
}
客户端