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>