下拉框 - 从Spring MVC的模型/背景下形成的freemarker使用(Dropdown b

2019-06-26 05:15发布

这应该是很基本的,但我无法找到关于它的网站什么,只是点点滴滴,似乎我不能够结合在一起..

我们在使用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.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的SeeQuence将使得宏可以创建选项?

现在,我得到:

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

谢谢你的帮助!

Answer 1:

多改写和重新思考后,我终于发现了解决方案:

第一

我需要有一个bean显然握住我的选择

第二

该选项需要被初始化为一个字符串列表,并通过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>


Answer 2:

按照文档的formSingleSelect:

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

我认为最好的办法是为用户提供值作为键和标签作为映射值的地图。 否则的freemarker可能会尝试做包装你,你有较少的控制。

我刚才已经验证:若你提供你自己的地图,一切都只是罚款。

<spring.formSingleSelect "target.property" referenceToYourMapProvidedInController ""/>


文章来源: Dropdown box - from Spring MVC model / context to form using freemarker