Spring MVC + FreeMarker:如何渲染选项标签?

发布于 2024-09-09 09:41:02 字数 949 浏览 1 评论 0原文

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

我应该使用什么来代替 ${places}在我的 FreeMarker 模板中,以便上面的工作正常吗?

谢谢。

The Spring 3 MVC docs state that option tags can be rendered like this:

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

I am using FreeMarker with Spring MVC, so I interpret this as:

<tr>
    <td>Place:</td>
    <td>
        <@form.select path="place">
            <@form.options items="${places}" itemValue="id" itemLabel="name"/>

        </@form.select>
    </td>
</tr>

When I hit the page I get the following exception:

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

What should I use instead of ${places} in my FreeMarker template so that the above works?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

因为看清所以看轻 2024-09-16 09:41:02

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

I was looking for exactly the same thing. I've no idea why this isn't included in Spring's Freemarker macro library, but fortunately enough it's quite easy to implement: Best practice would be to start your own macro library (say mylib.ftl for example) and put the macro there:

<#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>

You can then use your new macro in your Freemarker template like so:

<#import "/mylib.ftl" as mylib />
...
<@mylib.selectOptions "country" countryList "code" "name" />

HTH

纵山崖 2024-09-16 09:41:02

您可以尝试以下方法(未亲自测试)

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

希望这会有所帮助!

You could try the following (not tested personally)

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

Hope this helps!

醉南桥 2024-09-16 09:41:02

有点奇怪,但它有效。

  • 删除 ${"places"} 并直接使用它作为地方
  • 删除 itemid 并让 spring 为您处理它,

这样您就可以

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

</@form.select>

a little bit weird but it works.

  • remove ${"places"} and use it straigh as places
  • remove the itemid and let spring handle it for you

so you will have

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

</@form.select>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文