Freemarker 基础
Kiml Lv5
1
2
24-07-23 初始记录
24-07-26 bug记录

快速入门

freemarker 作为 Spring MVC 一种视图格式,默认情况下 SpringMVC 支持 freemarker 视图格式。

Maven 依赖

1
2
3
4
5
6
7
8
9
10
11
<!--父工程指定SpringBoot版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<!--freemarker依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐freemarker</artifactId>
</dependency>

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
# freemarker基本配置
spring:
freemarker:
charset: utf-8
request‐context‐attribute: rc
content‐type: text/html
suffix: .html
enabled: true
resources:
add‐mappings: false #关闭工程中默认的资源处理
mvc:
throw‐exception‐if‐no‐handler‐found: true #出现错误时直接抛出异常

代码使用

  1. 添加 view 映射

1
2
3
4
5
6
7
8
9
@Component  
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 注意这里不要添加后缀
registry.addViewController("/pay-page").setViewName("pay");
registry.addViewController("/pay-error").setViewName("pay_error");
}
}
  1. 返回 Controller 注解不要加 @ResponseBody@RestController这个注解把返回的信息转成 json 返回,不能实现页面跳转的功能

  2. 返回使用 forward:

1
return "forward:/pay-error";

基础指令

1、注释,即 <#‐‐和‐‐>,介于其之间的内容会被 freemarker 忽略
2、插值(Interpolation):即 ${..} 部分,freemarker 会用真实的值代替 ${..}
3、FTL 指令:和 HTML 标记类似,名字前加 # 予以区分,Freemarker 会解析标签中的表达式或逻辑。
4、文本,仅文本信息,这些不是 freemarker 的注释、插值、FTL 指令的内容会被 freemarker 忽略解析,直接输出内容。

List 指令

说明: _index:得到循环的下标,使用方法是在 stu 后边加 _index,它的值是从 0 开始

1
List<Student> stus = new ArrayList<>();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table>
<tr>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
<td>钱包</td>
</tr>
<#list stus as stu>
<tr>
<td>${stu_index + 1}</td>
<td>${stu.name}</td>
<td>${stu.age}</td>
<td>${stu.mondy}</td>
</tr>
</#list>
</table>

Map 指令

1
HashMap<String,Student> stuMap = new HashMap<>();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
输出stu1的学生信息:<br/>
姓名:${stuMap['stu1'].name}<br/>
年龄:${stuMap['stu1'].age}<br/>
输出stu1的学生信息:<br/>
姓名:${stuMap.stu1.name}<br/>
年龄:${stuMap.stu1.age}<br/>
遍历输出两个学生信息:<br/>
<table>
<tr>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
<td>钱包</td>
</tr>
<#list stuMap?keys as k>
<tr>
<td>${k_index + 1}</td>
<td>${stuMap[k].name}</td>
<td>${stuMap[k].age}</td>
<td>${stuMap[k].mondy}</td>
</tr>
</#list>
</table>

if 指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
<td>钱包</td>
</tr>
<#list stus as stu>
<tr>
<td <#if stu.name =='小明'>style="background:red;"</#if>>${stu.name}</td>
<td>${stu.age}</td>
<td>${stu.mondy}</td>
</tr>
</#list>
</table>

运算符

  1. 算数运算符 FreeMarker 表达式中完全支持算术运算,FreeMarker 支持的算术运算符包括:+, - , * , / , %

  2. 逻辑 运算符 逻辑运算符有如下几个: 逻辑与 && 逻辑或 || 逻辑非 ! 逻辑运算符只能作用于布尔值,否则将产生错误

  3. 比较运算符 表达式中支持的比较运算符有如下几个:

    1. = 或者 == 判断两个值是否相等
    2. != 判断两个值是否不等
    3. > 或者 gt 判断左边值是否大于右边值
    4. >= 或者 gte 判断左边值是否大于等于右边值
    5. < 或者 lt 判断左边值是否小于右边值
    6. <= 或者 lte 判断左边值是否小于等于右边值

注意:=!= 可以用于字符串,数值和日期来比较是否相等,但 =!= 两边必须是相同类型的值,否则会产生错误,而且 FreeMarker 是精确比较,“x”,"x ",“X” 是不等的。其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用 gt 等字母运算符代替 > 会有更好的效果,因为 FreeMarker 会把 > 解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>

空值处理

  1. 判断某变量是否存在使用 ?? 用法为:variable??,如果该变量存在,返回 true,否则返回 false

1
2
3
<#if stus??>
<#list stus as stu>
...
  1. 缺失变量默认值使用 ! 使用 ! 要以指定一个默认值,当变量为空时显示默认值。

1
2
3
4
<#--如果name为空显示空字符串。-->
${name!''}
<#--如果stu或bestFriend或name为空默认显示空字符串。-->
${(stu.bestFriend.name)!''}

内置对象

在 freemarker 中可以访问 Request、Session 等内置对象。

Request: 用于获取 Request 对象中的 attribute 对象。

Session:用于获取 Session 对象中的 attribute 对象。

RequestParameters:用于获取 Request 对象的 parameter 参数(浏览器端发送的请求数据)

  1. 配置

1
2
3
4
5
spring: 
freemarker:
request‐context‐attribute: rc #把Spring的RequestContext对象暴露为变量rc
expose‐request‐attributes: true
expose‐session‐attributes: true
  1. 例子在 Controller 中设置 request、session 的属性值

1
2
3
4
//测试内置对象 
request.setAttribute("attr1","test");
HttpSession session = request.getSession();
session.setAttribute("session1", "user1");

页面获取数据

1
2
3
4
5
url请求参数:${RequestParameters['param1']!""} 
request Attribute:${Request["attr1"]!""}
session Attribute:${Session["session1"]!""}
工程路径:${rc.contextPath}
请求地址: ${rc.requestUri}

BUG

访问报错 404

  1. 检查是否添加了 view 映射,注意不要加后缀。

  2. 检查 Controller 层使用的注解:不要加 @ResponseBody@RestController这个注解把返回的信息转成 json 返回,不能实现页面跳转的功能

  3. nacos 配置文件读取失败不确定原因重启 nacos 后就好了):使用 nacos 读取配置文件,出现自动装配时 suffix 没有读取到的情况。(本地配置使用.html 可以读取成功,但是放到 nacos 后,FreeMarkerProperties 中的 suffix 属性始终为默认的 .ftl,并且从springboot2.0开始默认的 suffix 为 .ftlh

    • 但是这里还是建议使用 .ftl,不然后序接口调用处可能会出 bug
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量