失败的表单验证后出现“org.apache.jasper.JasperException”(“org.apache.jasper.JasperException” after failing form

编程入门 行业动态 更新时间:2024-10-25 01:25:02
失败的表单验证后出现“org.apache.jasper.JasperException”(“org.apache.jasper.JasperException” after failing form validation)

当我的表单无法验证时,我总是收到以下错误:

org.apache.jasper.JasperException:java.lang.IllegalStateException:BindingResult和bean名称'regform'的普通目标对象都不可用作请求属性

表单输入有效时,我不会收到此错误。 根本原因是

java.lang.IllegalStateException:BindingResult和bean名称'regform'的普通目标对象都不能作为请求属性使用

这是net.sandbox.controllers.RegistrationController ,为简洁起见省略了导入:

@Controller @RequestMapping("/register") public class RegistrationController { @Autowired private UserInfo userInfo; @RequestMapping(method = RequestMethod.GET) public String showRegForm(Model model) { RegistrationForm regForm = new RegistrationForm(); model.addAttribute("regform", regForm); return "regform"; } @RequestMapping(method = RequestMethod.POST) public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) { if (result.hasErrors()) { return "regform"; } userInfo.setUserName(regForm.getFirstName()); model.addAttribute("regform", regForm); return "regsuccess"; } }

这是什么意思?


更新 :添加了请求的JSP文件。

regform.jsp

<jsp:include page="includes/header.jsp"> <jsp:param name="pageTitle" value="Registration" /> </jsp:include> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <h2>Register below.</h2> <form:form method="post" commandName="regform"> <p><form:input path="firstName" /> <form:errors path="firstName" /></p> <p><input type="submit" /></p> </form:form> <jsp:include page="includes/footer.jsp" />

header.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="userInfo" scope="session" class="net.sandbox.sessionbeans.UserInfo" /> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><%= request.getParameter("pageTitle") %></title> </head> <body> <h1 style="float: left; width: 50%">Sandbox -- <%= request.getParameter("pageTitle") %></h1> <h4 style="float: left; text-align: right; width: 50%"><% out.print(userInfo.getUserName()); %></h4> <hr style="clear: both" />

footer.jsp

<hr /> <p><i>Copyright information goes here.</i></p> </body> </html>

I always get the following error when my form fails to validate:

org.apache.jasper.JasperException: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'regform' available as request attribute

I don't get this error when the form input is valid. The root cause is

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'regform' available as request attribute

Here is net.sandbox.controllers.RegistrationController with the imports omitted for brevity's sake:

@Controller @RequestMapping("/register") public class RegistrationController { @Autowired private UserInfo userInfo; @RequestMapping(method = RequestMethod.GET) public String showRegForm(Model model) { RegistrationForm regForm = new RegistrationForm(); model.addAttribute("regform", regForm); return "regform"; } @RequestMapping(method = RequestMethod.POST) public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) { if (result.hasErrors()) { return "regform"; } userInfo.setUserName(regForm.getFirstName()); model.addAttribute("regform", regForm); return "regsuccess"; } }

What does it mean?


Update: added requested JSP files.

regform.jsp

<jsp:include page="includes/header.jsp"> <jsp:param name="pageTitle" value="Registration" /> </jsp:include> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <h2>Register below.</h2> <form:form method="post" commandName="regform"> <p><form:input path="firstName" /> <form:errors path="firstName" /></p> <p><input type="submit" /></p> </form:form> <jsp:include page="includes/footer.jsp" />

header.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="userInfo" scope="session" class="net.sandbox.sessionbeans.UserInfo" /> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><%= request.getParameter("pageTitle") %></title> </head> <body> <h1 style="float: left; width: 50%">Sandbox -- <%= request.getParameter("pageTitle") %></h1> <h4 style="float: left; text-align: right; width: 50%"><% out.print(userInfo.getUserName()); %></h4> <hr style="clear: both" />

footer.jsp

<hr /> <p><i>Copyright information goes here.</i></p> </body> </html>

最满意答案

这是因为,在您的validateForm(..)方法中,一旦表单验证失败,您就不会将表单支持对象放入modelMap。 如果您要重新组织代码,请执行以下操作:

@RequestMapping(method = RequestMethod.POST) public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) { model.addAttribute("regform", regForm); if (result.hasErrors()) { return "regform"; } userInfo.setUserName(regForm.getFirstName()); return "regsuccess"; }

你可以解决你的问题,但它仍然不是一个最佳的解决方案。 最佳做法是使用方法来填充表单对象,如下所示:

@ModelAttribute("regform") public RegistrationForm populateForm() { RegistrationForm regForm = new RegistrationForm(); /* init regForm */ return regForm; }

使用populateForm方法,您不需要自己处理表单支持对象的创建。

That's because, in your validateForm(..) method you don't put a form backing object into the modelMap as soon as the form validation fails. If you would reorganize your code like this:

@RequestMapping(method = RequestMethod.POST) public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) { model.addAttribute("regform", regForm); if (result.hasErrors()) { return "regform"; } userInfo.setUserName(regForm.getFirstName()); return "regsuccess"; }

you could solve your problem, but it is still not a optimal solution. Best practice is to use a method to populate form objects like this:

@ModelAttribute("regform") public RegistrationForm populateForm() { RegistrationForm regForm = new RegistrationForm(); /* init regForm */ return regForm; }

using populateForm method, you don't need to handle of creation of form backing objects yourself.

更多推荐

本文发布于:2023-07-05 08:57:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1035471.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:表单   apache   org   jasper   validation

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!