1

我是 Spring 的新手,我有一个页面 addContact,因为我通过以下方式从数据库中获取下拉数据

@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";
  }

}

当验证失败时,下拉数据丢失(这是显而易见的),实现验证的正确方法是什么。

4

2 回答 2

6

创建一个带有注释的方法,@ModelAttribute用于加载参考数据。此方法将在每个@RequestMapping方法之前调用。

@ModelAttribute("contactTypeSelect")
public List<ContactType> registerContact() {
    return contactdao.getContactTypeList();
}

在您的表单中,您可以使用<form:select ../>标记来呈现itemValueand itemLabel

<form:select items="${contactTypeSelect}" itemLabel="contactTypeName" itemValue="contactTypeId" />

有了这个,您可以将您的addContact方法重构为以下

@RequestMapping("/addContact")
public String registerContact(@ModelAttribute Contact contact) {
    return "addContact";
}
于 2013-09-12T14:25:30.533 回答
1

您丢失了下拉数据,因为您没有在 insertData 方法中添加联系人地图。将获取联系人数据的代码提取到单独的(私有)方法中,并在 result.hasErrors() if 块中使用它,如下所示:

if (result.hasErrors()) {
   return new ModelAndView("addContact", "map", map);
} 

另外,我强烈建议在 @RequestMapping 注释中添加一个方法,如下所示:

@RequestMapping("/insert", method=RequestMethod.POST)

这可以防止人们对该方法进行 GET 调用。

于 2013-09-12T13:16:41.847 回答