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.java
package 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.java

package 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="*" cssClass="errorblock" element="div" />
		<table>
			<tr>
				<td>UserName :</td>
				<td><form:input path="userName" />
				</td>
				<td><form:errors path="userName" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Address :</td>
				<td><form:textarea path="address" />
				</td>
				<td><form:errors path="address" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Password :</td>
				<td><form:password path="password" />
				</td>
				<td><form:errors path="password" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Confirm Password :</td>
				<td><form:password path="confirmPassword" />
				</td>
				<td><form:errors path="confirmPassword" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Subscribe to newsletter? :</td>
				<td><form:checkbox path="receiveNewsletter" />
				</td>
				<td><form:errors path="receiveNewsletter" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Favourite Web Frameworks :</td>
				<td><form:checkboxes items="${webFrameworkList}"
					path="favFramework" /></td>
				<td><form:errors path="favFramework" cssClass="error" />
				</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" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Choose a number :</td>
				<td><form:radiobuttons path="favNumber" items="${numberList}" />
				</td>
				<td><form:errors path="favNumber" cssClass="error" />
				</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" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Java Skills :</td>
				<td><form:select path="javaSkills" items="${javaSkillsList}"
					multiple="true" /></td>
				<td><form:errors path="javaSkills" cssClass="error" />
				</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.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
	<context:component-scan base-package="info.iloveec.*" />
	
	<bean class="info.iloveec.springtags.CustomerValidator" />

    
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
	    <property name="basename" value="info/iloveec/springtags/customer" />
    </bean>
 
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
 
</beans>
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 
	<display-name>Spring MVC Application</display-name>
 
	<servlet>
		<servlet-name>mvc-dispatcher</servlet-name>
		<servlet-class>
                       org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>mvc-dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
 
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
	</context-param>
 
	<listener>
		<listener-class>
                      org.springframework.web.context.ContextLoaderListener
        </listener-class>
	</listener>
 
</web-app>

  

原文地址:https://www.cnblogs.com/JavaTechLover/p/2557970.html