SpringMVC框架 |JSR303數據校驗


一、JSR303介紹

只做前端校驗是不安全的,重要的數據一定要加上後端驗證。可以在程序中將每一條數據取出校驗,如果校驗失敗直接來到添加頁面,提示其重新填寫。而SpringMVC提供了JSR303來進行數據校驗。

  • JSR303 是Java爲Bean數據合法性校驗提供的標準框架,它已經包含在JavaEE6.0中。
  • JSR303 通過在Bean屬性上標註類似於@NotNull、@Max等標準的註解指定校驗規則,並通過標準的驗證接口對Bean進行驗證。
JSR303註解 功能說明
@Null 被註釋的元素必須爲null
@NutNull 被註釋的元素必須不爲null
@AssertTrue 被註釋的元素必須爲true
@AssertFalse 被註釋的元素必須爲false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max,min) 被註釋的元素的大小必須在指定的範圍內
@Digits(integer,fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期

就像JDBC只是一個規範,需要有各個廠商的驅動包來實現一樣,JSR303也是一個規範,可以通過 Hibernate Validator(第三方校驗框架)來實現。

Hibernate Validator擴展註解 功能說明
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串必須非空
@Range 被註釋的元素必須在合適的範圍內

二、JSR303的使用步驟

第一步:導入jar包/添加Maven依賴:

在這裏插入圖片描述

第二步:在bean中爲屬性加上註解

	@NotNull//非空
	@Length(min = 6, max = 16)//必須是6-16個字符
	private String lastName;
	@Email//必須是郵箱格式
	private String email;

	@DateTimeFormat(pattern = "yyyy-MM-dd")//這個是自定義的日期格式
	@Past//必須是過去的時間
	private Date birth;

第三步:告訴SpringMVC需要校驗的JavaBean

  • 添加@Valid註解,此註解告訴SpringMVC封裝JavaBean時,按照指定的校驗規則進行校驗。另外,可以通過緊跟BindingResult參數,來封裝這個JavaBean的校驗結果。
例:
	@RequestMapping(value = "/emp", method = RequestMethod.POST)
	public String addEmp(@Valid Employee employee, BindingResult result) {
		boolean hasErrors = result.hasErrors();
		if (hasErrors) {
			System.out.println("有校驗錯誤");
			return "add";
		} else {
			employDao.save(employee);
			// 返回列表頁面,直接重定向到emps請求
			return "redirect:/emps";
		}
	}

可以在JSP頁面對應的輸入框後添加<form:errors path="email"/>,在前端顯示錯誤信息。

普通表單回顯錯誤信息

  • handler中定義一個Map存放所有的錯誤信息,放入隱含模型並存入請求域中。
	@RequestMapping(value = "/emp", method = RequestMethod.POST)
	public String addEmp(@Valid Employee employee, BindingResult result, Model model) {
		System.out.println("要添加的員工" + employee);
		boolean hasErrors = result.hasErrors();
		HashMap<String, Object> errorsMap = new HashMap<String, Object>();// 定義一個Map來存放所有的錯誤信息
		if (hasErrors) {// 如果有錯誤
			List<FieldError> errors = result.getFieldErrors();// 獲取所有的錯誤
			for (FieldError fieldError : errors) {
				errorsMap.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
			model.addAttribute("errorInfo", errorsMap);
			return "add";
		} else {
			employDao.save(employee);
			// 返回列表頁面,直接重定向到emps請求
			return "redirect:/emps";
		}
	}

JSP頁面使用$的形式取出錯誤信息。

lastName:<form:input path="lastName" /> ${errorInfo.lastName }

在這裏插入圖片描述

三、自定義國際化錯誤消息的顯示

hibernate旗下的校驗註解已經完成了國際化,如果不是hibernate的註解會回顯出內部錯誤信息,需要自定義國際化錯誤消息的。

  • 當使用SpringMVC標籤顯示錯誤消息時,SpringMVC會查看WEB上下文是否裝配了對應的國際化消息,如果沒有,則顯示默認的錯誤消息,否則使用國際化消息。
  • 當一個屬性校驗失敗後,校驗框架會爲該屬性生成4個消息代碼,這些代碼以校驗註解類名爲前綴,結合ModelAttribute、屬性名以及屬性類型名,生成多個對應的消息代碼。

1.編寫國際化文件

配置文件中的key有四種寫法

codes
[
	1.Email.employee.email,		(校驗規則.隱含模型中對象的key.對象的屬性):如果是隱含模型中employee對象的email屬性字段發生了@Email校驗錯誤,就會生成Email.employee.email
	2.Email.email,			(校驗規則.屬性名):所有的email屬性只要發生了@Email錯誤
	3.Email.java.lang.String,			(校驗規則.屬性類型):只要是String類型發生了@Email錯誤
	4.Email			只要是發生了@Email校驗錯誤
]

中英文國際化文件

  • 國際化文件的properties編碼應使用ISO-8859-1,且前端使用form:errors的方式接收回顯,
[errors_zh_CN.properties]:中文
Email.email=郵箱不合法!
NotEmpty=不能爲空!
Length.java.lang.String=長度錯誤!
Path=必須是一個過去的時間!
typeMismatch.birth=生日錯誤!
------------------------------------
[errors_en_US.properties]:英文
Email.email=email incorrect!
NotEmpty=must not empty!
Length.java.lang.String=length incorrect!
Path=must a past time!
typeMismatch.birth=xxx!

2.SpringMVC中配置資源文件管理器

	<!-- 讓SpringMVC管理國際化資源文件:配置一個資源文件管理器 -->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="errors"></property>
	</bean>

在這裏插入圖片描述

四、message指定錯誤消息

實際上,一些小的公司並沒有國家化的需求,在校驗註解中直接添加message註解,就可以指定錯誤消息。

	@NotEmpty(message = "不能爲空")
	@Length(min = 6, max = 16)
	private String lastName;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章