使用BindingResult 自定義錯誤信息
BindingResult 自定義錯誤信息
前提概要
在Spring MVC和FreeMarker整合的項目中,采用JSR-303驗證框架,通過注解的方式進行數(shù)據(jù)驗證
基礎框架
- MVC:Spring MVC 3
- 視圖:FreeMarker
- 驗證:Hibernate-validator實現(xiàn)
配置文件和Java代碼的修改
在Spring MVC配置文件中添加配置
添加以下mvc的注解驅(qū)動配置,一切變成“自動化”
<mvc:annotation-driven />
在JavaBean中添加數(shù)據(jù)校驗的注解
其中@Length、@email就是Hibernate-validator中的數(shù)據(jù)校驗注解,還可以用javax.validation中的注解,比如@NotNull
public class SystemUser {
@Length(min = 5, max = 20, message = "用戶名長度必須位于5到20之間")
private String userName;
@Email(message = "比如輸入正確的郵箱")
private String email;
}
在Controller方法中指定需要進行校驗
首先,要在需要進行校驗的Bean前面加上@Valid注解,告訴SpringMVC框架這個Bean需要進行校驗;
同時,還要在需要校驗的Bean前面加上@modelattribute注解,從而將Bean暴露給視圖,并且指定名字,這有兩個作用,第一是顯示校驗錯誤需要使用這個名字,第二個是返回原來的頁面以后,前面輸入的所有值還要顯示出來;
其次,每個需要校驗的Bean后面緊跟一個BindingResult,SpringMVC框架會將校驗結(jié)果保存在它里面,通過hasErrors方法可以判斷是否有校驗錯誤;
最后,當返回到原頁面以后,SpringMVC框架還會將所有校驗錯誤信息保存在上下文中,供頁面上取得校驗錯誤,Spring提供了一套JSP自定義標簽。
@RequestMapping(value = "/create.html", method = RequestMethod.POST)
public String doCreateUser(
@Valid @ModelAttribute("userDetail") SystemUser user,
BindingResult bindingResult,
HttpServletRequest request) {
// 如果有校驗錯誤,返回添加用戶的頁面
if (bindingResult.hasErrors()) {
return "/user/create";
}
this.userService.createUser(user);
return "/user/list.html";
}
進行自定義校驗
如果需要添加自定義校驗,比如驗證用戶名是否已經(jīng)被使用了,那么簡單的注解自然無能為力,需要自己編碼實現(xiàn),如果校驗失敗,可以手動將自定義校驗錯誤添加到BindingResult中。
@RequestMapping(value = "/user/create.html", method = RequestMethod.POST)
public String doCreateUser(
@Valid @ModelAttribute("userDetail") SystemUser user,
BindingResult bindingResult,
HttpServletRequest request) {
// 如果有數(shù)據(jù)校驗錯誤,返回添加用戶的頁面
if (bindingResult.hasErrors()) {
return "/user/create";
}
boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName());
// 如果用戶名已存在,返回添加用戶的頁面
if (isUserNameExist) {
// 向BindingResult添加用戶已存在的校驗錯誤
bindingResult.rejectValue("userName", "該用戶名已存在", "該用戶名已存在");
return "/user/create";
}
this.userService.createUser(user);
return "/user/list.html";
}
在JSP頁面上顯示校驗錯誤信息
返回頁面以后,SpringMVC框架將所有校驗錯誤信息都放在了上下文中,可以自己去取出來,但是那樣非常麻煩,不過沒關(guān)系,Spring提供了一套自定義標簽,可以方便的顯示校驗錯誤信息。
頁面頭部需要導入Spring的自定義標簽庫
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
需要一次性顯示全部校驗錯誤
(commandName的值就是@modelattribute注解中指定的值)
<form:form commandName="userDetail"> <form:errors path="*" cssStyle="color:red"></form:errors> </form:form>
需要在對應輸入框的后面顯示單個校驗錯誤
(通過path指定顯示那個具體的校驗錯誤,userDetail正是@modelattribute注解中指定的值,而點號后面則是指定顯示Bean中哪個屬性的校驗錯誤)
<input type="text" name="userName" value="${userDetail.userName}" >
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors>
<input type="text" name="email" value="${userDetail.email}">
<form:errors path="userDetail.email" cssStyle="color:red"></form:errors>
BindingResult錯誤返回顯示失敗
作為一個初學者經(jīng)常犯低級錯誤,特別是沒有老師的情況下。絆了一整天,不過找到原因了
如果redirect跳轉(zhuǎn)回造成參數(shù)丟失
此時可以設置返回參數(shù)為Object
@RequestMapping(value = "/save", method = RequestMethod.POST)
public Object test(HttpServletRequest request, Model model, @Validated User user, BindingResult bindingResult)
throws Exception {
if (bindingResult.hasErrors()) {
return "user/save";
}
user.setVersion(0);
return new ModelAndView("redirect:/user/list");
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義
這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義,鎖的作用是讓臨界區(qū)互斥執(zhí)行,本文只要圍繞鎖的內(nèi)存語義展開全文內(nèi)容,需要的小伙伴可以參考一下2021-11-11
關(guān)于Java如何用好線程池的方法分享(建議收藏)
這篇文章主要來和大家分享幾個關(guān)于Java如何用好線程池的建議,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下2023-06-06
基于Graphics2D drawImage圖片失真的解決方案
這篇文章主要介紹了基于Graphics2D drawImage圖片失真的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java中的static和final關(guān)鍵字的使用詳解
這篇文章主要介紹了Java中的static和final關(guān)鍵字的使用詳解, 當方法名前有static,即為static方法,可以方便我們無需創(chuàng)建對象也可以調(diào)用此方法,靜態(tài)方法比較拉,只可以訪問 靜態(tài)的 屬性/變量/方法,無法訪問非靜態(tài)的這些屬性/變量/方法,需要的朋友可以參考下2024-01-01
以Json形式的數(shù)據(jù)格式實現(xiàn)JMeter參數(shù)化
本文以小項目學院管理系統(tǒng)為例,給大家分享以Json形式的數(shù)據(jù)格式實現(xiàn)JMeter參數(shù)化的相關(guān)知識,包括添加元件操作步驟及使用用戶參數(shù)組件實現(xiàn)參數(shù)化的方法,感興趣的朋友跟隨小編一起看看吧2021-05-05
Java inputstream和outputstream使用詳解
這篇文章主要介紹了Java inputstream和outputstream使用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Spring Security系列教程之會話管理處理會話過期問題
會話過期,是指當用戶登錄網(wǎng)站后,較長一段時間沒有與服務器進行交互,將會導致服務器上的用戶會話數(shù)據(jù)(即session)被銷毀。這篇文章主要介紹了Spring Security系列教程之會話管理處理會話過期問題,需要的朋友可以參考下2021-10-10

