我有一个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中有一个城市对象。
答案 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那么长)。