如何将逗号分隔的字符串绑定到Spring表单中的Java集合(List)?

时间:2012-09-09 16:03:54

标签: java spring jsp spring-mvc csv

我遇到的情况是我在JSP中输入了一个用户输入标签的输入元素。例如。 java,foo,bar,anotherTag..etc

<c:url var="saveUrl" value="/create" />
    <form:form modelAttribute="myAttribute" method="POST"
        action="${saveUrl}">

        <form:input path="myTitle" />
        <form:textarea path="myPost" />

        <form:input type="text" id="tagInput"path="???" />

        <input type="submit" value="create" />
</form:form>

现在我的域模型对应于此输入是

private List<Tag> listOfTags

如何将csv绑定到List。如果我在路径中输入listOfTags(由于显而易见的原因这是错误的),我得到错误的绑定异常。 如何将csv转换(或绑定)到List,以便正确提交Spring表单,listOfTags获取在JSP中输入的标记。 实现它的最佳方法是什么?

请帮忙。

3 个答案:

答案 0 :(得分:3)

我不确定但试试这个。做一个简单的html输入:

<input type="text" id="tagInput" name="myTags" />

然后在您的控制器中执行以下操作:

@RequestMapping(value="/create", method=RequestMethod.POST)
public void create(..., @ModelAttribute("myAttribute") MyClass myAttribute,
                    @RequestParam("myTags") String myTags, ...) {
    ...
    myAttribute.setListOfTags(Arrays.asList(myTags.split(",")));
    ...
}

注意:有关绑定和转换对象的更通用方法,您可能需要查看PropertyEditorsConverters

答案 1 :(得分:2)

我建议尝试将其直接绑定到listOfTags属性。为了使其工作,只需向String类添加一个valueOf(String)类型的参数(或定义静态方法Tag)的构造函数。

答案 2 :(得分:1)

很确定你可以这样做:

<c:forEach var="i" begin="1" end="10">
    <form:input type="text" path="listOfTags" />
</c:forEach>

让用户将每个标记输入单独的文本输入。这是因为当Spring进行绑定时,Spring会以相同的形式name自动将多个输入绑定到List。

您可以使用一些jQuery糖仅显示一个或两个,然后提供一个小部件来显示更多标记输入。或者甚至编写一些很酷的JS来填充来自单个文本输入的输入,就像StackOverflow在添加标签时那样。