FreeMarker的主要学习内容
FreeMarker中文官方手册(可结合学习)http://freemarker.foofun.cn/
FreeMarker学习笔记源码git地址(可供下载):https://github.com/L-Melted/FreeMarkerDemo.git
三、FreeMarker常见指令
assign自定义变量指令
使用assign指令你可以创建一个新的变量,或者替换一个已经存在的变量。
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :assign自定义变量指令
*/
@WebServlet("/f09")
public class FreeMarker09 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f09.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f09.ftl文件获取数据
<#--
assign自定义变量指令
语法:
<#assign 变量名=值>
<#assign 变量名=值 变量名=值> (定义多个变量)
-->
<h5>assign自定义变量指令</h5>
<#-- 定义单个变量 -->
<#assign str="hello">
${str}<br/>
<#-- 定义多个变量 -->
<#assign num=1 names=["zhangsan","lisi","wangwu"]>
${num} -- ${names?join(",")}
if elseif else 逻辑判断指令
可以使用if,else if和else指令来条件判断是否满足某些条件。
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :if elseif else自定义变量指令
*/
@WebServlet("/f10")
public class FreeMarker10 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f10.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f09.ftl文件获取数据
<#--
if,else,elseif逻辑判断指令
格式:
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>
注:
1.condition,condition2等:将被计算成布尔值的表达式。
2.elseif和else指令是可选的。
-->
<h5>if,else,elseif逻辑判断指令</h5>
<#assign score = 60>
<#if score lt 60>
<h6>你个小渣渣!!!</h6>
<#elseif score == 60>
<h6>分不在高,及格就行!!!</h6>
<#elseif score gt 60 && score lt 80>
<h6>革命尚未成功,同志仍需努力!!!</h6>
<#else>
<h6>哎呦不错哦!!!</h6>
</#if>
<#-- 判断数据是否存在 -->
<#assign list="">
<#if list??>
数据存在
<#else>
数据不存在
</#if>
<br/>
<#if list2??>
数据存在
<#else>
数据不存在
</#if>
<br/>
list遍历指令
可以使用list指令来对序列进行遍历
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :list遍历指令
*/
@WebServlet("/f11")
public class FreeMarker11 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f11.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f09.ftl文件获取数据
<#--
list指令
格式1:
<#list sequence as item></#list>
格式2:
<#list sequence as item>
<#else>
当没有选项时,执行else指令
</#list>
注:
1.else部分是可选的
2.sequence:想要迭代的项,可以是序列或集合的表达式
3.item:循环变量的名称
4.当没有迭代项时,才使用else指令,可以输出一些特殊的内容而不只是空在那里
-->
<#assign users = ["张三","李四","王五"]>
<#-- 遍历序列 -->
<#list users as user>
${user}
</#list>
<br/>
<#-- 判断数据不为空,再执行遍历 (如果序列不存在,直接遍历会报错)-->
<#if users2??>
<#list users2 as user>
${user}
</#list>
</#if>
<#-- 当序列没有数据项时,使用默认信息 -->
<#assign users3 = []>
<#list users3 as user>
${user}
<#else>
用户数据不存在
</#list>
<#assign users3 = ['a']>
<#list users3 as user>
${user}
<#else>
用户数据不存在
</#list>
macro自定义指令
可以使用macro指令来自定义一些自定义指令
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :macro指令
*/
@WebServlet("/f12")
public class FreeMarker12 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f12.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f12.ftl文件获取数据
<#--
macro自定义指令 (宏)
1.基本使用
格式:
<#macro 指令名>
指令内容
<#macro>
使用:
<@指令名></@指令名>
2.有参数的自定义指令
格式:
<#macro 指令名 参数名1 参数名2>
指令内容
</#macro>
使用:
<@指令名 参数名1 = 参数值1 参数名2 = 参数值2></@指令名>
注:
1.指令可以被多次使用
2.自定义指令中可以包含字符串,也可包含内置指令
-->
<#-- 自定义指令 -->
<#macro address>
© 1999–2015 The FreeMarker Project. All rights reserved.
</#macro>
<#-- 使用自定义指令 -->
<@address></@address>
<#macro address>
<h3>© 1999–2015 The FreeMarker Project. All rights reserved.</h3>
</#macro>
<@address></@address>
<@address></@address>
<@address></@address>
<#-- 自定义有参数的指令 -->
<#macro queryUserByName uname>
通过用户名查询用户对象 - ${uname}
</#macro>
<@queryUserByName uname = "admin"></@queryUserByName><br>
<#macro queryUserByName02 uname upwd uphone>
多条件查询用户对象 - ${uname} - ${upwd} - ${uphone}
</#macro>
<@queryUserByName02 uname = "zhangsan" upwd = "123456" uphone = "123456"></@queryUserByName02>
<hr>
<#-- 自定义指令中包含内置指令 -->
<#macro cfg>
<#list 1..9 as i>
<#list 1..i as j>
${j} * ${i} = ${j*i}
</#list><br/>
</#list>
</#macro>
<@cfg></@cfg>
<hr>
<#macro cfb02 num>
<#list 1..num as i>
<#list 1..i as j>
${j} * ${i} = ${j*i}
</#list><br>
</#list>
</#macro>
<@cfb02 num = 5></@cfb02>
nested占位指令
nested指令执行自定义指令开始和结束标签中间的模板片段。嵌套的片段可以包含模板中任意合法的内容。
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :macro指令
*/
@WebServlet("/f13")
public class FreeMarker13 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f13.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f13.ftl文件获取数据
<#--
nested 占位指令
nested 相当于占位符,一般结合macro指令一起使用。
可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示
-->
<#macro test>
这是一段文本!!!
<#nested>
<#nested>
</#macro>
<@test><h4>这是文本后面的内容!!!</h4></@test>
import导入指令
import指令可以引入一个库。也就是说,它创建一个新的命名空间,然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :macro指令
*/
@WebServlet("/f14")
public class FreeMarker14 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f14.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f14.ftl文件获取数据
<#-- 通过import指令引入命名空间 -->
<#import "f12.ftl" as f12>
<@f12.cfg></@f12.cfg>
<@f12.cfb02 num = 5></@f12.cfb02>
<@f12.address></@f12.address>
include包含指令
可以使用include指令在你的模板中插入另外一个FreeMarker模板文件。被包含模板的输出格式是在include标签出现的位置插入的。被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。
创建Servlet,方便向对应页面进行跳转
package com.xxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: liman
* @Date: 2020/12/22 15:47
* @Description: FreeMarker 常见指令 :macro指令
*/
@WebServlet("/f15")
public class FreeMarker15 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发跳转到指定的模板页面 template/f01.ftl
req.getRequestDispatcher("template/f15.ftl").forward(req, resp);
}
}
在webapp的template文件下面创建f15.ftl文件获取数据
<#-- 包含指令(引入其他页面文件)include -->
<#-- html文件 -->
<#include "test.html">
<#-- FreeMarker文件 -->
<#include "test.ftl">
<#-- txt文件 -->
<#include "test.txt">
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>FreeMarker的使用</h2>
</body>
</html>
test.ftl
<h3>FreeMarker常用指令</h3>
test.xml
FreeMarker常用指令