在 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 宏中模拟空参数 的相关文章

随机推荐

  • 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