FreeMarker常见指令的简单介绍—快速入门(二)

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} &nbsp;
        </#list><br/>
    </#list>
</#macro>
<@cfg></@cfg>
<hr>

<#macro cfb02 num>
    <#list  1..num as i>
        <#list 1..i as j>
            ${j} * ${i} = ${j*i} &nbsp;
        </#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常用指令

猜你喜欢

转载自blog.csdn.net/LOVE_Me__/article/details/111554856