Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

2024-05-17

首先我要说的是,使用 Struts2 + Freemarker 真是太棒了。 然而有些事情让我发疯,因为我不明白为什么会发生这种情况。我在这里问是因为也许其他人有一个想法可以分享。

我有一个动作,有一个属性。 说

private String myText;

然后我有一个 setter 和一个 getter:

public void setMyText(String myText)
{
  this.myText = myText;
}

public String getMyText()
{
  if (myText == null)
    myText = "(empty)";

  return this.myText;
}

结果(在 struts.xml 中)是自由标记结果。 所以在我的 Freemarker 模板中有一行如下所示:

<p>The text is: ${myText}</p>

现在考虑我正在调用不带任何文本参数的操作:假设 url 是

http:localhost:8080/myapp/myaction

由于 getter 提供了默认值,因此当处理操作并将结果传递到我的模板时,该属性将设置为默认值;所以我得到(浏览器端的html)

<p>The text is: (empty)</p>

如果我用参数集调用我的操作(我的意思是用类似的东西:

http:localhost:8080/myapp/myaction?myText=hallo

)出了问题。 Freemarker 引发以下异常:

Exception occurred during processing request: For "${...}" content:
Expected a string or something automatically convertible to string
(number, date or boolean), but this has evaluated to a
sequence+extended_hash (String[] wrapped into f.e.b.ArrayModel)

似乎“myText”被找到两次...... 我究竟做错了什么?或者,至少,有没有人可以向我解释为什么会发生这种情况?

P.S.:确实找到了两次;以下是解决该问题的方法:

<#if myText?is_sequence>${myText[0]}<#else>${myText}</#if>

但在我看来,以这种方式包装每个变量似乎并不可行。

P.P.S.:进一步提示:在 freemarker 模板中,前几行调用了另一个操作。就像是:

<@s.action var="innerAction" name="getTable" namespace="/foo" />

如果我评论上面的行,一切都会正常。


The myText可以是来自 freemarker 上下文的变量,但如果您想使用操作属性

<p>The text is: ${action.myText}</p>

注意action访问操作属性不需要前缀。 A财产决议 https://struts.apache.org/core-developers/freemarker-support.html#property-resoloution解析 freemarker 变量时应用方法:

属性解析:

您的操作属性会自动解析 - 就像在 速度视图。

例如${name}将导致stack.findValue("name"), 哪个 一般会导致action.getName()正在被处决。

搜索过程用于解析变量,搜索 按顺序执行以下范围,直到找到值:

  • 自由标记变量
  • 价值堆栈
  • 请求属性
  • 会话属性
  • servlet 上下文属性

稍后您可以从上下文中读取哪些对象是可访问的。

上下文中的对象:

FreeMarker 视图中存在以下变量

  • req- 当前HttpServletRequest
  • res- 当前HttpServletResponse
  • stack- 当前OgnlValueStack
  • ognl - the OgnlTool实例 此类包含对任意对象执行 OGNL 表达式的有用方法,以及使用以下命令生成选择列表的方法 这<s:select>图案。 (即取名字list财产,一个listKey and listValue)
  • struts- 一个实例StrutsBeanWrapper
  • action- 当前的Struts动作
  • exception- 可选的Exception实例,如果视图是 JSP 异常或 Servlet 异常视图

该错误可能是由于从值堆栈中搜索并根据执行时堆栈的结构返回您不期望的内容而引起的。

向变量添加前缀以指出属性的确切位置应该可以修复在值堆栈中搜索时代码中的冗余。

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

Freemarker 和 Struts 2,有时它计算为序列+扩展哈希 的相关文章

  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐