我是Spring的新手 我有一个页面addContact,因为我以下列方式从数据库获取dropDown数据
@RequestMapping("/addContact")
public ModelAndView registerContact(@ModelAttribute Contact contact) {
List<ContactType> contactTypeList = contactdao.getContactTypeList();
Map<Integer,String> contactTypeSelect = new LinkedHashMap<Integer,String>();
Iterator<ContactType> iterator = contactTypeList.iterator();
while (iterator.hasNext()) {
ContactType ct = iterator.next();
contactTypeSelect.put(ct.getContactTypeId(),ct.getContactTypeName());
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("contactTypeSelect", contactTypeSelect);
return new ModelAndView("addContact", "map", map);
}
现在要将数据插入数据库,我有以下方法,
@RequestMapping("/insert")
public String insertData(@Valid Contact contact, BindingResult result, HttpServletRequest request ) {
if (result.hasErrors()) {
return "addContact";
}
else {
HttpSession session = request.getSession();
session.setAttribute("path", request.getSession().getServletContext().getRealPath("/WEB-INF"));
if (contact != null){
contactService.insertData(contact,request);
}
return "redirect:/getList";
}
}
验证失败时,下拉数据会丢失(很明显),实现验证的正确方法是什么。
答案 0 :(得分:6)
创建一个用@ModelAttribute
注释的方法,用于加载参考数据。将在每个@RequestMapping
方法之前调用此方法。
@ModelAttribute("contactTypeSelect")
public List<ContactType> registerContact() {
return contactdao.getContactTypeList();
}
在表单中,您可以使用<form:select ../>
标记来呈现itemValue
和itemLabel
。
<form:select items="${contactTypeSelect}" itemLabel="contactTypeName" itemValue="contactTypeId" />
使用此功能,您可以将addContact
方法重构为以下
@RequestMapping("/addContact")
public String registerContact(@ModelAttribute Contact contact) {
return "addContact";
}
答案 1 :(得分:1)
您丢失了下拉数据,因为您没有在insertData方法中添加联系人映射。将获取联系人数据的代码拉出到单独的(私有)方法中,并在result.hasErrors()中使用它,如果阻止的话:
if (result.hasErrors()) {
return new ModelAndView("addContact", "map", map);
}
另外,我强烈建议在@RequestMapping注释中添加一个方法:
@RequestMapping("/insert", method=RequestMethod.POST)
这使人们无法对此方法进行GET调用。