freemarker

freemarker

Freemarker的基本语法及使用大全

freemarker的基本语法及入门基础

  1. 文本:直接输出的内容部分
  2. 注释:不会输出的内容,格式为<#-- 注释内容 -->
  3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}
  4. ftl指令:Freemarker指令,类似于HTML标记。
    • 内建指令:开始标签:<#directivename parameter> 结束标签:</#directivename> 空标签:<#directivename parameter/>
    • 自定义指令:开始标签:<@directivename parameter> 结束标签:</@directivename> 空标签:<@directivename parameter/>

字符串

字符串输出 ${param}

字符串输出-首字母大写 ${param?uncap_first}

list

循环遍历

可以使用Freemarker提供的<#list>指令来遍历对象集合。具体实现方式如下:

<#list objectList as item>${item.property1}, ${item.property2}
</#list>

其中,objectList表示你要遍历的对象集合名称,item则是集合中的每一个对象,你可以通过${item.property}来获取每个对象的属性值。循环体内的内容则是你需要对每个对象执行的操作。

例如,对一个用户列表进行遍历,代码实现如下:

<#list userList as user><li>${user.name}(${user.age}岁)</li>
</#list>

这段代码可以将用户列表中每个用户的姓名和年龄输出到一个无序列表中。

处理最后一次循环遍历

在 FreeMarker 中,可以使用 list 指令结合内置变量 index 和内置变量 size 来判断当前循环是否为最后一次循环。下面是一个示例程序,演示如何在 FreeMarker 中使用 list 指令和 if 指令判断是否为最后一次循环:

<#list items as item><#if item_index + 1 == items?size>The last item is: ${item}</#if>
</#list>

在上述示例程序中,item_index 表示当前循环的迭代次数。items?size 表示列表的元素个数。我们使用 item_index + 1 判断当前循环是否为列表的最后一次循环,如果是,则输出 “The last item is: item”。

除了使用 if 指令来判断最后一次循环,还可以使用 ifelse 指令来分别处理最后一次和非最后一次的情况。下面是一个使用 ifelse 指令的示例程序:

<#list items as item><#if item_index + 1 == items?size>The last item is: ${item}<#else>${item},</#if>
</#list>

在上述示例程序中,如果当前循环不是最后一次,输出当前元素和逗号;否则输出最后一个元素,不输出逗号。这样可以使输出的结果更加符合语言的语法规范。

总之,在 FreeMarker 中,使用 list 指令结合内置变量 index 和内置变量 size 来判断当前循环是否为最后一次循环是非常常见的操作。可以根据实际情况使用相应的语法。

判断包含x值

可以使用Freemarker的内建函数来判断一个List是否包含某个值。以下是一个示例:

<#assign myList = ["apple", "banana", "orange"]>
<#if myList?seq_contains("banana")>List contains "banana"
<#else>List does not contain "banana"
</#if>

在上面的示例中,我们首先声明了一个List myList,包含了三个元素。然后使用内建函数?seq_contains来判断List是否包含了值"banana"。如果包含,则输出"List contains ‘banana’“,否则输出"List does not contain ‘banana’”。

if

在 FreeMarker 中,可以使用 if 指令来实现条件判断。if 指令的语法格式如下所示:

<#if condition><!-- 如果 condition 为 true 执行此部分代码 -->
<#elseif condition2><!-- 如果 condition2 为 true 执行此部分代码 -->
<#else><!-- 如果所有条件都不为 true 执行此部分代码 -->
</#if>

在 FreeMarker 中,可以使用一系列运算符来组合条件表达式,例如:==、!=、<、>、<=、>=、&&、|| 等等。下面是一个示例程序,演示如何在 FreeMarker 中使用 if 指令实现条件判断。

<#if amount > 500><h1>You are a VIP customer!</h1>
<#elseif amount > 100><p>You are a premium customer.</p>
<#else><p>You are a regular customer.</p>
</#if>

在上述示例程序中,如果 amount 大于 500,将会显示 “You are a VIP customer!”;如果 amount 大于 100 小于等于 500,将会显示 “You are a premium customer.”;否则将会显示 “You are a regular customer.”。

除了简单的数值比较,我们也可以使用变量、表达式和函数等来构建更加复杂的条件表达式。例如,下面的示例程序演示了如何在 FreeMarker 中使用 if 指令结合函数和变量实现更加灵活的条件判断:

<#if user ? has_content && user.getAge() > 18><h1>Welcome, ${user.getName()}!</h1>
<#else><p>Sorry, you are not eligible to access this page.</p>
</#if>

在上述示例程序中,判断是否有 user 变量,并且该变量的年龄大于 18 岁,如果条件成立,则输出欢迎信息,否则输出提示信息。

总之,在 FreeMarker 中,if 指令是非常常用且灵活的指令,可以帮助我们方便地实现不同的条件判断。

if 字符串判断

在 FreeMarker 中,字符串的相等判断可以使用 ==equals 方法进行比较。下面是一个示例程序,演示如何在 FreeMarker 中使用 if 指令实现字符串的相等判断。

<#if name == "John"><p>Hello John!</p>
<#else><p>Hello stranger!</p>
</#if>

在上述示例程序中,如果 name 的值等于 John,将会显示 “Hello John!”;否则将会显示 “Hello stranger!”。

除了 ==,我们也可以使用 equals 方法进行字符串的相等比较。下面是一个示例程序,演示如何使用 if 指令结合 equals 方法实现字符串的相等判断:

<#if name?has_content && name.equals("John")><p>Hello John!</p>
<#else><p>Hello stranger!</p>
</#if>

在上述示例程序中,name.equals("John") 表示 name 的值是否等于 John。如果成立,则输出 “Hello John!”,否则输出 “Hello stranger!”。

总之,在 FreeMarker 中,使用 if 指令进行字符串的相等比较非常常见,可以帮助我们方便地根据不同的条件来展示内容或执行操作。

在 FreeMarker 中,可以使用 == 操作符或 equals() 内置函数进行等值判断。但是在使用 equals() 函数时,需要注意调用方法的对象是否存在或是否为 null,否则会出现 null pointer exception 异常。

使用 == 操作符进行等值判断不会引起空指针异常,因此可以避免上述异常信息的出现。

if 非空判断

在 FreeMarker 中,可以使用 if 指令结合 FreeMarker 内置函数来进行非空判断。下面是一些常见的方法:

  1. 使用 if 指令和 exists 内置函数进行非空判断
<#if str?exists><!-- 处理非空逻辑 -->
</#if>

在上述代码中,我们使用 str?exists 表达式来判断 str 变量是否存在且非空。只有当该条件为真时,才会执行处理非空逻辑。

  1. 使用 if 指令和 has_content 内置函数进行非空判断
<#if str?has_content><!-- 处理非空逻辑 -->
</#if>

在上述代码中,我们使用 str?has_content 表达式来判断 str 变量是否存在且非空。如果该变量存在,且其值不是空字符串、空列表、空 Map 或空序列,则该表达式为真,只有当该条件为真时,才会执行处理非空逻辑。

总之,以上提及的两种方法是 FreeMarker 中比较常用的非空判断方法。可以根据具体情况选择使用哪种方式。在使用时,应根据实际情况进行优化,避免不必要的空值判断。

空格标签

在 FreeMarker 中,可以使用空格标签来忽略空格和换行符之间的产生的空格。这样可以让模板代码更加美观易读,或者避免在输出 HTML 标签时产生不必要的空格和换行符,从而影响到页面的显示效果。

下面是一些常用的空格标签:

  1. <#t> 空格标签

<#t> 空格标签是一个简单的标签,它会将前一个标签的输出的文本和后一个标签的输出的文本之间产生的空格忽略掉。它的语法格式如下:

<前一个标签><#t><后一个标签>

例如,可以使用 <#t> 标签来避免在输出 HTML 标签时产生不必要的空格和换行符。下面是一个示例代码,演示如何在 FreeMarker 中使用 <#t> 空格标签:

<div><span><#t></span><span>Some text</span><span><#t></span>
</div>

在上述示例代码中,我们使用了 <#t> 空格标签来忽略 span 标签之间产生的空格,从而输出更加美观的 HTML 代码。

  1. <@noparse> 空格标签

<@noparse> 空格标签是一个高级的标签,它可以将标签之间的文本全部作为字符串处理,从而避免 FreeMarker 渲染引擎对它进行处理。它的语法格式如下:

<@noparse><标签></@noparse>

例如,可以使用 <@noparse> 标签来输出 Raw HTML,防止 FreeMarker 引擎将 HTML 代码进行解析。下面是一个示例代码,演示如何在 FreeMarker 中使用 <@noparse> 空格标签:

<@noparse><input type="text" placeholder="Type something"><@/noparse>

在上述示例代码中,我们使用了 <@noparse> 空格标签来输出 Raw HTML,保证输入框的 HTML 代码不会被 FreeMarker 渲染引擎进行解析。

总之,以上提及的两种空格标签在 FreeMarker 中都有广泛的应用。它们可以帮助模板代码更加美观易读,或避免在输出 HTML 标签时产生不必要的空格和换行符,从而影响到页面的显示效果。

demo

public class FreeMarkerConsoleEx {public static void main(String[] args) throws IOException,TemplateException {Configuration cfg = new Configuration(new Version("2.3.23"));cfg.setClassForTemplateLoading(FreeMarkerConsoleEx.class, "/");cfg.setDefaultEncoding("UTF-8");Template template = cfg.getTemplate("test.ftl");Map<String, Object> templateData = new HashMap<>();templateData.put("msg", "Today is a beautiful day");try (StringWriter out = new StringWriter()) {template.process(templateData, out);System.out.println(out.getBuffer().toString());out.flush();}}
}

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

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

相关文章

RHCE——十三、Shell自动化运维编程基础

Shell 一、为什么学习和使用Shell编程二、Shell是什么1、shell起源2、查看当前系统支持的shell3、查看当前系统默认shell4、Shell 概念 三、Shell 程序设计语言1、Shell 也是一种脚本语言2、用途 四、如何学好shell1、熟练掌握shell编程基础知识2、建议 五、Shell脚本的基本元素…

docker-compose安装opengauss数据库

文章目录 1. docker-compose.yaml2. 部署3. 卸载4. 连接 1. docker-compose.yaml mkdir -p /root/i/docker-compose/opengauss && cd /root/i/docker-compose/opengausscat <<EOF> /root/i/docker-compose/opengauss/docker-compose.yaml version: 3 service…

计算机竞赛 基于机器视觉的停车位识别检测

简介 你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里&#xff0c;那是不是很爽&#xff1f;事实证明&#xff0c;基于深度学习和OpenCV解决这个问题相对容易&#xff0c;只需获取停车场的实时视频即可。 该项目较为新颖&#xf…

MongoDB实验——在MongoDB集合中查找文档

在MongoDB集合中查找文档 一、实验目的二、实验原理三、实验步骤1.启动MongoDB数据库、启动MongoDB Shell客户端2.数据准备-->person.json3.指定返回的键4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch&#xff08;匹配数组&#xff09;5.OR 查询 $or6.Null、$exists7.…

Oracle中序列删除的正确语句(oracle删除序列语句)

Oracle中序列删除的正确语句 Oracle 是由世界上最大的软件公司 Oracle Corporation 提供的关系型数据库管理系统&#xff0c;拥有广泛的应用和功能&#xff0c;如存储过程、触发器、视图、序列以及其他的复杂的特性&#xff0c;能够满足丰富的业务需求。本文主要研究Oracle中序…

Java进阶篇--HttpClient工具类

目录 什么是HttpClient HttpClient的注意事项 HttpClient的使用流程 HttpClient常用方法 HttpClient工具类 添加依赖 什么是HttpClient HttpClient 是 Apache HttpComponents 的一个子项目&#xff0c;旨在提供高效的、最新的、功能丰富的 HTTP 协议客户端编程工具包。它…

【JavaScript精通之道】掌握数据遍历:解锁现代化遍历方法,提升开发效率!

​ &#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4da; 前言 &#x1f4d8; 1. reduce方法 &#x1f4d8; 2. forEach方法 &#x1f4d8; 3. map方法…

浏览器连不上 Flink WebUI 8081 端口

安装 flink-1.17.0 后&#xff0c;start-cluster.sh 启动&#xff0c;发现浏览器连不上 Flink WebUI 的8081端口。 问题排查&#xff1a; command R&#xff0c;输入cmd&#xff0c;检查宿主机能否ping通虚拟机&#xff0c;发现能ping通。 检查是否有flink以外的任务占用8081…

Centos替代方案分析(Ubuntu篇)

最受欢迎Linux操作系统 在上百个Linux版本中&#xff0c;Ubuntu和CentOS是最受欢迎的开源操作系统&#xff0c;以其稳定性、高性能和广泛的社区支持而闻名。Ubuntu以友好的用户界面和多样的应用程序生态系统吸引着广大用户&#xff0c;适用于桌面和服务器。而CentOS则因其与RH…

一体化数据安全平台 uDSP 获“金鼎奖”优秀金融科技解决方案奖

近日&#xff0c;2023 年中国国际金融展“金鼎奖”评选结果揭晓&#xff0c;原点安全打造的“一体化数据安全平台 uDSP”产品获评“金鼎奖”优秀金融科技解决方案奖。该产品目前已广泛应用于银行业、保险企业、证券、医疗、互联网、政务、在线教育等诸多领域。此次获奖再次印证…

C++ STL unordered_map容器使用教程

文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历迭代器常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对&#xff0c;数据类型为 …

如何避免重复消费消息

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【⑯MySQL | 存储过程与函数】概述 | 创建 | 调用 | 查看 | 修改 | 删除 | 争议

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL存储过程与函数概述 | 创建 | 调用 | 查看 | 修改 | 删除 | 争议的分享✨ 目录 前言1. 存储过程概述2. 创建存储过程3. 调用存储过程4. 存储函数的使用5. 存储过程和函数的查看、修改、删除6. 关于存储过程使用…

这个 AI 机器人会怼人,它是怎么做到的?

近期&#xff0c;机器人“Ameca”接入了 Stable Diffusion&#xff0c;它一边与旁边的人类工程师谈笑风生&#xff0c;一边熟练地用马克笔在白板上画出一只简笔的猫&#xff0c;最后还在白板右下角签名。 当 Ameca 询问工程师是否对它的作品是否满意时&#xff0c;工程师回答“…

光流法相关论文-LK光流法,HS光流法,Farneback光流法,FlowNet: 端到端的深度光流估计, RAFT: 结构化的光流估计

目录 光流法 1. Lucas-Kanade光流法&#xff08;稀疏光流法&#xff09;&#xff1a; 2. Horn-Schunck光流法&#xff08;稠密光流法&#xff09;&#xff1a; 3. Farneback光流法&#xff1a; 4 FlowNet: 端到端的深度光流估计&#xff1a; 5. RAFT: 结构化的光流…

react中redux的详细使用以及持久化处理

一.redux使用 1.安装 npm i redux 例一&#xff1a; 2.创建redux文件夹&#xff0c;store.js文件 store.js文件 import {legacy_createStore as createStore,combineReducers}from "redux" // 每一块状态内容对应一个reducer文件 import {CollApsedReducer} fro…

基于空洞卷积DCNN与长短期时间记忆模型LSTM的dcnn-lstm的回归预测模型

周末的时候有时间鼓捣的一个小实践&#xff0c;主要就是做的多因子回归预测的任务&#xff0c;关于时序数据建模和回归预测建模我的专栏和系列博文里面已经有了非常详细的介绍了&#xff0c;这里就不再多加赘述了&#xff0c;这里主要是一个模型融合的实践&#xff0c;这里的数…

[论文笔记]DSSM

引言 这是DSSM论文的阅读笔记,后续会有一篇文章来复现它并在中文数据集上验证效果。 本文的标题翻译过来就是利用点击数据学习网页搜索中深层结构化语义模型,这篇论文被归类为信息检索,但也可以用来做文本匹配。 这是一篇经典的工作,在DSSM之前,通常使用传统机器学习的…

博客系统后台控制层接口编写

BlogColumnCon CrossOrigin RequestMapping("/back/blogColumn") RestController public class BlogColumnCon {Autowiredprivate BlogColumnService blogColumnService;/*** 新增** param blogColumn* return*/PostMapping("/add")public BaseResult add…

【自定义物体不受后处理(Volume)影响的组件_Custom Pass Volume】

自定义物体不受后处理影响 "Custom Pass Volume"1. **自定义渲染Custom Pass Volume组件:** 面板如下。2.具体设置如图3.在Frame Debugger视图下是这样的:4.在Frame Debugger带有Custom Pass Volume组件的渲染Pass已经改写成 AfterPostProcess5.记得添加Shader中的…