今天在做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>