FreeMarker 常见指令

FreeMarker 常见指令

assign 自定义变量指令

使用 assign 指令你可以创建一个新的变量, 或者替换一个已经存在的变量。

<#--     assign 自定义变量指令         语法:             <#assign 变量名=值>             <#assign 变量名=值 变量名=值> (定义多个变量) --> <#assign str="hello"> ${str} <br> <#assign num=1 names=["zhangsan","lisi","wangwu"] > ${num} -- ${names?join(",")}

if elseif else 逻辑判断指令

可以使用 ifelseifelse 指令来条件判断是否满足某些条件。

<#--     if, else, elseif 逻辑判断指令         格式:             <#if condition>               ...             <#elseif condition2>               ...             <#elseif condition3>               ...             <#else>               ...             </#if>         注:             1. condition, condition2等:将被计算成布尔值的表达式。             2. elseif 和 else 指令 是可选的。 --> <#assign score = 80> <#if score < 60>     你个小渣渣!     <#elseif score == 60>         分不在高,及格就行!     <#elseif score gt 60 && score lt 80>         哎哟不错哦!     <#else>         你很棒棒哦! </#if> <br>  <#-- 判断数据是否存在 --> <#assign list=""> <#if list??>     数据存在     <#else>         数据不存在 </#if>

list 遍历指令

可以使用 list 指令来对序列进行遍历。

<#--     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> <br>  <#assign users3 = []> <#-- 当序列没有数据项时,使用默认信息 --> <#list users3 as user>     ${user}     <#else>         当前没有数据! </#list>

macro 自定义指令

可以使用 macro 指令来自定义一些自定义指令。

<#--     macro 自定义指令 (宏)         1. 基本使用             格式:                 <#macro 指令名>                     指令内容                 </#macro>             使用:                 <@指令名></@指令名>         2. 有参数的自定义指令             格式:                  <#macro 指令名 参数名1 参数名2>                     指令内容                 </#macro>             使用:                 <@指令名 参数名1=参数值1 参数名2=参数值2></@指令名>          注:             1. 指令可以被多次使用。             2. 自定义指令中可以包含字符串,也可包含内置指令 --> <#-- 定义基本的自定义指令 --> <#macro address>     © 19992015 The FreeMarker Project. All rights reserved. </#macro> <#-- 使用指令 --> <@address></@address> <br> <@address></@address> <hr>  <#-- 定义有参数的自定义指令 --> <#macro queryUserByName uname>     通过用户名查询用户信息 - ${uname} </#macro> <#-- 使用指令,并传递参数 --> <@queryUserByName uname="admin"></@queryUserByName> <br>  <#-- 定义有多个参数的自定义指令 --> <#macro queryUserByParams uname uage>     通过多个餐宿查询用户信息 - ${uname} - ${uage} </#macro> <#-- 使用指令,并传递多个参数 --> <@queryUserByParams uname="admin" uage=18></@queryUserByParams> <br> <hr>  <#-- 自定义指令中包含内置指令 --> <#macro cfb>     <#list 1..9 as i>         <#list 1..i as j>             ${j}*${i}=${j*i}          </#list>         <br>     </#list> </#macro> <@cfb></@cfb> <@cfb></@cfb>  <#-- 动态数据 --> <#macro cfb2 num>     <#list 1..num as i>         <#list 1..i as j>             ${j}*${i}=${j*i}          </#list>         <br>     </#list> </#macro> <@cfb2 num=5></@cfb2>

nested 占位指令

nested 指令执行自定义指令开始和结束标签中间的模板片段。嵌套的片段可以包含模板中任意合法的内容。

<#--     nested 占位指令         nested 相当于占位符,一般结合macro指令一起使用。         可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。 --> <#macro test>     这是一段文本!     <#nested>     <#nested> </#macro> <@test><h4>这是文本后面的内容!</h4></@test>

import 导入指令

import 指令可以引入一个库。也就是说,它创建一个新的命名空间, 然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。

commons.ftl

<#macro cfb>     <#list 1..9 as i>         <#list 1..i as j>             ${j}*${i}=${j*i}          </#list>         <br>     </#list> </#macro>

在其他ftl页面中通过import导入commons.ftl的命名空间,使用该命名空间中的指令

test.ftl

<#-- 导入命名空间 --> <#import "commons.ftl" as common> <#-- 使用命名空间中的指令 --> <@common.cfb></@common.cfb>

include 包含指令

可以使用 include 指令在你的模板中插入另外一个 FreeMarker 模板文件 。 被包含模板的输出格式是在 include 标签出现的位置插入的。 被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。

<#--包含指令(引入其他页面文件) include--> <#--html文件--> <#include "test.html">   <#--freemarker文件--> <#include "test.ftl">   <#--text文件--> <#include "test.txt"> 

FreeMarker 页面静态化

通过上述介绍可知 Freemarker 是一种基于模板的、用来生成输出文本的通用工具,所以 我们必须要定制符合自己业务的模板,然后生成自己的 html 页面。Freemarker 是通过 freemarker.template.Configuration 这个对象对模板进行加载的(它也处理创建和缓存预 解析模板的工作),然后我们通过 getTemplate 方法获得你想要的模板,有一点要记住 freemarker.template.Configuration 在你整个应用必须保证唯一实例。

定义模板

news.ftl

<#-- 新闻标题 --> <h1>${title}</h1> <p>     新闻来源:${source}   发布时间:${pubTime?sring("yyyy-MM-dd HH:mm")} </p> <#-- 新闻内容 --> <p>     ${content} </p>

加载模板

 @WebServlet("/news") public class NewsServlet extends HttpServlet {     @Override     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         // 实例化模板配置对象         Configuration configuration = new Configuration();         // 设置加载模板的上下文 以及 设置加载模板路径(模板存放的路径)         configuration.setServletContextForTemplateLoading(getServletContext(),"/template");         // 设置模板的编码格式         configuration.setDefaultEncoding("UTF-8");         // 加载模板文件,获取模板对象         Template template = configuration.getTemplate("news.ftl");           // 设置模型数据         Map<String,Object> map = new HashMap<>();         map.put("title", "特别就业季:稳就业情况如何? 哪些问题待解?");         map.put("source", "人民日报");         map.put("pubTime", new Date());         map.put("content", "中共中央政治局常务委员会近日召开会议强调," +                 "要有针对性地开展援企、稳岗、扩就业工作," +                 "做好高校毕业生、农民工等重点群体就业工作," +                 "积极帮助个体工商户纾困。疫情期间,稳就业情况如何?还有哪些问题待解?" +                 "记者采访了不同群体,记录这个特别的就业季。");          // 获取项目所在的根目录         String basePath = request.getServletContext().getRealPath("/");         // 设置页面存放的目录         File htmlFile = new File(basePath + "/html");         // 判断目录是否存在         if (!htmlFile.exists()) {             // 如果目录不存在,则新建目录             htmlFile.mkdir();         }         // 获取文件名(随机生成不重复的文件名)         String fileName = System.currentTimeMillis() + ".html";         // 创建html文件         File file = new File(htmlFile, fileName);         // 获取文件输出流         FileWriter writer = new FileWriter(file);         try {             // 输出html  将模型数据填充到模板中             template.process(map, writer);             // 输出成功             System.out.println("新闻创建成功!");         } catch (TemplateException e) {             e.printStackTrace();         } finally {             writer.flush();             writer.close();         }     } }

生成对应的html文件

浏览器地址栏输入:

http://localhost:8989/news

生成的文件存放在当前项目的webapp目录下的html目录中。

您可能还会对下面的文章感兴趣: