5

这应该是非常基本的,但我在网上找不到任何关于它的东西,只是我似乎无法组合在一起的零碎..

我们将 Spring MVC 与 freemarker 一起使用。现在我想向我的页面添加一个表单,该表单允许我从预定义列表中选择一个值(需要在后端访问数据库)。

我的控制器:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ModelAndView get(@PathVariable Integer id) {

    // stuff..
    ModelAndView mav = new ModelAndView();

    mav.addObject("targetObject", new TargetObject());
    mav.addObject("options", Arrays.asList("a", "b", "c"));
    mav.setViewName("someview");

    return mav;
}

我找到了 freemarkers spring 支持spring.ftl,看来我应该使用<@spring.formSingleSelect>我尝试过的方法:

someView.ftl:

<#import "../spring.ftl" as spring />

<form action="somePath" method="POST">
    <@spring.formSingleSelect "targetObject.type", "options", " " />
    <input type="submit" value="submit"/>
</form>

所以 targetObject.type 似乎是由宏自动绑定的。

但是如何将我的选项放入 freemarker 序列中,以便宏可以创建选项?

现在我得到:

Expected collection or sequence. options evaluated instead to freemarker.template.SimpleScalar on line 227, column 20 in spring.ftl.
The problematic instruction:
----------
==> list options as value [on line 227, column 13 in spring.ftl]
 in user-directive spring.formSingleSelect [on line 53, column 9 in productBase/show.ftl]
----------

我也试过:

<@spring.bind "${options}" />

以及更多类似的事情,但没有成功:

freemarker.core.NonStringException: Error on line 48, column 18 in someView.ftl
Expecting a string, date or number here, Expression options is instead a freemarker.template.SimpleSequence

谢谢你的帮助!

4

2 回答 2

8

经过多次改写和重新思考,我终于找到了解决方案:

第一的

显然我需要一颗豆子来决定我的选择

第二

这些选项需要初始化为一个字符串列表,并由 Spring MVC 提供给页面:

public ModelAndView get() {

    // ...
    ModelAndView mav = new ModelAndView();
    List<String> options = Arrays.asList(getOptionsFromDatabaseAndConvertToStringList());
    mav.addObject("options",options );
    mav.setViewName("someview");

    return mav;
}

第三

options现在需要在 freemarker 模板中绑定,然后可以像任何其他 freemarker 变量一样访问(即没有引号):

<@spring.bind "options" />

<form action="whatever" method="POST">
    <@spring.formSingleSelect "targetBean.choice", options, " " />
    <input type="submit" value="submit"/>
</form>
于 2012-07-11T14:42:04.947 回答
1

根据 formSingleSelect 的文档:

@param options a map (value=label) of all the available options

我认为您最好的选择是提供一个地图,其中的值作为键,标签作为地图值。否则,freemarker 可能会尝试为您进行包装,而您的控制权较少。

我刚刚验证过:如果您提供自己的地图,一切都很好。

<spring.formSingleSelect "target.property" referenceToYourMapProvidedInController ""/>
于 2014-05-14T12:15:00.780 回答