Display JSR-303 errors before form submission with Spring MVC

半腔热情 提交于 2019-12-11 16:43:29

问题


Is there an easy way in Spring MVC 3.x to display form error messages (obtained by JSR303 validation), before submiting the form ?

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).

Is there an easy way to display the errors on initial form display (GET method) ? (Is there a way to re-use the form:errors tag for this purpose?)

JSP View 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:

@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


回答1:


Not tested, but as I understand the documentation, you would just have to inject an object of type org.springframework.validation.Validator in your controller, create and bind an Errors instance as explained in Add Error on GET METHOD Spring annotated controller, and invoke the validator's validate() method, passing the form and the Errors as argument.



来源:https://stackoverflow.com/questions/16618408/display-jsr-303-errors-before-form-submission-with-spring-mvc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!