【发布时间】:2015-12-28 08:33:36
【问题描述】:
首先让我说,使用 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 结果。 所以在我的 Freemarker 模板中有如下一行:
<p>The text is: ${myText}</p>
现在考虑我在没有任何文本参数的情况下调用操作:假设 url 是
http:localhost:8080/myapp/myaction
由于getter提供了一个默认值,当action被处理并将结果传递给我的模板时,该属性被设置为默认值;所以我得到(浏览器端的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" />
如果我评论上面的行,一切正常。
【问题讨论】:
标签: java jsp struts2 freemarker