Spring MVC: Neither BindingResult nor plain target object for bean name customerForm
今天在做Spring MVC练习的时候,使用spring的注解方式来写了一个简单的表单页面,但结果老是报错:"Neither BindingResult nor plain target object for bean name customerForm"。
在google百度搜了大半天,综合了几个回答才返现是需要为表单添加一个modelAttribute属性,不然spring不知道将数据存放到什么地方去。
//Customer.javapackage info.iloveec.springtags;import org.springframework.stereotype.Component;public class Customer { //textbox private String userName; //textarea private String address; //password private String password; private String confirmPassword; //checkbox private boolean receiveNewsletter; private String [] favFramework; //radio button private String favNumber; private String sex; //dropdown box private String country; private String javaSkills; //hidden value private String secretValue; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfirmPassword() { return confirmPassword; } public void setConfirmPassword(String confirmPassword) { this.confirmPassword = confirmPassword; } public boolean isReceiveNewsletter() { return receiveNewsletter; } public void setReceiveNewsletter(boolean receiveNewsletter) { this.receiveNewsletter = receiveNewsletter; } public String[] getFavFramework() { return favFramework; } public void setFavFramework(String[] favFramework) { this.favFramework = favFramework; } public String getFavNumber() { return favNumber; } public void setFavNumber(String favNumber) { this.favNumber = favNumber; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getJavaSkills() { return javaSkills; } public void setJavaSkills(String javaSkills) { this.javaSkills = javaSkills; } public String getSecretValue() { return secretValue; } public void setSecretValue(String secretValue) { this.secretValue = secretValue; } }//CustomerController.javapackage info.iloveec.springtags;import java.util.ArrayList;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.validation.BindException;import org.springframework.validation.BindingResult;import org.springframework.validation.Errors;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.support.SessionStatus;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.SimpleFormController;@Controller@RequestMapping("/customer.html")public class CustomerController { private CustomerValidator customerValidator; @Autowired public CustomerController(CustomerValidator customerValidator) { this.customerValidator = customerValidator; } @RequestMapping(method = RequestMethod.GET) public String initForm(ModelMap model) { Customer customer = new Customer(); customer.setFavFramework(new String[]{"Spring MVC"}); customer.setSex("M"); customer.setJavaSkills("Hibernate"); customer.setSecretValue("I'm hidden value"); model.addAttribute("customer", customer); return "CustomerForm"; } @RequestMapping(method=RequestMethod.POST) public String processSubmit(@ModelAttribute("customer") Customer customer, BindingResult result, SessionStatus status) { customerValidator.validate(customer, result); if(result.hasErrors()) { return "CustomerForm"; }else { status.setComplete(); return "CustomerSuccess"; } } @ModelAttribute("webFrameworkList") public List<String> populateWebFrameworkList(){ List<String> webFrameworkList = new ArrayList<String>(); webFrameworkList.add("Spring MVC"); webFrameworkList.add("Struts 1"); webFrameworkList.add("Struts 2"); webFrameworkList.add("JSF"); webFrameworkList.add("Apache Wicket"); return webFrameworkList; } //Data referencing for number radiobuttons @ModelAttribute("numberList") public List<String> populate(){ List<String> numberList = new ArrayList<String>(); numberList.add("Number 1"); numberList.add("Number 2"); numberList.add("Number 3"); numberList.add("Number 4"); numberList.add("Number 5"); return numberList; } @ModelAttribute("javaSkillsList") public Map<String,String> populateJavaSkillList() { //Data referencing for java skills list box Map<String,String> javaSkill = new LinkedHashMap<String,String>(); javaSkill.put("Hibernate", "Hibernate"); javaSkill.put("Spring", "Spring"); javaSkill.put("Apache Wicket", "Apache Wicket"); javaSkill.put("Struts", "Struts"); return javaSkill; } @ModelAttribute("countryList") public Map<String,String> populateCountryList() { //Data referencing for java skills list box Map<String,String> country = new LinkedHashMap<String,String>(); country.put("US", "United Stated"); country.put("CHINA", "China"); country.put("SG", "Singapore"); country.put("MY", "Malaysia"); return country; } }//CustomerSuccess.jsp<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'hello.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h2>Spring's form tags example</h2> <table> <tr> <td>UserName :</td> <td>${customer.userName}</td> </tr> <tr> <td>Address :</td> <td>${customer.address}</td> </tr> <tr> <td>Password :</td> <td>${customer.password}</td> </tr> <tr> <td>Confirm Password :</td> <td>${customer.confirmPassword}</td> </tr> <tr> <td>Receive Newsletter :</td> <td>${customer.receiveNewsletter}</td> </tr> <tr> <td>Favourite Web Frameworks :</td> <td><c:forEach items="${customer.favFramework}" var="current"> [<c:out value="${current}" />] </c:forEach> </td> </tr> <tr> <td>Sex :</td> <td>${customer.sex}</td> </tr> <tr> <td>Favourite Number :</td> <td>${customer.favNumber}</td> </tr> <tr> <td>Java Skills :</td> <td>${customer.javaSkills}</td> </tr> <tr> <td>Hidden Value :</td> <td>${customer.secretValue}</td> </tr> <tr> <td>Hidden Value :</td> <td>${customer.secretValue}</td> </tr> </table> </body></html>//CustomerForm.jsp<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <style type="text/css"> .error { color: #ff0000; } .errorblock { color: #000; background-color: #ffEEEE; border: 3px solid #ff0000; padding: 8px; margin: 16px; } </style> <base href="<%=basePath%>"> <title>My JSP 'hello.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body><h2>Spring's form tags example</h2> <form:form method="POST" commandName="customerForm" modelAttribute="customer"> <form:errors path="*" css element="div" /> <table> <tr> <td>UserName :</td> <td><form:input path="userName" /> </td> <td><form:errors path="userName" css /> </td> </tr> <tr> <td>Address :</td> <td><form:textarea path="address" /> </td> <td><form:errors path="address" css /> </td> </tr> <tr> <td>Password :</td> <td><form:password path="password" /> </td> <td><form:errors path="password" css /> </td> </tr> <tr> <td>Confirm Password :</td> <td><form:password path="confirmPassword" /> </td> <td><form:errors path="confirmPassword" css /> </td> </tr> <tr> <td>Subscribe to newsletter? :</td> <td><form:checkbox path="receiveNewsletter" /> </td> <td><form:errors path="receiveNewsletter" css /> </td> </tr> <tr> <td>Favourite Web Frameworks :</td> <td><form:checkboxes items="${webFrameworkList}" path="favFramework" /></td> <td><form:errors path="favFramework" css /> </td> </tr> <tr> <td>Sex :</td> <td><form:radiobutton path="sex" value="M" />Male <form:radiobutton path="sex" value="F" />Female</td> <td><form:errors path="sex" css /> </td> </tr> <tr> <td>Choose a number :</td> <td><form:radiobuttons path="favNumber" items="${numberList}" /> </td> <td><form:errors path="favNumber" css /> </td> </tr> <tr> <td>Country :</td> <td><form:select path="country"> <form:option value="NONE" label="--- Select ---" /> <form:options items="${countryList}" /> </form:select></td> <td><form:errors path="country" css /> </td> </tr> <tr> <td>Java Skills :</td> <td><form:select path="javaSkills" items="${javaSkillsList}" multiple="true" /></td> <td><form:errors path="javaSkills" css /> </td> </tr> <form:hidden path="secretValue" value="hidden value"/> <tr> <td colspan="3"><input type="submit" /></td> </tr> </table> </form:form> </body></html>//mvc-dispatcher-servlet.
TAG: