FreeMarker模板使用

FreeMarker 是一款 模板引擎

一、 在springboot项目 pom中引入依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
     </dependency>

二、 在application.yml中配置参数

spring:
	  application:
	    name: freemarker_demo
	  freemarker:
	    suffix: .ftl 
	    template-loader-path: classpath:/templates

三、 新建请求

public class User {
	    private String name;
	    private String age;
	
	    public User(String name, String age) {
	        this.name = name;
	        this.age = age;
	    }
	
	    public String getName() {
	        return name;
	    }
	
	    public void setName(String name) {
	        this.name = name;
	    }
	
	    public String getAge() {
	        return age;
	    }
	
	    public void setAge(String age) {
	        this.age = age;
	    }
	}
	@Controller
	public class HtmlController {
	    @RequestMapping("/index")
	    public String index(ModelMap modelMap) {
	        User user =new User("理想","28");
	        modelMap.addAttribute("user",user);
	        return "index";
	    }
	
	}
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Title</title>
	</head>
	<body>
	Index页面
	<h1>访问者:${user.name}</h1>
	<h1>访问者年龄:${user.age}</h1>
	</body>
	</html>

在浏览器中输入http://localhost:8081/index,成功获取网页访问者内容

四、 语法 参考 http://freemarker.foofun.cn/

${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值)。
FTL 标签(FreeMarker模板的语言标签)的名字以 # 开头。(用户自定义的FTL标签则需要使用 @ 来代替 #。)
注释: 注释和HTML的注释也很相似, 但是它们使用 <#-- and --> 来标识。不像HTML注释那样,FTL注释不会出现在输出中。
变量声明

变量会在模板开始时被创建,而不管变量声明放置在模板的什么位置

  • <#assign name=value>或者<#assign name>value</#assign>:定义变量(非全局),注意在<#assign name>value</#assign>value中不应插入变量
  • <#macro name><#macro>:宏变量(非全局),在模板中使用宏自定义指令变量,这样就能进行重复性的工作。通常将使用 <@name...> 这称为 宏 调用。
  • <#macro name><#nested><#macro>:宏变量,嵌套指令执行位于开始和结束标记指令之间的模板代码段,可以嵌套模块。
  • <#function name param1 param2 ... paramN>...<#return returnValue>...</#function>:方法变量,和 macro指令的工作方式一样
  • <#local name=value>:局部变量,它和 assign 指令 类似,但是它创建或替换局部变量。 这仅仅在宏和方法的内部定义才会有作用。
  • <#global name=value>:全局变量,会覆盖同名模型变量,会被命名空间同名变量覆盖,可以通过${.globals.name}获取变量name。
  • <#import path as hash>hash哈希表变量,在主命名空间中导入依赖库创建相关命名空间,用哈希表变量来访问该命名空间。
    ####其他指令
  • <#if [condition]></#if>:使用 if 指令可以有条件地跳过模板的一些片段。
  • <#if [condition]><#else></#if>:使用 if else指令可以有条件地跳过模板的一些片段。
  • <#if [condition]><#elseif [condition><#else></#if>:使用 if elseif指令可以有条件地跳过模板的一些片段。
  • <#list objlist as obj></#list>:当需要列表显示内容时,objlist为空时依然执行一次。
  • <#list objlist><#items as obj></#items></#list>:当需要列表显示内容时,objlist为空时items被忽略。
  • <#list objlist as obj>${obj}<#sep>, </#sep></#list>:使用分隔符
  • <#list objlist as obj>${obj}<#sep>,<#else>None</#list>:使用分隔符,objlist为空,忽略分隔符
  • <#include path></#include>:使用 include 指令重用代码片段。
  • 内建函数?(类似Java中的方法)它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。使用 ?(问号)代替 .(点)来访问它们。
  • 处理空值
    1. ${obj!"default"}:变量为空或者不存在赋值默认值
    2. obj??:??判断obj是否为空,返回布尔值。
    3. obj.param1.param2!0:只能判断param2为空的处理
    4. (obj.param1.param2)!0:能判断obj、param1、param2为空的处理
    5. (obj.param1.param2)??:能判断obj、param1、param2是否为空
  • <#break>:可以使用 break 指令在迭代的任意点退出。
  • <#return>:return后面的模板内容将被忽略
  • <#attempt>[module1]<#recover>[module2]</#attempt>:module1出错将会执行module2,防止模块出错不输出内容
  • <#compress>...</#compress>:压缩空格指令,缩小所有不间断的空白序列到一个单独的空白字符。
  • <#escape x as x?html>...${a}</#escape>=>${a?html}:转义指令
  • <#escape x as x?html>... <#noescape></#noescape></#escape>=>${a?html}:noescape非转义指令和escape嵌套使用,标识非转义模块
  • <#flush>:冲洗指令
  • <#ftl param1=value1 param2=value2 ... paramN=valueN>:允许的参数有: encoding, strip_whitespace, strip_text 等。FreeMarker模板的配置信息
  • <#noparse>...</#noparse>:FreeMarker 不会在这个指令体中间寻找FTL标签 ,插值和其他特殊的字符序列,除了noparse的结束标记。
  • <#nt>:“不要削减”。该指令禁用行中出现的 剥离空白。 它也关闭其他同一行中出现的削减指令(t, rt,lt的效果)。
  • <#t>:(整体削减)忽略本行中首和尾的所有空白。
  • <#lt>:(左侧削减)忽略本行中首部所有的空白。
  • <#rt>:(右侧削减)忽略本行中尾部所有的空白。
  • <#setting name=value>:支持的设置有:locale、number_format、boolean_format、 date_format、 time_format、 datetime_format、time_zone、sql_date_and_time_time_zone 、url_escaping_charset、output_encoding、classic_compatible。
  • <#stop>或<#stop reason>:该指令抛出 StopException,而且 StopException 会持有 reason 参数的值。
  • <#switch value><#case refValue1>...<#break><#default>...</#switch>:这个指令的用法是不推荐的,因为向下通过的行为容易出错。使用 elseif来代替, 除非你想利用向下通过这种行为。
  • </@>:结束标签.如果表达式包含比简单变量名和点还多的表达式,你就不能再重复它们了。比如,<@a_hash[a_method()]>...</@a_hash[a_method()]>就是错的,你必须写为 <@a_hash[a_method()]>...</@>。 但是 <@a_hash.foo>...</@a_hash.foo> 是可以的。
  • <#visit node>:<#visit nodeWithNameX><@x/>类同
  • <#recurse>:是真正纯语义上的指令。 它访问结点的所有子结点(而没有结点本身)。
  • <#fallback>:fallback 指令可以被用在自定义指令中被调用处理结点。 它指挥 FreeMarker 在更多的命名空间 (也就是,在当前调用列表中自定义指令命名空间之后的命名空间) 中来继续搜索自定义指令。如果结点处理器被发现, 那么就被调用,否则 fallback 不会做任何事情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值