简体   繁体   English

使用Spring MVC提交表单之前显示JSR-303错误

[英]Display JSR-303 errors before form submission with Spring MVC

Is there an easy way in Spring MVC 3.x to display form error messages (obtained by JSR303 validation), before submiting the form ? 在提交表单之前,Spring MVC 3.x中是否有一种简单的方法来显示表单错误消息(通过JSR303验证获得)?

Consider the example code at the end of this post. 请考虑本文结尾处的示例代码。

The end-user is supposed to edit forms in which the initial data is already invalid. 最终用户应该编辑其中初始数据已经无效的表单。

Errors are properly displayed when the form is submitted (POST method), but not on initial form display (GET method). 提交表单时,错误会正确显示(POST方法),但在初始表单显示时(GET方法)不会正确显示错误。

Is there an easy way to display the errors on initial form display (GET method) ? 有没有一种简单的方法可以在初始表单显示中显示错误(GET方法)? (Is there a way to re-use the form:errors tag for this purpose?) (是否有一种方法可以为此目的重新使用form:errors标签?)

JSP View form1.jsp: JSP查看 form1.jsp:

<%@ page session="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html><body>
<form:form commandName="form1" method="post">
 <s:bind path="*">
   <c:if test="${status.error}">
       <div style="color: red;">There are errors:</div>
       <form:errors /><br />
   </c:if>
  </s:bind>

  <form:label path="field1" >Field1:</form:label> 
  <form:input path="field1" />
  <form:errors path="field1" cssStyle="color: red;"/>
  <br />

  <form:label path="field2" >Field2:</form:label> 
  <form:input path="field2" />
  <form:errors path="field2" cssStyle="color: red;"/>
  <br />

  <form:button name="submit">Ok</form:button>
</form:form>
</body></html>

Controller : 控制器

@Controller @SessionAttributes("form1")
public class Form1Controller {

@ModelAttribute("form1") public Form1Bean createForm1() { return new Form1Bean(); }

@RequestMapping(value = "/form1/edit", method = RequestMethod.GET)
public String getEdit(Model model) {
    // here we pretend to get form1 from database, and store it in session.
    // form1 in database may have invalid field values.

    // Perform a JSR-303 validation here ?
    // MAIN QUESTION: What's the easy way to add errors to model and display them ?

    return "/form1";
}

@RequestMapping(value = "/form1/edit", method = RequestMethod.POST)
public String postEdit(@Valid @ModelAttribute("form1") Form1Bean form1, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "/form1";
    } else {
        return "redirect:/done";
    }
}

}

Backing Bean : 菜豆

public class Form1Bean {
@Size(min=4,max=10) private String field1; // getters and setters ommited for brevity
@Size(min=4,max=10) private String field2;

public Form1Bean() {
    this.field1 = "bad"; this.field2="good"; // start with an invalid field1
}
//...
}

Edit: After the interpreting the answer from @jb-nizet, here is the complete controller source : 编辑:从@ jb-nizet解释答案后,这里是完整的控制器源

@Controller @SessionAttributes("form1")
public class Form1Controller {

@Autowired org.springframework.validation.Validator validator;

@ModelAttribute("form1") public Form1Bean createForm1() { return new Form1Bean(); }

@RequestMapping(value = "/form1/edit", method = RequestMethod.GET)
public String getEdit(@ModelAttribute("form1") Form1Bean form1, Errors errors, Model model) {
    // here we pretend to get form1 from database, and store it in session.
    // form1 in database may have invalid field values.

    validator.validate(form1, errors);

    return "/form1";
}

@RequestMapping(value = "/form1/edit", method = RequestMethod.POST)
public String postEdit(@Valid @ModelAttribute("form1") Form1Bean form1, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "/form1";
    } else {
        return "redirect:/done";
    }
}

}

Made a few tests, and it seems to work! 进行了一些测试,似乎可以正常工作! Than you @jb-nizet 比你@ jb-nizet

没有经过测试,但是据我了解的文档 ,您只需要在控制器中注入org.springframework.validation.Validator类型的对象,创建并绑定Errors实例即可,如GET METHOD中的“ 添加错误”中所述。调用验证器的validate()方法,并将表单和Errors作为参数传递。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM