spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例

在写一个使用spring3 的form标签的例子时,一直报错,错误信息为:java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute 。具体信息为:

  1. java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute  
  2.     at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)  
  3.     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)  
  4.     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)  
  5.     at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)  
  6.     at org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)  
  7.     at org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)  
  8.     at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)  
  9.     at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)  
  10.     at org.apache.jsp.WEB_002dINF.jsp.register_jsp._jspx_meth_sf_005flabel_005f0(register_jsp.java:255)  
  11.     at org.apache.jsp.WEB_002dINF.jsp.register_jsp._jspService(register_jsp.java:140)  
  12.     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)  
  13.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  14.     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)  
  15.     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)  
  16.     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)  
  17.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  18.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
  19.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  20.     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)  
  21.     at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)  
  22.     at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)  
  23.     at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)  
  24.     at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)  
  25.     at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)  
  26.     at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)  
  27.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)  
  28.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)  
  29.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)  
  30.     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)  
  31.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
  32.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  33.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
  34.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  35.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)  
  36.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)  
  37.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)  
  38.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)  
  39.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)  
  40.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)  
  41.     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)  
  42.     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)  
  43.     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)  
  44.     at java.lang.Thread.run(Thread.java:662)  

在网上找了好长时间都不是原因所在,一直在想form标签中的modelAttribute是怎么跟project中相应的类联系在一起的,同事说是根据<form:input path="field"/>中的path attribute跟相应类中的field对应起来,由spring像注入一样给每个field赋值。所以一直在JSP页面查找原因,网上找的也都是改JSP页面,结果还是没有解决掉。

错误信息是“对于bean name 'xxxx' 既没有BindingResult也没有普通的目标对象可以用来作为请求属性”。突然想到在进入form表单页面之前,要有一个'xxxx'对象才可以在表单的标签中识别出来,所以在进入该JSP页面之前的Controller类里面相应的方法里面加上一个'xxxx'的对象。解决如下:

  1. return new ModelAndView("register").addObject(new User());  

已经验证这样修改之后就不会报错。

例子的结构如图:

web.xml 的内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     id="WebApp_ID" version="2.5">  
  6.     <display-name>springMVCForm</display-name>  
  7.   
  8.     <servlet>  
  9.         <servlet-name>springMVCForm</servlet-name>  
  10.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  11.     </servlet>  
  12.   
  13.     <servlet-mapping>  
  14.         <servlet-name>springMVCForm</servlet-name>  
  15.         <url-pattern>*.do</url-pattern>  
  16.     </servlet-mapping>  
  17.   
  18.     <context-param>  
  19.         <param-name>contextConfigLocation</param-name>  
  20.         <param-value>/WEB-INF/springMVCForm-servlet.xml</param-value>  
  21.     </context-param>  
  22.   
  23.     <listener>  
  24.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  25.     </listener>  
  26.   
  27.     <welcome-file-list>  
  28.         <welcome-file>index.jsp</welcome-file>  
  29.     </welcome-file-list>  
  30. </web-app>  

springMVCForm-servlet.xml 的内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7.     http://www.springframework.org/schema/mvc  
  8.     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  9.     http://www.springframework.org/schema/context   
  10.     http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  11.   
  12.     <mvc:annotation-driven />  
  13.   
  14.     <context:component-scan base-package="org.spring.wayne" />  
  15.   
  16.     <bean id="config"  
  17.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  18.         <property name="locations">  
  19.             <list>  
  20.                 <value>classpath:db-config.properties</value>  
  21.             </list>  
  22.         </property>  
  23.     </bean>  
  24.   
  25.     <!-- 获取数据源 -->  
  26.     <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">  
  27.         <property name="driverClassName">  
  28.             <value>${db.dirverClass}</value>  
  29.         </property>  
  30.         <property name="url">  
  31.             <value>${db.url}</value>  
  32.         </property>  
  33.         <property name="username">  
  34.             <value>${db.username}</value>  
  35.         </property>  
  36.         <property name="password">  
  37.             <value>${db.password}</value>  
  38.         </property>  
  39.     </bean>  
  40.   
  41.     <bean name="namedParameterJdbcTemplate"  
  42.         class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">  
  43.         <constructor-arg ref="dataSource" />  
  44.     </bean>  
  45.     <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  46.         <constructor-arg ref="dataSource" />  
  47.     </bean>  
  48.   
  49.     <bean  
  50.         class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  51.   
  52.     <bean  
  53.         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  54.   
  55.     <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀,在requestmapping输入的地址后自动调用该类进行视图解析 -->  
  56.     <bean id="viewResolver"  
  57.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  58.         <property name="viewClass"  
  59.             value="org.springframework.web.servlet.view.JstlView" />  
  60.         <property name="prefix" value="/WEB-INF/jsp/" /><!-- 跳转页面的前缀路径   
  61.             如 /web-inf/jsp/ -->  
  62.         <property name="suffix" value=".jsp"></property><!-- 跳转页面后缀 如 helloWorld.jsp -->  
  63.     </bean>  
  64. </beans>  

db-config.properties的内容:

  1. db.url= jdbc:mysql://localhost:3306/springmvcdb?useUnicode=true&characterEncoding=utf8  
  2.   
  3. db.username=root  
  4.   
  5. db.password=  
  6.   
  7. db.dirverClass= com.mysql.jdbc.Driver  

UserDao.class的内容:

  1. package org.spring.wayne.dao;  
  2.   
  3. import org.spring.wayne.dao.basic.BasicDao;  
  4.   
  5. @Repository  
  6. public class UserDao extends BasicDao {  
  7.   
  8.     public void addUser(User user) {  
  9.         String SQL = "INSERT INTO TBL_USER(USERNAME ,PASSWORD) VALUES('" + user.getUserName() + "' ,'"  
  10.                 + user.getPassword() + "')";  
  11.         getJdbcTemplate().execute(SQL);  
  12.     }  
  13.   
  14. }  

BasicDao.class的内容:

  1. package org.spring.wayne.dao.basic;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4.   
  5. public class BasicDao {  
  6.   
  7.     @Autowired  
  8.     private JdbcTemplate jdbcTemplate;  
  9.   
  10.     @Autowired  
  11.     private NamedParameterJdbcTemplate namedParameterJdbcTemplate;  
  12.   
  13.     public JdbcTemplate getJdbcTemplate() {  
  14.         return jdbcTemplate;  
  15.     }  
  16.   
  17.     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
  18.         this.jdbcTemplate = jdbcTemplate;  
  19.     }  
  20.   
  21.     public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {  
  22.         return namedParameterJdbcTemplate;  
  23.     }  
  24.   
  25.     public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {  
  26.         this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;  
  27.     }  
  28. }  

UserService.class的内容:

  1. package org.spring.wayne.service;  
  2.   
  3. import org.spring.wayne.web.form.User;  
  4.   
  5. public interface UserService {  
  6.   
  7.     public void addUser(User user);  
  8.   
  9. }  

UserServiceImpl.class的内容:

  1. package org.spring.wayne.service.impl;  
  2.   
  3. import org.spring.wayne.dao.UserDao;  
  4. @Service  
  5. public class UserServiceImpl implements UserService {  
  6.     @Autowired  
  7.     private UserDao userDao;  
  8.   
  9.     @Override  
  10.     public void addUser(User user) {  
  11.         userDao.addUser(user);  
  12.     }  
  13.   
  14. }  

RegController.class的内容:

  1. package org.spring.wayne.web.controller;  
  2.   
  3. import javax.validation.Valid;  
  4.   
  5. @Controller  
  6. public class RegController {  
  7.   
  8.     @Autowired  
  9.     private UserService userService;  
  10.   
  11.     @RequestMapping("/register.do")  
  12.     public String handler(@ModelAttribute("user") @Valid User user, BindingResult result, Model model) {  
  13.         if (!result.hasErrors()) {  
  14.             model.addAttribute("userName", user.getUserName());  
  15.             model.addAttribute("password", user.getPassword());  
  16.             userService.addUser(user);  
  17.             return "welcome";  
  18.         } else  
  19.             return "register";  
  20.     }  
  21. }  

WelcomeController.class的内容:

  1. package org.spring.wayne.controller;  
  2.   
  3. import org.spring.wayne.web.form.User;  
  4. import org.springframework.stereotype.Controller;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.servlet.ModelAndView;  
  7.   
  8. @Controller  
  9. public class WelcomeController {  
  10.   
  11.     @RequestMapping("/welcome.do")  
  12.     public ModelAndView handler() {  
  13.         return new ModelAndView("register").addObject(new User());  
  14.     }  
  15. }  

User.class的内容:

  1. package org.spring.wayne.web.form;  
  2.   
  3. import javax.validation.constraints.NotNull;  
  4. import javax.validation.constraints.Size;  
  5.   
  6. import org.hibernate.validator.constraints.NotEmpty;  
  7.   
  8. public class User {  
  9.   
  10.     private String errors;  
  11.   
  12.     @NotNull  
  13.     @NotEmpty(message = "This cannot be null")  
  14.     @Size(min = 4, max = 6, message = "length is wrong")  
  15.     private String userName;  
  16.   
  17.     @NotNull  
  18.     @NotEmpty  
  19.     @Size(min = 6, max = 10)  
  20.     private String password;  
  21.   
  22.     public String getUserName() {  
  23.         return userName;  
  24.     }  
  25.   
  26.     public void setUserName(String userName) {  
  27.         this.userName = userName;  
  28.     }  
  29.   
  30.     public String getPassword() {  
  31.         return password;  
  32.     }  
  33.   
  34.     public void setPassword(String password) {  
  35.         this.password = password;  
  36.     }  
  37.   
  38.     public String getErrors() {  
  39.         return errors;  
  40.     }  
  41.   
  42.     public void setErrors(String errors) {  
  43.         this.errors = errors;  
  44.     }  
  45. }  

index.jsp的内容:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme() + "://"  
  6.     + request.getServerName() + ":" + request.getServerPort()  
  7.     + path + "/";  
  8. %>  
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  10. <html>  
  11. <head>  
  12. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  13. <title>The Index Page</title>  
  14. </head>  
  15. <body>  
  16.     <h3>  
  17.         <href="<%=basePath %>welcome.do">Click here to start</a>  
  18.     </h3>  
  19. </body>  
  20. </html>  

register.jsp的内容:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>The Register Page</title>  
  9. <script type="text/javascript">  
  10.     function doSubmit() {  
  11.         var sf = document.getElementById("sf");  
  12.         sf.submit();  
  13.     }  
  14. </script>  
  15. <style type="text/css">  
  16. .errors {  
  17.     font-size: 12px;  
  18.     color: red;  
  19. }  
  20. </style>  
  21. </head>  
  22. <body>  
  23.     <sf:form id="sf" method="POST" modelAttribute="user"  
  24.         action="register.do">  
  25.         <sf:errors path="errors" />  
  26.         <fieldset>  
  27.             <legend>Register</legend>  
  28.             <table cellspacing="0">  
  29.                 <tr>  
  30.                     <td><sf:label path="userName">UserName:</sf:label>  
  31.                     </td>  
  32.                     <td><sf:input path="userName" />  
  33.                     </td>  
  34.                     <td><sf:errors path="userName" class="errors" />  
  35.                     </td>  
  36.                 </tr>  
  37.                 <tr>  
  38.                     <td><sf:label path="password">Password:</sf:label>  
  39.                     </td>  
  40.                     <td><sf:password path="password" />  
  41.                     </td>  
  42.                     <td><sf:errors path="password" class="errors" />  
  43.                     </td>  
  44.                 </tr>  
  45.                 <tr>  
  46.                     <td colspan="2"><input type="button" value="Submit"  
  47.                         onClick="doSubmit()">  
  48.                     </td>  
  49.                 </tr>  
  50.             </table>  
  51.         </fieldset>  
  52.     </sf:form>  
  53. </body>  
  54. </html>  

welcome.jsp的内容:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>The Welcome Page</title>  
  8. </head>  
  9. <body>  
  10.     Welcome, ${userName }, your password is ${password }!  
  11.     <br>  
  12.     <h3>This item has been inserted into the table !</h3>  
  13. </body>  
  14. </html>  

用到的jar包包括spring3中的dist目录下的所有jar包,validation-api,hibernate-validator,slf4j-api,slf4j-log4j,log4j,commons-logging,tomcat-dbcp,mysql-connector-java-5.1.12-bin包。

运行截图如下:

运行project后的界面:

点击page中的链接后如图所示:

当UserName和Password为空时提示错误信息:

输入符合要求的UserName和Password跳转到下一个页面:

现在查询数据库可以看到一条记录:

该Spring MVC JUnit测试实例请点击(Spring MVC JUnit Test测试实例 附:读取WEB-INF下配置文件的方法

原文地址:https://www.cnblogs.com/koal/p/4372825.html