我在@s.param
代码中设置@s.a
代码的值时遇到问题。
我正在使用表格:
<@s.a action="doit">
<@s.param name="thename" value=someThing/>
</@s.a>
它适用于某些参数,但只为其他参数生成空白值。
我也尝试过:
value=$someThing
value=${someThing}
value="someThing"
value="${someThing}"
各种形式似乎在某些情况下有效,但在其他情况下却没有,我只是无法弄清楚。
答案 0 :(得分:0)
我认为你可能正在经历freemarker和struts之间3种不同陷阱之间的互动:
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
等数字类型的内容,以确保您不会在其中添加逗号。