下拉框 - 从 Spring MVC 模型/上下文到使用 freemarker 形成

Posted

技术标签:

【中文标题】下拉框 - 从 Spring MVC 模型/上下文到使用 freemarker 形成【英文标题】:Dropdown box - from Spring MVC model / context to form using freemarker 【发布时间】:2012-07-11 02:55:09 【问题描述】:

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

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

我的控制器:

@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

感谢您的帮助!

【问题讨论】:

您唯一需要做的就是使用选项而不是“选项”。 【参考方案1】:

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

第一

显然我需要一个 bean 来控制我的选择

第二

options需要初始化为String列表,由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 变量一样访问(即 NO 引号):

<@spring.bind "options" />

<form action="whatever" method="POST">
    <@spring.formSingleSelect "targetBean.choice", options, " " />
    <input type="submit" value="submit"/>
</form>

【讨论】:

我想先说声谢谢,但字符串列表不会限制我创建包含 id 和值的下拉列表的能力。例如,我有一个显示 foo、boo 和 hoo 的列表,它们的 ID 分别是 f、b 和 h,我不能将它们都放在我的列表中? formSingleSelect 也支持地图。事实上,我认为如果你只传递一个列表,它将创建一个键/值对,其中键 == 值。我认为发送给控制器的选择永远是关键。查看宏定义:svn.apache.org/repos/asf/qpid/tags/pre-M1/java/java/management/…【参考方案2】:

根据 formSingleSelect 的文档:

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

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

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

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

【讨论】:

我什至建议在你的控制器类中使用 LinkedHashMap,这样你就可以保证显示顺序。

以上是关于下拉框 - 从 Spring MVC 模型/上下文到使用 freemarker 形成的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc-来自数据库的下拉框选项

csharp 字符串属性允许使用下拉框和MVC模型验证

java spring MVC 用poi做Excel导入碰到一个问题,求大神指教,有关下拉框的问题

.NET MVC中给下拉框填充数据

HTTP 状态 405 - 不支持请求方法“POST”(Spring MVC)

从 MVC 4 的数据库中填充 Select2 下拉框