笨蛋学习FreeMarker

news2024/11/27 15:49:36

Alt

笨蛋学习FreeMarker

  • FreeMarker
    • 参考网址
    • 创建实例
      • 引入Maven
      • 创建工具类
      • 创建实例并进行输出
    • FreeMarker数据类型
      • 布尔型:
      • 日期型:
      • 数值型:
      • 字符型:
        • 需要处理字符串为null的情况,否则会报错
        • 字符串为空不会报错
        • cap_first
        • uncap_first
        • upper_case
        • lower_case
        • capitalize
        • chop_linebreak
        • contains
        • ends_with
        • ensure_ends_with
        • ensure_starts_with
        • groups
        • html
        • index_of
        • j_string
        • js_string
        • json_string
        • keep_after
        • keep_after_last
        • keep_before
        • keep_before_last
        • last_index_of
        • length
        • lower_case
        • matches
        • number
        • replace
        • rtf
        • split
        • starts_with
        • trim
        • word_list
        • xhtml
        • xml
      • sequence类型:
      • hash类型:
    • FreeMarker指令
      • #assign定义变量
      • #if #elseif #else逻辑判断
      • #list遍历
      • #macro自定义
        • 创建自定义指令
        • 使用自定义指令
      • nested占位
      • import导入模板
      • include包含模板或文件
    • FreeMarker运算符
      • 算术运算符
      • 逻辑运算符
      • 比较运算符
      • 空值运算符

FreeMarker

参考网址

http://freemarker.foofun.cn/

创建实例

引入Maven

<!-- 模板引擎-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.33</version>
</dependency>

创建工具类

/**
 * FreeMarker 工具类,用于处理模板和生成输出文件
 */
public class FreeMarkerTemplate{
    private Configuration configuration;

    /**
     * 构造函数,初始化 FreeMarker 配置
     *
     * @param templateDirectory 模板文件存放的目录
     */
    public FreeMarkerTemplate(String templateDirectory) {
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        configuration.setClassForTemplateLoading(FreeMarkerTemplate.class, templateDirectory);
        configuration.setDefaultEncoding("UTF-8");
    }

    /**
     * 处理模板并生成输出文件
     *
     * @param templateName    模板文件名
     * @param model           模板数据模型,即要传递给模板的参数
     * @param outputFilePath  输出文件路径
     */
    public void processTemplate(String templateName, Map<String, Object> model, String outputFilePath) {
        try {
            // 加载指定的模板文件
            Template template = configuration.getTemplate(templateName);

            // 生成输出文件
            try (Writer out = new FileWriter(new File(outputFilePath))) {
                template.process(model, out); // 将模型数据填充到模板中
            }

            System.out.println("输出已生成: " + outputFilePath);
        } catch (IOException | TemplateException e) {
            e.printStackTrace(); // 处理异常,可以根据需要完善异常处理
        }
    }
}

创建实例并进行输出

Map<String, Object> model = new HashMap<>();
model.put("msg", "TodaySaturday");

// 创建 FreeMarker 工具类实例,指定模板目录(一般在resource目录下创建一个文件夹存放模板)
FreeMarkerTemplate freeMarkerUtil = new FreeMarkerTemplate("/templates");
// 调用工具类方法处理模板,生成输出文件
freeMarkerUtil.processTemplate("convertHtml.ftl", model, "TodaySaturday-GenApi.html");

FreeMarker数据类型

布尔型:

相当于boolean类型,但是不能直接输出,需要转字符串输出

  • 使用 ?c?msg 来进行转字符串

  • ${msg?c}
    ${msg?string}
    <!--如果是true返回yes,否则返回false-->    
    ${msg?string("yes","no")}
    

日期型:

相当于date类型,但是不能直接输出,需要转字符串输出

  • 年月日:?date

  • 时分秒:?time

  • 年月日时分秒:?datetime

  • 指定格式:?string("自定义格式")

    • y:年
    • M:月
    • d:日
    • H:时
    • m:分
    • s:秒
  • ${myDate?date}
    ${myDate?time}
    ${myDate?datetime}
    ${myDate?string("yyyy年MM月dd日 HH时mm分ss秒")}
    

数值型:

相当于int、float、double、lang等数值类型

  • 可以转换为数值型、货币型、百分比型
  • 转字符串:?c
  • 转货币型字符串:?string.currency
  • 转百分比型字符串:?string.percent
  • 保留小数:?string["0.##"],#表示一个小数位

字符型:

相当于字符串,有很多内置函数

cap_first 相反。 字符串中所有单词的首字母小写。

  • upper_case

字符串的大写形式。比如 "GrEeN MoUsE" 将会是 "GREEN MOUSE".

  • lower_case

字符串的小写形式。比如 "GrEeN MoUsE" 将会是 "green mouse".

  • capitalize

字符串中所有单词的首字母大写。

${"  green  mouse"?capitalize}
${"GreEN mouse"?capitalize}
  • chop_linebreak

在末尾没有 换行符 的字符串, 那么可以换行,否则不改变字符串。

  • contains

如果函数中的参数指定的子串出现在源字符串中, 那么返回true。

<#if "piceous"?contains("ice")>It contains "ice"</#if>
  • ends_with

返回是否这个字符串以参数中指定的子串结尾

"ahead"?ends_with("head") 返回 true

"head"?ends_with("head") 返回 true

  • ensure_ends_with

如果字符串没有以第一个参数指定的子串结尾, 那么就会将它加到字符串后面,否则返回原字符串。

"foo"?ensure_ends_with("/")

"foo/"?ensure_ends_with("/") 返回 "foo/"

  • ensure_starts_with

如果字符串没有以第一个参数指定的子串开头, 那么就会将它加到字符串开头,否则返回原字符串。

"foo"?ensure_starts_with("/")

"/foo"?ensure_starts_with("/") 返回 "/foo"

  • groups

这个函数只作用于内建函数 matches 的结果。请参考 这里…。

  • html
    • < 替换为 <
    • > 替换为 >
    • & 替换为 &
    • " 替换为 "
<input type=text name=user value="${user?html}">
  • index_of

返回第一次字符串中出现子串时的索引位置。

"abcabc"?index_of("bc") 将会返回1 (不要忘了第一个字符的索引是0)。而且,你可以指定开始搜索的索引位置: "abcabc"?index_of("bc", 2) 将会返回4。 这对第二个参数的数值没有限制:如果它是负数,那就和是0是相同效果了, 如果它比字符串的长度还大,那么就和它是字符串长度那个数值是一个效果。 小数会被切成整数。

  • j_string

根据Java语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意它 不会 在被插入的值的两侧添加引号; 你需要在字符串值 内部 来使用。

<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
String BEAN_NAME = "The \"foo\" bean.";
  • js_string

根据JavaScript语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意, 它不会在被插入的值两侧添加引号

引号(")和单引号(')要被转义。 也要将 > 转义为 \>(为了避免 </script>)。

<#assign user = "Big Joe's \"right hand\"">
<script>
  alert("Welcome ${user?js_string}!");
</script>

将会输出:

<script>
  alert("Welcome Big Joe\'s \"right hand\"!");
</script>
  • json_string

根据JSON语言的字符串规则来转义字符串, 所以在字符串中插入值是安全的。 要注意它 不会 在被插入的值两侧添加引号; 你需要在字符串值 内部 来使用。

这不会转义 ' 字符,因为JSON字符串必须使用 " 来括起来。它会在 < 之后直接出现的 /(斜杠)字符转义为 \/, 来避免 </script> 等。 它也会在 ]] 之后转义 > 字符为 \u003E,来避免退出XML的 CDATA 段。

  • keep_after

移除字符串中的一部分内容,该部分是给定子串第一次出现之前的部分。

${"abcdefgh"?keep_after("de")}

如果参数字符串没有找到,它会返回空串。如果参数是长度为0的字符串, 它会返回源字符串,不会改变。

该方法接受可选的 标志位参数,作为它的第二个参数:

${"foo : bar"?keep_after(r"\s*:\s*", "r")}
  • keep_after_last

keep_after 相同, 但是它会保留参数最后一次出现后的部分,而不是第一次。比如:

${"foo.bar.txt"?keep_after_last(".")}

若使用 keep_after 则会得到 bar.txt

  • keep_before

移除字符串的一部分,该部分是从给定子串开始的部分。 比如:

${"abcdef"?keep_before("de")}

如果参数字符串没有找到,它会返回源字符串,不会改变。 如果参数是长度为0的字符串,它会返回空串。

该方法接受可选的 标志位参数,作为它的第二个参数:

${"foo : bar"?keep_before(r"\s*:\s*", "r")}
  • keep_before_last

keep_before 相同, 但是保留参数最后一次出现之前的部分,而不是第一次出现之前。

${"foo.bar.txt"?keep_after_last(".")}
  • last_index_of

返回最后一次(最右边)字符串中出现子串时的索引位置。 它返回子串第一个(最左边)字符所在位置的索引。例如: "abcabc"?last_index_of("ab"):将会返回3。

  • length

字符串中字符的数量。

  • lower_case

字符串的小写形式。

"GrEeN MoUsE"?lower_case 将会是 "green mouse"

  • matches
    • 布尔值:如果字符串整体匹配了模式,就是 true, 否则就是 false。比如:"fooo"?matches('fo*') 就是 true,但是 "fooo bar"?matches('fo*')false
    • 序列:字符串匹配的子串的列表。很有可能是长度为0的序列。
  • number

字符串转化为数字格式。这个数字必须是 “计算机语言” 格式。也就是说, 它必须是本地化独立的形式,小数的分隔符就是一个点,没有分组。

  • replace

在源字符串中,用另外一个字符串来替换原字符串中出现它的部分。 它不处理词的边界。比如:

${"this is a car acarus"?replace("car", ulldozer")}

将会输出:

this is a bulldozer abulldozerus

替换是从左向右执行的。这就意味着:

${"aaaaa"?replace("aaa", "X")}

如果第一个参数是空字符串,那么所有的空字符串将会被替换, 比如 "foo"?replace("","|"),就会得到 "|f|o|o|"

replace 接受可选的 标志位参数,作为它的第三参数。

  • rtf
    • \ 替换为 \\
    • { 替换为 `{``
    • } 替换为 \}
  • split

它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。 比如:

<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
- "some"
- ""
- "test"
- "text"
- ""

split 接受可选的 标志位参数, 作为它的第二个参数。由于历史使用 r (正则表达式)标志的差错;它会从结果列表中移除空元素, 所以在最后示例中使用 ?split(",", "r")"" 会从输出中消失。

  • starts_with

如果字符串以指定的子字符串开头,那么返回true

"redirect"?starts_with("red") 返回布尔值 true

"red"?starts_with("red") 也返回 true

  • trim

去掉字符串首尾的空格。例如:

(${"  green mouse  "?trim})
  • word_list

包含字符串中所有单词的序列,顺序为出现在字符串中的顺序。 单词是不间断的字符序列,包含了任意字符,但是没有 空白。例如:

<#assign words = "   a bcd, .   1-2-3"?word_list>
<#list words as word>[${word}]</#list>

将会输出:

[a][bcd,][.][1-2-3]
  • xhtml
    • < 替换为 <
    • > 替换为 >
    • & 替换为 &
    • " 替换为 "
    • ' 替换为 '

该内建函数和 xml 内建函数的唯一不同是 xhtml内建函数转义 '',而不是 ', 因为一些老版本的浏览器不能正确解释 '

  • xml
    • < 替换为 <
    • > 替换为 >
    • & 替换为 &
    • " 替换为 "
    • ' 替换为 '

sequence类型:

相当于数组、List、Set等集合类型

  • 不能直接操作数组 ${arr},需要使用指令来输出序列类型

  • 输出序列

    • <#list arr as ele>
      	${ele}-${ele?index}
      </#list>
      
  • 获取序列的长度:${arr?sizt}

  • 获取序列的第一个元素:${arr?first}

  • 获取序列的最后一个元素:${arr?last}

  • 倒叙输出序列:

    • <#list arr?reverse as ele>
      	${ele}-${ele?index}
      </#list>
      
  • 升序输出序列:

    • <#list arr?sort as ele>
      	${ele}-${ele?index}
      </#list>
      
  • 降序输出序列:

    • <#list arr?sort?reverse as ele>
      	${ele}-${ele?index}
      </#list>
      

hash类型:

相当于map类型

  • 不能直接操作hash ${maps},需要使用指令来输出hash类型
<#list maps?keys as key>
	${key}-${maps[key]}
</#list>
<#list maps?values as value>
	${value}
</#list>

FreeMarker指令

#assign定义变量

<#assign str="hello">
${str}
<#assign num=1 >

#if #elseif #else逻辑判断

<#assign sum=60 >
<#if>
	<#elseif sum gt 60 && sum lt 80>
		合格
	<#else >
		不合格
</#if>

#list遍历

<#if user??>
	<#list arr?sort?reverse as ele>
        ${ele}-${ele?index}
    </#list>
</#if>
<#assign arr=[]>
<#list arr?sort?reverse as ele>
    ${ele}-${ele?index}
    <#else>
        如果arr为空,就执行这里的内容
</#list>

#macro自定义

创建自定义指令
<#macro hello>
Hello World
<#macro>
-----------------------
<#macro sum num1 num2>
${num1} + ${num2}
<#macro>
-----------------------
<#macro chengfabiao>
    <#list 1..9 as i>
         <#list 1..i as j>
       		  ${j} * ${i} = ${j*i} &nbsp
    	 </#list>
    </#list>
<#macro>
使用自定义指令
<@hello></@hello>
------------------------
<@sum 10 10></@sum 10 10>
------------------------
<@chengfabiao></@chengfabiao>

nested占位

  • <@ 指令名>占位内容</@ 指令名>
    • 占位内容会替换掉自定义指令中的<#nested>
<#macro hello>
Hello <#nested>
<#macro>
--------------------------
<@hello>World</@hello>

import导入模板

  • 创建一个模板 ftlOne.ftl
<#macro hello>
Hello <#nested>
<#macro>

<#macro helloworld>
Hello World!!!
<#macro>
  • 在ftlTwo.ftl中调用ftlOne.ftl
<#import "ftlOne.ftl" as one>
<@one.hello World>
<@one.helloworld>

include包含模板或文件

  • 定义一个html文件 index.html(模板同理)
  • 在indexDemo.html中调用
<#include "index.html">

FreeMarker运算符

算术运算符

  • +、-、*、/、%,如果是多个字段必须在 ${}中使用

逻辑运算符

  • &&、||、!

比较运算符

  • > (gt):大于
  • < (gl):小于
  • > (gte):大于等于
  • < (gle):小于等于
  • ==:等于
  • !=:不等于

空值运算符

  • !:指定缺失变量的默认值,
    • ${value!}: 如果value值为空,则默认值是空字符串
    • ${value!"默认值"}:如果value值为空,则默认值为 ”默认值“
  • ??:判断变量是否存在,如果变量存在,返回true,否则返回false
    • ${value??}?string

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【银河麒麟高级服务器操作系统实例】金融行业TCP连接数猛增场景的系统优化

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理…

12 django管理系统 - 注册与登录 - 登录

为了演示方便&#xff0c;我就直接使用models里的Admin来演示&#xff0c;不再创建用户模型了。 ok&#xff0c;先做基础配置 首先是在base.html中&#xff0c;新增登录和注册的入口 <ul class"nav navbar-nav navbar-right"><li><a href"/ac…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

一图读懂“低空经济”

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 ✈️ 一、低空经济简介&#x1f534; 1、基本含义&#x1f7e0; 2、…

【免费领取】基于javaweb实现的的日志管理系统

主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 本工作日志管理系统是一个面向中小企业的简单的工作管理系统&#xff0c;它主要实现公…

【Python】Pandas基础操作手册(上)

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是【Python】Pandas基础操作手册&#xff08;上&#xff09;本次主要讲解, python pandas 模块的一些基本概念, 以及了解 Dataframe 对象的创建, 赋值, 保存. 一起来看看叭…

【SpringBoot】17 多文件上传(Thymeleaf + MySQL)

Git仓库 https://gitee.com/Lin_DH/system 文件上传 可参考上一篇【SpringBoot】16 文件上传&#xff08;Thymeleaf MySQL&#xff09; https://blog.csdn.net/weixin_44088274/article/details/143004298 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器&…

php生成PDF文件(FPDF)

FPDF即“Free PDF”&#xff0c;FPDF类库提供了基本的PDF创建功能&#xff0c;其源代码和使用权是免费的。 PDF格式文档优势 通用&#xff1a;PDF文档在UNIX和Windows系统均可正常使用。 安全&#xff1a;PDF文档可设置为只读模式&#xff0c;并且可以添加密码等保护措施。 美…

【PDF文件】默认被某种软件打开,如何进行修改?

当有时下载某种软件后&#xff0c;电脑中的PDF文件就默认由该种软件打开&#xff0c;每次需要右键选择打开方式才能选择需要的其他软件打开。如下图所示。 修改方法&#xff1a; &#xff08;1&#xff09;点击电脑的“设置”&#xff0c;选择应用 &#xff08;2&#xff09;…

深入浅出理解BLE AUDIO CSIS

CSIS是Coordinate Sets Identification service,翻译过来就是协调集识别服务。什么是协调集&#xff0c;可以理解为具有相同特征的一伙设备&#xff0c;最典型的就是左右两个蓝牙耳机是一个协调集&#xff0c;所以它们具有相同的协调集标志&#xff0c;但是具有相同协调集的设备…

disql 全量备份SQL脚本DM7/DM8

disql 全量备份SQL脚本DM7/DM8 环境介绍1 全量备份前准备工作2 全量备份2.1 cd 到数据库bin 目录,并编辑文件2.2 编写数据库全量备份SQL 脚本2.3 执行编写的sql脚本2.4 编写Linux定时任务 , 每月执行全量备份 3 备份还原4 增量备份配置5 更多达梦数据库学习使用列表 环境介绍 …

CTA-GAN:基于生成对抗网络对颈动脉和主动脉的非增强CT影像进行血管增强

写在前面 目前只分析了文章的大体内容和我个人认为的比较重要的细节&#xff0c;代码实现还没仔细看&#xff0c;后续有时间会补充代码细节部分。 文章地址&#xff1a;Generative Adversarial Network-based Noncontrast CT Angiography for Aorta and Carotid Arteries 代…

【C++】STL容器-string常用接口

1.string类的优势及重要性&#xff08;部分&#xff09; C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&…

【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例

目录 一 内容摘要二 前言三 状态模式的必要性3.1 非状态模式的角色控制3.2 简易状态模式的角色控制3.3 状态模式3.3.1 IState3.3.2 IdleState3.3.3 RunState3.3.4 JumpState3.3.5 PlayerController_ComplexStateMode3.3.6 注意事项 3.4 SMB 四 基于SMB的角色控制4.1 项目实战案…

Java | Leetcode Java题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution {Random rand;List<Integer> arr;int[][] rects;public Solution(int[][] rects) {rand new Random();arr new ArrayList<Integer>();arr.add(0);this.rects rects;for (int[] rect : rects) {int a rect[0…

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦

背景 接上一篇&#xff0c;【大模型问答测试】大模型问答测试脚本实现&#xff08;第一版&#xff09;。 在实现自动化的时候&#xff0c;原先把很多方法与request请求写在一块了&#xff0c;趁着目前实现接口数量较少&#xff0c;决定对代码进行解耦&#xff0c;并且清晰目录…

《梦里花落知多少》凄美地,如同散落的花

《梦里花落知多少》凄美地&#xff0c;如同散落的花 三毛&#xff08;1943/3/26~1991/01/04&#xff09;&#xff0c;本名陈平&#xff0c;当代女作家&#xff0c;旅行家。著有《雨季不再来》《撒哈拉的故事》《哭泣的骆驼》《稻草人手记》《温柔的夜》《梦里花落知多少》等作品…

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException 异常信息&#xff1a; Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /xxxdir is exceeded: quota10000 file count15001N…

代码随想录-哈希表-有效的字母异位词

思路 哈希表的三种方式:数组、set、map 本题采用数组形式的哈希表来解决 三个注意事项: ①数组哈希表定义&#xff0c;包括思路和原始大小 ②Java中字符串的某个字符访问方式&#xff0c;字符串长度的方法 ③for-each循环的书写方式 代码 class Solution {public boole…

Python 爬虫下载图片

使用免费的代理ip进行网络请求,降低了反爬机制的触发率。加入自动发送邮件的功能,在代码运行出错的时候可以及时收到提醒消息。 主程序代码: import requests import os import time from lxml import etree from bs4 import BeautifulSoup import random # 自定义模块,发…