在 Freemarker 宏中模拟空参数

2023-11-23

我正在使用 Freemarker 构建一个网站,并开始大量使用宏。我知道在 Freemarker 2.3 中,将 null 值作为参数传递到宏中相当于根本不传递参数,因此我创建了一个名为“null”的全局变量来模拟宏中的 null 检查:

<#assign null="NUL" />

现在在我的宏中我可以这样做:

<#macro doSomething param1=null>
  <#if param1 != null>
    <div>WIN!</div>
  </#if>
</#macro>

如果我想传递一个不是标量的参数,就会出现问题。例如,将列表(在 Freemarker 中是 SimpleSequence)传递给宏并检查我的 null 关键字会产生错误:

freemarker.template.TemplateException: 唯一合法的比较是在 两个数字、两个字符串或两个 日期。左手操作数是 freemarker.template.SimpleSequence 右手操作数是 freemarker.template.SimpleScalar

我查看了 freemarker 代码,发现了问题(ComparisonExpression.isTrue()):

if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) { 
  ...
}
else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
  ...
}
else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
  ...
}
else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
  ...
}
// Here we handle compatibility issues
else if(env.isClassicCompatible()) {
  ...
}
else {
  throw new TemplateException("The only legal comparisons...", env);
}

所以我能想到的唯一解决方案是将 isClassicCompatible 设置为 true,我认为这会在两个对象上调用 toString() 并比较结果。但是,文档特别指出任何依赖于旧功能的内容都应该重写。

我的问题是,是否有一个不依赖已弃用功能的解决方案?


The null引用是 FreeMarker 中设计的一个错误。由于您提到的原因,定义自定义空值(它是一个字符串)并不是一个好主意。应改用以下结构:

  • 宏和函数参数可以有默认值,因此调用者可以省略它们
  • 检查变量是否是null,你应该使用??操作员:<#if (name??)>
  • 当您使用一个变量时,可以null,你应该使用!运算符指定默认值:name!"No name"
  • 要检查序列(或字符串)是否为空,请使用?has_content内置:<#if (names?has_content)>

您可以在宏中指定一个空序列作为默认参数值,并简单地测试它是否为空。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Freemarker 宏中模拟空参数 的相关文章

  • freemarker大于,小于 gt,lt 的用法

    freemarker里面不能包含 gt lt 所以要用到大于和小于 就要用gt lt gt是大于 lt是小于 代码如下 lt if content length gt 100 gt content 0 100 lt else gt cont
  • 异常-----freemarker.core.ParseException: Unexpected end of file reached

    freemarker自定义标签 假如你现在还在为自己的技术担忧 xff0c 假如你现在想提升自己的工资 xff0c 假如你想在职场上获得更多的话语权 xff0c 假如你想顺利的度过35岁这个魔咒 xff0c 假如你想体验BAT的工作环境 x
  • springmvc + freemarker +sitemesh

    这 都加起来 很难 网上没有解决方案 用了一天才把环境搭起来 记录如下 先把springmvc 在 web xml上的配置
  • FreeMarker在js中使用

    var checkedArray 初始化将测试集包含的用例存在数组里面 lt if beneficiaryVOs gt lt list beneficiaryVOs as item gt checkedArray push id item
  • spring.ftl

    lt ftl strip whitespace true gt lt spring ftl This file consists of a collection of FreeMarker macros aimed at easing so
  • Spring MVC FreeMarker模板引擎与动态页面静态化全解

    目录 一 FreeMarker简介 二 第一个FreeMark示例 2 1 新建一个Maven项目 2 2 添加依赖 2 3 添加存放模板的文件夹 2 4 添加模板 2 5 解析模板 2 6 运行结果 三 动态页面静态化 3 1 动态页面静
  • jsp、freemarker、velocity、thymeleaf页面方案分析

    1 概述 在java领域 表现层技术主要有三种 1 jsp 2 freemarker 3 velocity 4 thymeleaf 2 jsp 优点 1 功能强大 可以写java代码 2 支持jsp标签 jsp tag 3 支持表达式语言
  • FreeMarker由浅入深之一 FreeMarker简单介绍

    一 什么是FreeMarker FreeMarker是一个用Java语言编写的模板引擎 它基于模板来生成文本输出 所谓模板 就是一份已经写好了基本内容 有着固定格式的文档 其中空出或者用占位符标识的内容 由使用者来填充 不同的使用者给出的数
  • SpringMVC与Freemarker的集成以及多视图解析器配置

    一 Spring MVC视图解析器 视图解析器的工作流程大致是这样的 Controller的某个方法执行完成以后 返回一个视图 比如 listUser 视图解析器要做的工作就是找到某个对象 来完成视图的渲染 或者跳转到其他的逻辑视图 这里的
  • Freemarker 转义 freemarker

    我正在使用 freemarker 生成 freemarker 模板 但我需要一些方法来逃避 freemarker 标签 我该如何逃脱 lt list gt 标签或 expression 您还可以使用 expression 如果您发现 嵌套令
  • Freemarker 编码 - 用问号代替重音字符

    我正在尝试使用 Freemarker 打印重音字符 但在重音字符的位置 我只得到问号 我已经证实 以下陈述成立 UTF 8 Environment getCurrentEnvironment getConfiguration getDefa
  • 使用 Freemarker 解析 Spring MVC 中的视图 - 包括 jsp 页面

    使用 FreemarkerServlet 时 可以将 JSP 页面与 Freemarker 内容一起包含在内 但是 我在 Spring MVC 应用程序中使用 Freemarker 作为视图解析器 因此不使用 FreemarkerServl
  • Netsuite Advanced PDF/HTML 代码 ifelse 语句

    我需要一些帮助 以正确的方式格式化此代码 以便在 Netsuite 中实现项目 td lt if item units null gt Units lt else gt tranline units td 我希望 PDF 表单显示测量单位
  • Freemarker 压缩不带空格的 single_line

    似乎 正在用单个空格 替换换行符 而不是仅仅抑制它们 Example lt compress single line true gt First cell lt if something gt Second cell Third cell
  • 从 Struts2 应用程序中的 FreeMarker 获取模板文本

    我想使用 Freemarker 在 Struts2 应用程序中生成电子邮件 由于我也在使用 Freemarker 来实现我的观点 因此我想 重用 相同的配置 使用 Spring 做同样的事情已经有一个类似的问题 在 Spring 应用程序中
  • 无法读取 Freemarker 模板中的对象值

    我无法读取 Freemarker Templatet 中的 scala java 对象值 我尝试过这个 case class ScheduleEmail workOrderNo String name String woType Strin
  • freemarker跳过assertNotNull InvalidReferenceException

    我使用 freemarker 渲染对象列表 ul lt list publication as item gt li b item key b item value li ul 但有些项目的 item value null 会引发异常 fr
  • 使用 freemarker 重新定位光标

    我正在使用免费标记和java 我必须将结果输出到txt 文件中 假设我必须打印 3 列 A B C 在类似的模式中 所有三个属性均为字符串 条件是 如果引用 A 的字符串长度超过 3 则应在下一行打印 也就是说 如果长度为 8 则前 3 个
  • 访问 <#list> 中对象的属性

    Solution 我之前曾尝试向 LineItem 类添加访问器 例如 public String getItemNo return itemNo 并将 FTL 从 lineItem itemNo to lineItem getItemNo
  • FREEMARKER:避免转义 HTML 字符

    freemarker 输出有问题 assign optionsHTML list data as item assign optionsHTML optionsHTML

随机推荐

  • Rails CSRF 保护 + Angular.js:protect_from_forgery 让我在 POST 上注销

    If the protect from forgeryapplication controller 中提到了选项 然后我可以登录并执行任何 GET 请求 但在第一个 POST 请求时 Rails 会重置会话 从而使我退出 我转动了prote
  • 如何将多个 .net 程序集合并为一个程序集?

    我有一个包含大约 10 个程序集的 net 应用程序 如果将它们作为一个组件组合在一起 那就太好了 我该怎么做 我猜想类似于 Java 应用程序的 jar 文件 Try ILMerge NuGet包here
  • 如何使用 Cocoa 和 Python (PyObjC) 创建状态栏项目?

    我在 XCode 中创建了一个全新的项目 并在我的 AppDelegate py 文件中包含以下内容 from Foundation import from AppKit import class MyApplicationAppDeleg
  • 使用 POST 请求 golang 上传文件

    我是 golang 新手 我正在尝试编写一个函数 为我正在编写的机器人上传带有发布请求的文件到电报 我尝试过使用这段代码 但我从电报中得到的错误是Bad Request there is no photo in the request 我在
  • OpenCV:从USB摄像头捕获的黑色图像

    我正在尝试使用 opencv 从 USB 摄像头捕获图像帧 然而我总是得到一个黑框 我已经阅读了很多有关此问题的帖子并尝试了所有建议 但对我来说没有任何作用 我开始使用这里讨论的代码 http opencv users 1802565 n2
  • 在 LinearLayout 中设置 textview 的宽度

    我正在使用列表视图的标题 ListView 标题有三列 说a b c 我使用两个 LinearLayouts 来设计 ListView 标题 如下所示
  • 新渲染元素的动画,但页面加载时不动画

    我订阅了 Firebase 实时数据库 这样当我向它提交某些内容时 它会立即在视图中呈现 而不需要 jQuery 或 ajax 我想对这些元素的渲染进行动画处理 这样当一个新元素添加到 DOM 时 它的div s background co
  • Swift 中的十六进制/二进制字符串转换

    Python 有两个非常有用的库方法 binascii a2b hex keyStr 和 binascii hexlify keyBytes 我在 Swift 中一直在努力解决它们 Swift 中有什么现成的东西吗 如果没有 又该如何实施呢
  • React类中的成员变量通过引用“共享”

    当我创建一个反应类的多个实例 通过在同一个类上使用 React createElement 时 一些成员变量在实例之间共享 数组和对象是共享的 字符串和布尔值等不是共享的 对我来说 这感觉可怕 可怕 错误 这是一个错误还是有其他方法可以做我
  • java中如何输入BigInteger类型

    当我尝试获取 Integer 类型的输入时 我只需要做下面的代码 Scanner sc new Scanner System in int N sc nextInt 但当涉及到 BigInteger 时 我不知道该怎么办 我该如何读取用户的
  • 表单不响应 KeyDown 事件

    我已经在 Windows 窗体项目上工作了一段时间 并且决定尝试使用键盘快捷键 经过一番阅读后 我认为我必须编写一个事件处理程序并将其绑定到表单的 KeyDown 事件 private void Form1 KeyDown object s
  • 在 Android 中仅运行一个自定义应用程序,阻止其他任何应用程序运行

    是否有可能让 Android 只能运行一个应用程序 看来制作定制 ROM 可能是一个选择 有人能给我指出正确的方向吗 对此已有许多答案和问题 基本上你有以下选择 创建您自己的 rom 创建您自己的启动器应用程序 最好的解决方案肯定是1 但它
  • Django Rest Framework 每个视图的自定义权限

    我想在 Django Rest Framework 中基于视图 方法 用户权限创建权限 有没有一种方法可以实现这一目标 而无需手动编写每个权限并检查用户所在组的权限 另外 我面临的另一个问题是权限对象与某个模型相关联 由于我有影响不同模型的
  • UIAppearance 删除 UIPopoverController 的自定义导航栏背景

    我正在整合 iOS 5 的 UIAppearance 功能 为我的通用应用程序提供独特的主题 目前 我已经在我的应用程序委托中实现了一些代码来为应用程序提供自定义导航栏 UIImage navBarImage UIImage imageNa
  • Git:所有分支的默认“无提交”合并行为?

    我希望 git merge 默认情况下不提交 即 我希望默认情况下 no commit 行为 无论目标分支如何 我知道特定分支的 git config Branch master mergeoptions 并且我知道默认情况下禁用所有分支上
  • 在 Django 中发送电子邮件的连接超时问题

    我读自 http www packtpub com article friends via email social web application django 1 0 并按照以下步骤操作 gt 并改变我的 设置 py SITE HOST
  • 在anaconda3中安装openCV - Python.h:没有这样的文件或目录

    我正在尝试为我的 anaconda3 安装构建 opencv 3 1 0 但我的构建失败 94 Building CXX object modules python3 CMakeFiles opencv python3 dir src2 c
  • 使用 CLI 清除客户端缓存

    我们正在使用aurelia cli 任务包括 build json build ts process css ts process markup ts process sass ts run json run ts test json te
  • Scrapy PyInstaller OSError:无法获取源代码/twisted.internet.defer._DefGen_Return

    我正在尝试使用 PyInstaller 将一个非常简单的 Scrapy 蜘蛛发布为 EXE 文件 我已经搜索并阅读了我能找到的所有内容 但我仍然无法弄清楚出了什么问题 我怎样才能解决这个问题 如果我将yield更改为return 它不会给我
  • 在 Freemarker 宏中模拟空参数

    我正在使用 Freemarker 构建一个网站 并开始大量使用宏 我知道在 Freemarker 2 3 中 将 null 值作为参数传递到宏中相当于根本不传递参数 因此我创建了一个名为 null 的全局变量来模拟宏中的 null 检查 l