首先我要说的是,使用 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" />
如果我评论上面的行,一切都会正常。