如何从freemarker设置struts param标签的值

时间:2016-03-03 16:04:48

标签: java struts2 freemarker

我在@s.param代码中设置@s.a代码的值时遇到问题。

我正在使用表格:

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

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

我也尝试过:

  • value=$someThing
  • value=${someThing}
  • value="someThing"
  • value="${someThing}"

各种形式似乎在某些情况下有效,但在其他情况下却没有,我只是无法弄清楚。

1 个答案:

答案 0 :(得分:0)

我认为你可能正在经历freemarker和struts之间3种不同陷阱之间的互动:

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

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

如果您使用value=someThing表单,那么 freemarker 将评估someThing。如果您的操作使用getSomeThing()方法返回"anotherThing",则会将"anotherThing"发送给struts。并且struts将评估该字符串并尝试在您的操作上查找getAnotherThing(),并且可能会失败。你可以说,&#34;好吧,我永远不会让freemarker评估我给value的字符串,并且总是让struts进行评估。&#34;但是:

第二次,您在freemarker中本地创建的任何变量都不会被struts看到。因此,如果someThing不是您的操作的属性,而是在评估模板时由freemarker创建(比如循环变量),那么struts将无法看到它并且如果您可能会失败使用表格value="someThing"

第三次,让事情更加混乱,数字类型(以及可能的其他)在freemarker中进行评估并传递给struts时工作得很好,而字符串则没有(正如我们在第一个问题。因此,如果someThing是数字类型,则以下内容将起作用:

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

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

结论

那么您应该使用什么形式来确保所有类型(String和数字)以及本地定义和基于行为的变量与@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等数字类型的内容,以确保您不会在其中添加逗号。