freeMarker配置文件
# 是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性。
spring.freemarker.allow-request-override=false
# 是否允许HttpSession属性覆盖(隐藏)控制器生成的同名模型属性。
spring.freemarker.allow-session-override=false
# 是否启用模板缓存。
spring.freemarker.cache=false
# 模板编码。
spring.freemarker.charset=UTF-8
# 是否检查模板位置是否存在
spring.freemarker.check-template-location=true
# Content-Type value.
spring.freemarker.content-type=text/html
# 是否启用freemarker
spring.freemarker.enabled=true
# 设定所有request的属性在merge到模板的时候,是否要都添加到model中.
spring.freemarker.expose-request-attributes=false
# 是否在merge模板的时候,将HttpSession属性都添加到model中
spring.freemarker.expose-session-attributes=false
# 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
spring.freemarker.expose-spring-macro-helpers=true
# 是否优先从文件系统加载template,以支持热加载,默认为true
spring.freemarker.prefer-file-system-access=true
# 设定模板的前缀.
spring.freemarker.prefix=
# 是否在FreeMaker中使用 request.contextPath
spring.freemarker.request-context-attribute=true
# 设定FreeMarker keys.
spring.freemarker.settings.*=
# 设定模板的后缀.
spring.freemarker.suffix=.ftl
# 设定模板的加载路径,多个以逗号分隔,默认:
spring.freemarker.template-loader-path=classpath:/templates/
# 设定默认的视图解析地址
spring.freemarker.view-names=
## Spring Boot For Freemarker
spring.freemarker.template-loader-path=classpath:/templates
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl
coding
@Controller
@RequestMapping("/html")
public class TestController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "张三");
model.addAttribute("age", "30");
return "index";
}
}
- path resources/template/index.html
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
name:${name}
age:${age}
</body>
</html>
server:
port: 8889
mybatis:
type-aliases-package: com.sys.log.domain
mapper-locations: classpath:mapper/*.xml
spring:
application:
name: hystory-server
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///security?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 0
hikari:
minimum-idle: 5
idle-timeout: 600000
maximum-pool-size: 10
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
#配置 freemarker 文件路径和文件后缀
freemarker:
suffix: .html
template-loader-path: classpath:/templates/
logging:
level:
com.sys.log.mapper: DEBUG
FreeMarker模板文件
- 主要有4个部分组成:
- 文本,直接输出的部分
- 注释,即
<#--...-->
格式不会输出 - 插值(Interpolation):即
${..}
或者#{..}格式的部分,将使用数据模型中的部分替代输出 - FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
<html>
<body>
<#-- 注释部分 -->
<br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1>
<p>We have these animals:
<u1>
<#-- 使用FTL指令 -->
<#list animals as being>
<li>${being.name} </li>
<#list>
<u1>
</body>
</html>
list 指令
<#list nameList as names>
${names}
</#list>
<!-- 在 freemarker 中渲染模板 判断是否分页 -->
<#if nameList_has_next>
<w:p ><w:r><w:br w:type="page" /></w:r></w:p>
</#if>
<#if !showLimit>
<w:p ><w:r><w:br w:type="page" /></w:r></w:p>
</#if>
<#if nameList_has_next >
freemarker 模板引擎
</#if>
<#-- 使用FTL指令 -->
<#list animals as being><br>
<li>${being.name} for ${being.price} Euros<br>
<#list><br>
主要是进行迭代服务器端传递过来的List集合,name 是 list 循环的时候取的一个循环变量。相关指令:
- item_index:当前变量的索引值
- item_has_next:是否存在下一个对象
- break:跳出迭代
(2)if 指令
<#if name == "freemarker">
freemarker 模板引擎
</#if>
<#assign number1 = 8>
<#assign number2 = 5>
<#if (number1 + number2 > 12 || number1 - number2 > 6)>
"*" : ${number1 * number2}
<#else>
"/" : ${number1 / number2}
</#if>
<#if users??> <#--空判断-->
<#list users as user >
${user.id} - ${user.name}
</#list>
<#else>
${user!"变量为空则给一个默认值"}
</#if>
include 指令
<#include filename>
<#include filename options>
该标签用于导入文件。option包含下面2种属性:
encoding="GBK" 编码格式
parse=true 是否作为ftl语法解析,默认是 true,false 就是以文本方式引入。
注意在ftl文件里布尔值都是直接赋值的如 parse=true,而不是 parse="true"
<#include "include.html"/>
<#include "include.ftl" encoding="GBK"/>
<#include "/common/copyright.ftl" encoding="GBK" parse=false/>
switch , case , default , break
语法:
<#switch value>
<#case refValue>语句1<#break>
<#case refValue>语句2<#break>
<#default>语句3
</#switch>
示例:
<#switch name>
<#case "freemarker">This is a freemarker's template.<#break>
<#case "velocity">This is a velocity's template.<#break>
<#default>This is a jsp's template.
</#switch>
(6)import 指令
类似于java里的 import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。
<#import path as hash>
path:文件路径
hash:为导入的文件定义命名空间
assign 指令
assign指令用于为该模板页面创建或替换一个顶层变量。
<#assign a=1>
<#assign x=1 y=2>
<#assign arg1>
hello freemarker
</#assign>
<#assign arg2>
${arg1} world
</#assign>
<#assign arg3="${arg1} world">
noparse 指令
noparse指令指定FreeMarker不处理该指定里包含的内容。
<#assign a=1>
<#noparse>
${a}
</#noparse>
输出结果:
${a}
setting
<!-- 语法 -->
<#setting name=value>
<!-- 用来设置整个系统的一个环境 -->
该指令用于设置FreeMarker的运行环境,name的取值范围包含如下几个:
- locale:该选项指定该模板所用的国家/语言选项
- number_format:指定格式化输出数字的格式
- boolean_format:指定两个布尔值的语法格式,默认值是true,false
- date_format,time_format,datetime_format:指定格式化输出日期的格式
time_zone:设置格式化输出日期时所使用的时区
示例
// 字符串输出:
${"Hello ${name} !"} / ${"Hello " + name + " !"}
<#assign cname=r"特殊字符完成输出(http:\www.baidu.com)">
${cname}
// 字符串截取 :
通过下标直接获取下标对应的字母: ${name[2]}
起点下标..结尾下标截取字符串:${name[0..5]}
// 算数运算:
<#-- 支持"+"、"-"、"*"、"/"、"%"运算符 -->
<#assign number1 = 10>
<#assign number2 = 5>
"+" : ${number1 + number2}
"-" : ${number1 - number2}
"*" : ${number1 * number2}
"/" : ${number1 / number2}
"%" : ${number1 % number2}
// 比较运算符:
<#if number1 + number2 gte 12 || number1 - number2 lt 6>
"*" : ${number1 * number2}
<#else>
"/" : ${number1 / number2}
</#if>
// 内建函数:
<#assign data = "abcd1234">
第一个字母大写:${data?cap_first}
所有字母小写:${data?lower_case}
所有字母大写:${data?upper_case}
<#assign floatData = 12.34>
数值取整数:${floatData?int}
获取集合的长度:${users?size}
时间格式化:${dateTime?string("yyyy-MM-dd")}
// 空判断和对象集合:
<#if users??>
<#list users as user >
${user.id} - ${user.name}
</#list>
<#else>
${user!"变量为空则给一个默认值"}
</#if>
// Map集合:
<#assign mapData={"name":"程序员", "salary":15000}>
直接通过Key获取 Value值:${mapData["name"]}
通过Key遍历Map:
<#list mapData?keys as key>
Key: ${key} - Value: ${mapData[key]}
</#list>
// 通过Value遍历Map:
<#list mapData?values as value>
Value: ${value}
</#list>
// List集合:
<#assign listData=["ITDragon", "blog", "is", "cool"]>
<#list listData as value>${value} </#list>
// include指令:
引入其他文件:<#include "otherFreeMarker.ftl" />
// macro宏指令:
<#macro mo>
定义无参数的宏macro--${name}
</#macro>
使用宏macro: <@mo />
<#macro moArgs a b c>
定义带参数的宏macro-- ${a+b+c}
</#macro>
使用带参数的宏macro: <@moArgs a=1 b=2 c=3 />
// 命名空间:
<#import "otherFreeMarker.ftl" as otherFtl>
${otherFtl.otherName}
<@otherFtl.addMethod a=10 b=20 />
<#assign otherName="修改otherFreeMarker.ftl中的otherName变量值"/>
${otherFtl.otherName}
<#assign otherName="修改otherFreeMarker.ftl中的otherName变量值" in otherFtl />
${otherFtl.otherName}
null判断
- 如果name为null,freemarker就会报错。如果需要判断对象是否为空:
<#if name??>
……
</#if>
/*
当然也可以通过设置默认值${name!''}来避免对象为空的错误。
如果name为空,就以默认值(“!”后的字符)显示。
对象user,name为user的属性的情况,user,name都有可能为空,那么可以写成${(user.name)!''},表示user或者name为null,都显示为空。判断为空
*/
<#if (user.name)??>
……
</#if>
<#if list?exists && list.size != 0 >
空值判断:${book.name?if_exists },
${book.name?default(‘xxx’)}//默认值xxx
${ book.name!"xxx"}//默认值xxx
时间格式化显示
<#assign datetimeformat="yyyy-MM-dd HH:mm:ss zzz">
<lastBuildDate>${date?string(datetimeformat)}</lastBuildDate>
<pubDate>${date?string(datetimeformat)}</pubDate>
数字格式
${book?string.number}--20
${book?string.currency}--<#-- $20.00 -->
${book?string.percent}—<#-- 20% -->
字符串截取substring,注意substring中括号的位置
<#if res1.NAME?length<12>
${res1.NAME}
<#else>
${res1.NAME?substring(0,12)}
</#if>
内置的默认值处理:default
用途: 用于处理默认值
User: ${userLogin.name?default("Anonymous")}
<td>${(emanager.name)?default(" ")}</td>
{/* 输出: */}
User: Anonymous
<td> </td>