Spring MVC 3 - <form:select> </form:select>中的自定义标签

时间:2012-02-23 19:40:21

标签: forms spring jsp spring-mvc

我正在创建一个表单,用户可以在其中选择(以及其他)产品的工厂。

每个工厂都由ID标识并具有特定地址。

我想在以下代码中使用自定义标签:

<form:select items="${factories}" path="factory" itemValue="id" itemLabel="..."/>

起初我尝试使用Spring Formatter功能(org.springframework.format.Formatter接口),但是当我这样做时,当我删除“itemLabel”属性以通过Formatter自动显示时:

<form:select items="${factories}" path="factory" itemValue="id"/>

但是如果设置了它(如果是编辑的话),则没有选择正确的值。

然后我试着:

<form:select path="factory" itemValue="id">
    <c:forEach ...>
         <form:option value="${factory.id}" label="${factory.address.city} ${factory.address.street}"
    </c:foreach>
</form:select>

但是在早期的解决方案中,spring没有选择在模型中设置的正确值。

我的问题是:

是否可以通过以下方式格式化实体:选择字段的值与其标签不同时,选择正常工作。

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,问题是表单:选项值和标签直接映射到属性,而不是具有指定jstl的灵活性。

所以你必须手动摇动html,如:

<select name="factory">
    <c:forEach var="factory" items="${factories}" >
        <option value="${factory.id}" label="${factory.address.city} ${factory.address.street}"/>
    </c:forEach>
</select>

Spring将根据name属性(在本例中为'factory')选择'path',因为它将尝试映射到您自动使用的模型对象。

另一种方法是在模型中添加另一个字段,以便根据需要连接和格式化标签。如果是@Entity对象,则创建字段@Transient

答案 1 :(得分:-1)

您还可以覆盖Factory类

中的 toString()方法
 @Override
    public String toString() {
        return "desired string"; 
}

然后在你的jsp中

<form:select items="${factories}" itemValue="id" path="factory"/>