如何从 freemarker 设置 struts 参数标记的值

Posted

技术标签:

【中文标题】如何从 freemarker 设置 struts 参数标记的值【英文标题】:How do I set the value of a struts param tag from freemarker 【发布时间】:2016-06-17 01:41:14 【问题描述】:

我无法在@s.a 标签内设置@s.param 标签的值。

我正在使用表单:

<@s.a action="doit"> <@s.param name="thename" value=someThing/> </@s.a>

它适用于某些参数,但只会为其他参数生成一个空白值。

我也试过了:

value=$someThing value=$someThing value="someThing" value="$someThing"

而且各种形式似乎在某些情况下有效,但在其他情况下却不行,我就是想不通。

【问题讨论】:

参考编辑历史:它不是 jsp,但 freemarker 不能用作格式化 SO、AFAIK 上的代码的语言。还有为什么你只需要按代码按钮或在每行添加4个前导空格时重新引入```来格式化代码? 不,freemarker 不能作为一种语言使用,这就是为什么我根本没有使用任何语言标签的原因。说它不是一种语言比根本不使用标签更错误。至于```,我可以问你“为什么在每行使用4个前导空格,而你只需要用三个反引号包围代码?”它们只是表示代码格式的两种不同方式,这就是我更喜欢的方式。 jsp 格式化标签不可见,但生成的颜色是可见的,而且效果比银色上的所有黑色都要好,恕我直言,但最后......谁在乎呢。但是,如果您更喜欢反引号(这不会触发 any 格式,因此您只能在不能或不想获得颜色时使用它,例如在这种情况下),一个就够了。 这与标签是否可见无关。我只是认为在不是时尝试将代码解析和着色为jsp是错误的。它甚至看起来不像真的支持jsp。 Google 的 prettify 库不支持 jsp,jsp 的标签页只是说它使用“默认”格式化程序。 【参考方案1】:

我认为您可能正在经历 freemarker 和 struts 之间的 3 个不同陷阱之间的交互:

freemarker vs struts 评估表达式 本地 freemarker 变量与 Action 类上的属性 String 与非String 变量(例如Long

首先,struts param 标签上的value 属性实际上是由struts 求值的。这意味着如果您使用value="someThing" 形式,freemarker 只会将"someThing" 传递给struts。然后,Struts 将评估该字符串并尝试在您的操作中查找getSomeThing()

如果您使用value=someThing 形式,那么freemarker 将评估someThing。如果您的操作有一个返回"anotherThing"getSomeThing() 方法,那么它将向struts 发送"anotherThing"。 struts 将评估该字符串并尝试在您的操作中查找getAnotherThing(),并且可能会失败。你可能会说,“好吧,我永远不会让 freemarker 评估我给 value 的字符串,而总是让 struts 来做评估。”然而:

第二,你在freemarker本地创建的任何变量对struts都是不可见的。因此,如果 someThing 不是您的操作的属性,而是由 freemarker 在评估模板时创建的(例如循环变量),那么 struts 将无法看到它,并且如果您使用表单 @ 可能会失败987654338@.

第三,更令人困惑的是,数字类型(可能还有其他类型)在 freemarker 中评估并传递给 struts 时工作得很好,而字符串则不行(正如我们在第一个问题中看到的那样)。因此,如果someThing 是数字类型,则以下内容将起作用:

<@s.a action="doit"> <@s.param name="thename" value=someThing/> </@s.a>

你会得到一个像/doit.action?thename=1234 这样的url,如果someThing 是一个字符串,它就不起作用,因为struts 会尝试评估someThing 评估的任何内容。

结论

那么您应该使用什么形式来确保所有类型(Strings 和数字)以及本地定义和基于操作的变量都可以与@s.param 一起使用?似乎您必须始终强制在 freemarker 中进行评估,然后将结果作为字符串文字传递给 struts。这样做的方法是:

<@s.a action="doit"> <@s.param name="thename" value="'$someThing'"/> </@s.a>

或者:

<@s.a action="doit"> <@s.param name="thename">$someThing</@s.param> </@s.a>

请注意,这意味着变量将由 freemarker 格式化,您可能需要像 ?c 这样的数字类型来确保您不会在其中得到逗号。

【讨论】:

以上是关于如何从 freemarker 设置 struts 参数标记的值的主要内容,如果未能解决你的问题,请参考以下文章

模板引擎:Velocity&FreeMarker(转)

Struts2 freemarker 配置

struts 集成freemarker 无法定义局部变量

如何从 Jive 中的 FTL 为 Java bean 设置值

使用 Struts+Freemarker 更改表单的输出

struts2中的freemarker配置