今天简单介绍一下什么是模板引擎,以及简单的使用
1.什么是模板引擎
简单的来说,模板引擎就是一种基于模板和数据输出文本的一种工具
1.什么是freemaker
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
2.环境搭建&快速入门
这里采用springboot项目进行入门测试,首先需要创建springboot工程,并导入下面的相关依赖信息
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>
编写application.yml配置
server:
port: 8088 #服务端口
spring:
application:
name: test-freemarker #指定服务名
freemarker:
cache: false #关闭模板缓存,方便测试
settings:
template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
在resources目录下创建一个目录,名字是templates的文件夹,注意该文件夹的名字不能随便更改,freemaker会默认去classpath下的templates文件夹下寻找模板文件,在该文件夹下创建一个模板文件后缀为ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World!</title>
</head>
<body>
Hello ${name}!
</html>
编写controller层代码实现模板的生成
package com.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
public class TestController {
@RequestMapping("/freemaker")
public String test(Map<String,String> map){
map.put("name","lex");
return "test1";
}
}
在页面调用该接口可在页面输出
Hello lex!
3.freemaker基础语法
3.1list指令
该指令会将我们在controller层设置的map中的数据进行遍历
为了方便测试,这里我们先定义一个测试的对象数据
package com.test;
import lombok.Data;
@Data
public class Person {
private String name;
private Integer age;
}
然后我们在controller层添加几条数据
package com.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class TestController {
@RequestMapping("/freemaker")
public String test(Map<String,Object> map){
List<Person> l =new ArrayList<>();
Person p1=new Person();
p1.setName("lex");
p1.setAge(20);
Person p2=new Person();
p2.setName("nana");
p2.setAge(19);
Person p3=new Person();
p3.setName("huihui");
p3.setAge(16);
l.add(p1);
l.add(p2);
l.add(p3);
map.put("l",l);
return "test1";
}
}
修改模板文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World!</title>
</head>
<body>
<#--Hello ${name}!-->
<h1>使用list指令遍历信息</h1>
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
</tr>
<#list l as p >
<tr>
<td>${p.name}</td>
<td>${p.age}</td>
</tr>
</#list>
</table>
</html>
在页面输出
使用list指令遍历信息
姓名 年龄
lex 20
nana 19
huihui 16
3.2遍历map
在数据的map集合中可能还会存在一些map集合,在这里我们使用一些相关的指令将map集合中的数据遍历出来
首先还是在controller中准备一些数据
package com.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class TestController {
@RequestMapping("/freemaker")
public String test(Map<String,Object> map){
Map<String,Person> personMap =new HashMap<>();
Person p1 =new Person();
p1.setName("lex");
p1.setAge(20);
Person p2 =new Person();
p2.setName("mm");
p2.setAge(20);
Person p3 =new Person();
p3.setName("nn");
p3.setAge(20);
personMap.put("p1",p1);
personMap.put("p2",p2);
personMap.put("p3",p3);
map.put("personMap",personMap);
return "test1";
}
}
准备模板文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World!</title>
</head>
<body>
<#--Hello ${name}!-->
<h1>1.使用在[]中填写key值得方法遍历map</h1>
姓名:${personMap['p1'].name}<br>
年龄:${personMap['p1'].age}<br>
<h1>2.不使用[],直接使用点的形式</h1>
姓名:${personMap.p1.name}<br>
年龄:${personMap.p1.age}<br>
<h1>3.使用list对key进行遍历,再通过中括号取出</h1>
<#--注意,在这种方法下只能使用中括号的方式获取值,因为k是一个变量,无法直接通过点的方式传入-->
<#list personMap?keys as k>
姓名:${personMap[k].name}<br>
年龄:${personMap[k].age}<br>
</#list>
</html>
页面输出
1.使用在[]中填写key值得方法遍历map
姓名:lex
年龄:20
2.不使用[],直接使用点的形式
姓名:lex
年龄:20
3.使用list对key进行遍历,再通过中括号取出
姓名:lex
年龄:20
姓名:mm
年龄:20
姓名:nn
年龄:20
3.3 if指令
if指令写法
<#if ></#if>
可以在标签中写各种相应的逻辑判断,需要注意的是当有大于逻辑的时候 也就是需要些>号的时候需要用括号将整个判断包裹起来,以免引起标签解析时候的混淆例如
<#if (c>c+5) ></#if>
3.4 空值的处理
有些时候我们不确定map中有些数据是否存在,为了避免页面报错,我们需要对空值进行一下判断
<#if personMap??>
.....
</#if>
两个问号代表判断改值是否为空,如果为空会返回false,就不会执行里面的内容
还可以使用缺省值的方法对空值进行处理
${(personMap['p1'].name)!''}<br>
可以使用该种方法将每一个属性都进行缺省值的处理,当括号中的值为空的时候会将该变量设为空字符串