【问题标题】:Spring MVC + FreeMarker: How to render option tag?Spring MVC + FreeMarker:如何渲染选项标签?
【发布时间】:2010-07-10 11:21:20
【问题描述】:

Spring 3 MVC 文档声明选项标签可以这样呈现:

<tr>
      <td>Country:</td>
      <td>
          <form:select path="country">
              <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
          </form:select>
      </td>
</tr>

我将 FreeMarker 与 Spring MVC 一起使用,因此我将其解释为:

<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} 以使上述方法有效?

谢谢。

【问题讨论】:

    标签: java spring-mvc freemarker


    【解决方案1】:

    我一直在寻找完全相同的东西。我不知道为什么它不包含在 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

    【讨论】:

      【解决方案2】:

      您可以尝试以下(未经个人测试)

      <@form.select path="place">
          <#list Request.places as place>
             <@form.option value="${place}" label="name" />
          </#list>
      </@form.select>
      

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        有点奇怪,但它有效。

        • 删除 ${"places"} 并将其直接用作地点
        • 移除 itemid,让 spring 为您处理

        这样你就有了

        <@form.select path="place">
           <@form.options items=places itemLabel="name"/>
        
        </@form.select>
        

        【讨论】:

          猜你喜欢
          • 2011-09-23
          • 2016-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多