Spring 3 jspページ使用エラー、接続データベースのspring MVC annotationケース付
spring 3のformタグを使用する例を書くと、java.lang.IllegalStateException:Neither BindingResult nor plain target object for bean name'user'available as request attributeというエラーメッセージが表示されます.詳細は次のとおりです.
ネット上で長い間探していたのは原因ではなく、formラベルのmodelAttributeがプロジェクトの対応するクラスとどのように結びついているのかをずっと考えていたが、同僚は中のpath attributeが対応するクラスのfieldに対応し、springが注入のように各fieldに値を付与していると言っていた.だからずっとJSPページで原因を探して、ネット上で探したのもすべてJSPページを変えて、結局解決していません.
エラーメッセージは、「bean name'xxxx'に対してBindingResultも通常のターゲットオブジェクトもリクエスト属性として使用できません」です.突然formフォームページに入る前に、フォームのラベルで認識できる'xxxx'オブジェクトがあることを考え、そのJSPページに入る前のControllerクラスに対応するメソッドに'xxxx'オブジェクトを追加します.次のように解決します.
このように修正してもエラーは報告されません.
例の構成は図のようです.
Web.xmlの内容:
SpringMVCFOrm-servlet.xmlの内容:
db-config.propertiesの内容:
UserDao.classの内容:
BasicDao.classの内容:
UserServices.classの内容:
UserServiceImpl.classの内容:
RegController.classの内容:
WelcomeController.classの内容:
User.classの内容:
index.jspの内容:
register.jspの内容:
Welcome.jspの内容:
使用するjarパケットにはspring 3のdistディレクトリの下にあるすべてのjarパケット、validation-api、hibernate-validator、slf 4 j-api、slf 4 j-log 4 j、log 4 j、commons-logging、tomcat-dbcp、mysql-connector-java-5.1.12-binパケットが含まれます.
以下のように実行します.
プロジェクトを実行した後のインタフェース:
pageのリンクをクリックすると、図のようになります.
UserNameとPasswordが空の場合、エラーメッセージが表示されます.
必要に応じてUserNameとPasswordを入力して次のページにジャンプします.
クエリー・データベースにレコードが表示されます.
このSpring MVC JUnitテストインスタンスをクリックしてください(Spring MVC JUnit Testテストインスタンス添付:WEB-INF下のプロファイルを読み込む方法)
#
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
at org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
at org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
at org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
at org.apache.jsp.WEB_002dINF.jsp.register_jsp._jspx_meth_sf_005flabel_005f0(register_jsp.java:255)
at org.apache.jsp.WEB_002dINF.jsp.register_jsp._jspService(register_jsp.java:140)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
ネット上で長い間探していたのは原因ではなく、formラベルのmodelAttributeがプロジェクトの対応するクラスとどのように結びついているのかをずっと考えていたが、同僚は中のpath attributeが対応するクラスのfieldに対応し、springが注入のように各fieldに値を付与していると言っていた.だからずっとJSPページで原因を探して、ネット上で探したのもすべてJSPページを変えて、結局解決していません.
エラーメッセージは、「bean name'xxxx'に対してBindingResultも通常のターゲットオブジェクトもリクエスト属性として使用できません」です.突然formフォームページに入る前に、フォームのラベルで認識できる'xxxx'オブジェクトがあることを考え、そのJSPページに入る前のControllerクラスに対応するメソッドに'xxxx'オブジェクトを追加します.次のように解決します.
return new ModelAndView("register").addObject(new User());
このように修正してもエラーは報告されません.
例の構成は図のようです.
Web.xmlの内容:
springMVCForm
springMVCForm
org.springframework.web.servlet.DispatcherServlet
springMVCForm
*.do
contextConfigLocation
/WEB-INF/springMVCForm-servlet.xml
org.springframework.web.context.ContextLoaderListener
index.jsp
SpringMVCFOrm-servlet.xmlの内容:
classpath:db-config.properties
${db.dirverClass}
${db.url}
${db.username}
${db.password}
db-config.propertiesの内容:
db.url= jdbc:mysql://localhost:3306/springmvcdb?useUnicode=true&characterEncoding=utf8
db.username=root
db.password=
db.dirverClass= com.mysql.jdbc.Driver
UserDao.classの内容:
package org.spring.wayne.dao;
import org.spring.wayne.dao.basic.BasicDao;
@Repository
public class UserDao extends BasicDao {
public void addUser(User user) {
String SQL = "INSERT INTO TBL_USER(USERNAME ,PASSWORD) VALUES('" + user.getUserName() + "' ,'"
+ user.getPassword() + "')";
getJdbcTemplate().execute(SQL);
}
}
BasicDao.classの内容:
package org.spring.wayne.dao.basic;
import org.springframework.beans.factory.annotation.Autowired;
public class BasicDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
}
public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
}
UserServices.classの内容:
package org.spring.wayne.service;
import org.spring.wayne.web.form.User;
public interface UserService {
public void addUser(User user);
}
UserServiceImpl.classの内容:
package org.spring.wayne.service.impl;
import org.spring.wayne.dao.UserDao;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void addUser(User user) {
userDao.addUser(user);
}
}
RegController.classの内容:
package org.spring.wayne.web.controller;
import javax.validation.Valid;
@Controller
public class RegController {
@Autowired
private UserService userService;
@RequestMapping("/register.do")
public String handler(@ModelAttribute("user") @Valid User user, BindingResult result, Model model) {
if (!result.hasErrors()) {
model.addAttribute("userName", user.getUserName());
model.addAttribute("password", user.getPassword());
userService.addUser(user);
return "welcome";
} else
return "register";
}
}
WelcomeController.classの内容:
package org.spring.wayne.controller;
import org.spring.wayne.web.form.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class WelcomeController {
@RequestMapping("/welcome.do")
public ModelAndView handler() {
return new ModelAndView("register").addObject(new User());
}
}
User.classの内容:
package org.spring.wayne.web.form;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
public class User {
private String errors;
@NotNull
@NotEmpty(message = "This cannot be null")
@Size(min = 4, max = 6, message = "length is wrong")
private String userName;
@NotNull
@NotEmpty
@Size(min = 6, max = 10)
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getErrors() {
return errors;
}
public void setErrors(String errors) {
this.errors = errors;
}
}
index.jspの内容:
The Index Page
Click here to start
register.jspの内容:
The Register Page
function doSubmit() {
var sf = document.getElementById("sf");
sf.submit();
}
Welcome.jspの内容:
The Welcome Page
Welcome, ${userName }, your password is ${password }!
This item has been inserted into the table !
使用するjarパケットにはspring 3のdistディレクトリの下にあるすべてのjarパケット、validation-api、hibernate-validator、slf 4 j-api、slf 4 j-log 4 j、log 4 j、commons-logging、tomcat-dbcp、mysql-connector-java-5.1.12-binパケットが含まれます.
以下のように実行します.
プロジェクトを実行した後のインタフェース:
pageのリンクをクリックすると、図のようになります.
UserNameとPasswordが空の場合、エラーメッセージが表示されます.
必要に応じてUserNameとPasswordを入力して次のページにジャンプします.
クエリー・データベースにレコードが表示されます.
このSpring MVC JUnitテストインスタンスをクリックしてください(Spring MVC JUnit Testテストインスタンス添付:WEB-INF下のプロファイルを読み込む方法)
#