2012-07-11 83 views
4

這應該是非常基本的,但我無法在網絡上找到任何有關它的東西,只是零星的東西,我似乎不能合在一起。下拉框 - 從Spring MVC模型/上下文到表單使用freemarker

我們使用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序列,以便宏可以創建選項?

現在我得到:

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

我也試過:任何幫助

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 

感謝的:沿着這些線路,但沒有成功

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

和更多的東西!

+0

您唯一需要做的就是使用選項而不是「選項」。 – 2017-05-05 01:09:04

回答

7

經過大量的改寫和重新思考,我終於發現瞭解決方案:

首先

我需要有一個bean握住我的選擇顯然

的選項需要被初始化爲一個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> 
+1

我想先說謝謝,但不是字符串列表限制我創建一個id和值的下拉列表的能力。例如我有一個列表顯示foo,boo和hoo,他們的ID是f,b和h respectivley我不能讓他們都在我的列表中? – 2012-11-19 16:24:28

+3

formSingleSelect也支持地圖。實際上,我認爲如果你只是傳遞一個列表,它將創建一個鍵/值對,其中鍵==值。發送給控制器的選擇我認爲始終是關鍵。檢查宏定義:http://svn.apache.org/repos/asf/qpid/tags/pre-M1/java/java/management/core/lib/spring/spring.ftl – Pete 2012-11-20 07:18:08

0

按照文檔的formSingleSelect:

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

我認爲最好的方法是提供與價值觀作爲鍵和標籤作爲映射值的地圖。否則,freemarker可能會嘗試爲你做這個包裝,而你的控制力較弱。

我剛剛驗證:如果你提供自己的地圖,一切都很好。

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

我甚至會推薦使用LinkedHashMap在你的控制器類中,所以你可以保證顯示順序。 – 2014-05-14 12:18:49