2013-05-17 43 views
0

在提交表單之前,Spring MVC 3.x中是否有一種簡單的方式顯示錶單錯誤消息(通過JSR303驗證獲得)?在使用Spring MVC提交表單之前顯示JSR-303錯誤

請考慮本帖最後的示例代碼。

最終用戶應該編輯其中初始數據已無效的表單。

提交表單(POST方法)時錯誤顯示正確,但初始表單顯示(GET方法)時顯示錯誤。

有沒有簡單的方法來顯示初始表單顯示(GET方法)的錯誤? (有沒有辦法重新使用形式:錯誤標記爲這個目的)

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 @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"; 
    } 
} 

} 

支持豆

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 
} 
//... 
} 

編輯:解釋來自@ 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"; 
    } 
} 

} 

做了一些測試,它似乎工作!比你@ JB-nizet

回答

相關問題