Spring 3 MVC文档声明选项标签可以像这样呈现:
<tr>
<td>Country:</td>
<td>
<form:select path="country">
<form:options items="${countryList}" itemValue="code" itemLabel="name"/>
</form:select>
</td>
</tr>
我在Spring MVC中使用FreeMarker,因此我将其解释为:
<tr>
<td>Place:</td>
<td>
<@form.select path="place">
<@form.options items="${places}" itemValue="id" itemLabel="name"/>
</@form.select>
</td>
</tr>
当我点击页面时,我得到以下异常:
freemarker.core.NonStringException: Error on line 40, column 73 in event.ftl
Expecting a string, date or number here, Expression places is instead a freemarker.template.SimpleSequence
我应该在FreeMarker模板中使用什么代替$ {places}以便上述工作?
感谢。
答案 0 :(得分:2)
我一直在寻找完全相同的东西。我不知道为什么Spring没有包含在Spring的Freemarker宏库中,但幸运的是它很容易实现:最佳实践是启动自己的宏库(比如说mylib.ftl
)并放入宏有:
<#macro selectOptions path options key value>
<@spring.bind path/>
<select id="${spring.status.expression}" name="${spring.status.expression}">
<#list options as option>
<option value="${option[key]?html}"<@spring.checkSelected option[key]/>>${option[value]?html}</option>
</#list>
</select>
</#macro>
然后,您可以在Freemarker模板中使用新的宏,如下所示:
<#import "/mylib.ftl" as mylib />
...
<@mylib.selectOptions "country" countryList "code" "name" />
HTH
答案 1 :(得分:1)
您可以尝试以下方法(未亲自测试)
<@form.select path="place">
<#list Request.places as place>
<@form.option value="${place}" label="name" />
</#list>
</@form.select>
希望这有帮助!
答案 2 :(得分:1)
有点奇怪,但它确实有效。
所以你会有
<@form.select path="place">
<@form.options items=places itemLabel="name"/>
</@form.select>