Thymeleaf选择获取所选对象

时间:2017-04-01 10:59:44

标签: spring-mvc thymeleaf

我有一个Thymeleaf表格。选择字段。

<form th:object="${contactForm}" th:action="@{/contact}" method="post">
<select th:field="*{cityId}">
        <option th:each="item : ${cityList}"
                th:value="${item.id}" th:text="${item.description}">
</select> 

当我提交表单时,我可以在城市字段中获取城市ID。是否可以将城市ID和描述作为对象。如果我的contactForm中有一个城市对象。

1 个答案:

答案 0 :(得分:1)

当前代码

我假设您正在使用基于html的以下类,所以我们将它们作为起点。

/* This may be called City in your code */
public class Item {
    private Long id;
    private String description;

    // getter/setter/constructor here...
}

public class ContactForm {
    private Long cityId;

    // getter/setter/constructor here...
}

现在我们可以做些什么来解决您的问题?

Spring提供了一种为特定类添加转换器的简单方法,因此您不必担心将String转换为Year对象。同样的技术也可以用于其他类,比如你的Item类!让我们来看看它:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class StringToItemConverter implements Converter<String, Item> {
    @Override
    public Item convert(String source) {
        if(source != null) {
            try {
                Long id = Long.parseLong(source);
                return /* insert your logic for getting an item by it's id here */;
            } catch(Exception e) {
                return null;
            }
        }
        return null;
    }
}

当Spring尝试将String(从表单输入)转换为类型为Item的实际java字段时,Spring会自动执行上述代码。因此,如果我们稍微改变你的ContactForm类,spring将自动为给定id的Item对象设置。

public class ContactForm {
    /* Note that cityId now has all the information you need (id and description) You should however consider renaming it to city. Don't forget to change the th:field name too! ;) */
    private Item cityId;

    // getter/setter/constructor here...
}

你在使用Spring Repositories吗?

如果要将项目存储在数据库中,则最有可能使用CrudRepository。在这种情况下,代码可能看起来像这样。我们假设您的Repository类名为ItemRepository。

@Component
public class StringToItemConverter implements Converter<String, Item> {
    private ItemRepository itemRepository;

    @Autowired
    public void setItemRepository (ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }

    @Override
    public Item convert(String source) {
        if(source != null) {
            try {
                Long id = Long.parseLong(source);
                return itemRepository.findOne(id);
            } catch(Exception e) {
                return null;
            }
        }
        return null;
    }
}

上面的代码会尝试通过在数据库中查找id来将String从表单转换为实际的Item - Object。因此,如果出现任何问题,我们要么获得Item,要么返回null(例如,如果该id没有项目,或者无法解析String那么长)。