Freemarker 简介

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.

FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序.

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件,FreeMarker与Web容器无关,即在Web运行时.它并不知道Servlet或HTTP。

它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java文件等…

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)

freemarker二个动态值算术运算_#if

特点

  1. 轻量级模板引擎,不需要Servlet环境就可以很轻松的嵌入到应用程序中
  2. 能生成各种文本,如html,xml,java,等
  3. 入门简单,它是用java编写的,很多语法和java相似

使用

默认扩展名为 .ftl,放在templates文件夹中,如果想改变,可以通过application配置文件中添加spring.freemarker.suffix=.html,更改后就会找.html结尾的文件模板

为什么使用Freemarker

  1. SpringBoot虽然支持jsp,但是官方不推荐使用
  2. SpringBoot官方推荐使用Thymeleaf模板引擎,但是Thymeleaf并没有Freemarker好用

Freemarker与Thymeleaf的比较

thymeleaf优点:

  1. 静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调
  2. springboot官方推荐方案

thymeleaf缺点:

  1. 模板必须符合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>
  1. 在templates下创建freemarker
  2. freemarker二个动态值算术运算_html_02

  3. controller
  4. freemarker二个动态值算术运算_html_03

  5. 在freemarker页面中引入js
  6. freemarker二个动态值算术运算_#if_04

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;
    }
}

客户端

freemarker二个动态值算术运算_#if_05