溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入

發(fā)布時(shí)間:2020-07-11 21:11:06 來源:網(wǎng)絡(luò) 閱讀:8141 作者:pangfc 欄目:開發(fā)技術(shù)

一 簡介

SpringMVC支持與JSR 349 Bean Validation API的集成。借助于Bean驗(yàn)證,可以非常容易地將驗(yàn)證元數(shù)據(jù)應(yīng)用到實(shí)體類,并且通過合適的視圖向用戶展示可能的錯(cuò)誤結(jié)果。在模型類中可以通過注解對(duì)屬性驗(yàn)證進(jìn)行定義,常見的注解有:@Size ,@Email ,@Pattern,@Max等,分別驗(yàn)證長度,郵箱格式,自定義正則表達(dá)式,最大值(PS:更多相關(guān)注解可以百度或者查API)


二 測試實(shí)例

(1)新建一個(gè)動(dòng)態(tài)Java web項(xiàng)目,然后下載“Hibernate Validator”的jar包,下載地址:http://hibernate.org/validator/ ,最后是導(dǎo)入必要的幾個(gè)jar包和springmvc所需要的jar包,最后的項(xiàng)目結(jié)構(gòu)如下:

SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入    SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入

(2)配置文件web.xml:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
	  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
	
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

在web.xml中定義了springmvc處理請(qǐng)求的后綴是.html,同時(shí)設(shè)置了編碼為UTF-8

(3)配置文件springmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
       					   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
       					   http://www.springframework.org/schema/context
       					   http://www.springframework.org/schema/context/spring-context-4.0.xsd
       					   http://www.springframework.org/schema/mvc 
       					   http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

	<context:component-scan base-package="cn.zifangsky.* *.controller" />

	<context:annotation-config />  <!-- 激活Bean中定義的注解 -->
    <mvc:annotation-driven validator="validator"/> 

	<!-- 視圖相關(guān)配置 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/" />  <!-- 視圖前綴 -->
		<property name="suffix" value=".jsp" />  <!-- 視圖后綴 -->
	</bean>
	
	<bean id="messageSource"
          class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:errors" />
    </bean>
    
	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
</beans>

在這里,主要是配置了視圖相關(guān)配置,國際化(PS:在這里就是根據(jù)中文和英文網(wǎng)頁顯示不同的錯(cuò)誤提示信息),以及定義了驗(yàn)證相關(guān)的配置。需要注意的是,還需要在mvc命名空間的annotation-driven標(biāo)簽中定義驗(yàn)證程序

(4)兩個(gè)國際化文件errors_zh_CN.properties和errors_en_US.properties:

errors_zh_CN.properties文件:

error.password = \u5BC6\u7801\u662F\u5FC5\u987B\u540C\u65F6\u5305\u542B\u5927\u5199\u5B57\u6BCD\u3001\u5C0F\u5199\u5B57\u6BCD\u548C\u6570\u5B57\u76846-20\u4F4D\u5B57\u7B26
error.username = \u7528\u6237\u540d\u9700\u8981\u0033\u002d\u0032\u0030\u4f4d
error.age = \u5e74\u9f84\u6700\u5927\u662f\u0031\u0032\u0030\u5c81

這里以鍵值對(duì)的形式定義了三個(gè)中文錯(cuò)誤提示信息,需要注意的是使用了“Unicode編碼”,如果開發(fā)工具不能自動(dòng)編碼的話,可以在這個(gè)網(wǎng)頁進(jìn)行手動(dòng)轉(zhuǎn)換編碼:http://tool.chinaz.com/tools/unicode.aspx

errors_en_US.properties文件:

error.password = Passwords are 6-20 bit characters that must contain both upper and lower case letters and digits at the same time.
error.username = username needs 3-20 bit characters
error.age = Max age is 120 years old

(5)實(shí)體類User.java:

package cn.zifangsky.model;

import javax.validation.constraints.Max;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

public class User {
	@Size(min = 3, max = 20, message = "{error.username}")
	private String username;

	@Email
	private String email;

	@Pattern(regexp = "^((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])).{6,20}$", message = "{error.password}")
	private String password;

	@Max(value = 120, message = "{error.age}")
	private int age;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

這里驗(yàn)證了:用戶名必須是3-20位,如果驗(yàn)證不通過則通過配置的“message”參數(shù)根據(jù)語言環(huán)境在前臺(tái)頁面顯示錯(cuò)誤提示信息;郵箱使用默認(rèn)配置驗(yàn)證了郵箱格式是否正確;密碼這一項(xiàng)通過一個(gè)正則表達(dá)式驗(yàn)證了必須是包含大寫字母、小寫字母和數(shù)字的6-20位的字符;年齡驗(yàn)證了最大是120歲

(6)UserController.java這個(gè)controller類:

package cn.zifangsky.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import cn.zifangsky.model.User;

@Controller
public class UserController {

	@RequestMapping(value = "/form")
	public ModelAndView user() {
		ModelAndView modelAndView = new ModelAndView("userForm");
		modelAndView.addObject("user", new User());

		return modelAndView;
	}

	@RequestMapping(value = "/result", method = RequestMethod.POST)
	public ModelAndView processUser(@Valid User user, BindingResult result) {
		ModelAndView modelAndView = new ModelAndView("userResult");
		modelAndView.addObject("u", user);
		// 如果出現(xiàn)驗(yàn)證錯(cuò)誤,則轉(zhuǎn)到"userForm"視圖
		if (result.hasErrors()) {
			modelAndView.setViewName("userForm");
		} else {
			modelAndView.setViewName("userResult");
		}

		return modelAndView;
	}

}

從代碼可以看出,定義了兩個(gè)方法,user方法負(fù)責(zé)處理”/form”請(qǐng)求,然后轉(zhuǎn)到“userForm.jsp”這個(gè)視圖頁面;在processUser方法中,對(duì)用戶輸入的驗(yàn)證由@Valid注解觸發(fā),該注解被遞歸地應(yīng)用到實(shí)體類User的各個(gè)屬性中。同時(shí)在這個(gè)方法中接收了一個(gè)額外的參數(shù)result,該參數(shù)是一個(gè)BindingResult實(shí)例,通過使用該參數(shù)來檢查在將請(qǐng)求參數(shù)映射到實(shí)體類屬性的過程中是否發(fā)生了任何驗(yàn)證錯(cuò)誤。最后是根據(jù)條件轉(zhuǎn)到相關(guān)視圖頁面

(7)三個(gè)前臺(tái)jsp頁面:

i)根目錄下的index.jsp:

<% response.sendRedirect("form.html"); %>

這個(gè)文件就簡單的一句話,在項(xiàng)目啟動(dòng)時(shí)直接請(qǐng)求“form.html”

ii)userForm.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc"%>
<html>
<head>
<title>SpringMVC Form表單驗(yàn)證</title>
<style type="text/css">
.formFieldError {
	background-color: #FAFFBD;
}
</style>
</head>
<body>

	<h3>用戶注冊(cè):</h3>
	<mvc:form modelAttribute="user" action="result.html">
		<table>
			<tr>
				<td><mvc:label path="username">用戶名:</mvc:label></td>
				<td><mvc:input path="username" cssErrorClass="formFieldError" /></td>
				<td><mvc:errors path="username" /></td>
			</tr>
			<tr>
				<td><mvc:label path="email">郵箱:</mvc:label></td>
				<td><mvc:input path="email" cssErrorClass="formFieldError" /></td>
				<td><mvc:errors path="email" /></td>
			</tr>
			<tr>
				<td><mvc:label path="password">密碼:</mvc:label></td>
				<td><mvc:password path="password"
						cssErrorClass="formFieldError" /></td>
				<td><mvc:errors path="password" /></td>
			</tr>
			<tr>
				<td><mvc:label path="age">年齡:</mvc:label></td>
				<td><mvc:input path="age" cssErrorClass="formFieldError" /></td>
				<td><mvc:errors path="age" /></td>
			</tr>
			<tr>
				<td colspan="3"><input type="submit" value="Submit" /></td>
			</tr>
		</table>
	</mvc:form>
</body>
</html>

這個(gè)文件中定義的errors標(biāo)簽就是分別顯示各個(gè)參數(shù)驗(yàn)證之后的錯(cuò)誤提示信息

iii)userResult.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc"%>
<html>
<head>
<title>SpringMVC Form表單驗(yàn)證結(jié)果</title>
</head>
<body>
	<h3>用戶注冊(cè)結(jié)果</h3>
	<table>
		<tr>
			<td>用戶名:</td>
			<td>${u.username}</td>
		</tr>
		<tr>
			<td>郵箱:</td>
			<td>${u.email}</td>
		</tr>
		<tr>
			<td>密碼:</td>
			<td>${u.password}</td>
		</tr>
		<tr>
			<td>年齡:</td>
			<td>${u.age}</td>
		</tr>
	</table>
</body>
</html>

這個(gè)文件只是簡單的信息展示,不多做解釋

三 測試

(1)中文環(huán)境下的錯(cuò)誤提示:

項(xiàng)目啟動(dòng)后,使用中文類型的瀏覽器填寫表單,可以發(fā)現(xiàn),出現(xiàn)錯(cuò)誤后顯示的提示信息如下:

SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入

可以發(fā)現(xiàn),出現(xiàn)了預(yù)期的提示效果

(2)英文環(huán)境下的錯(cuò)誤提示:

由于我裝的瀏覽器是中文的,而且也不想更改瀏覽器的語言,因此我通過在提交表單時(shí)抓包手動(dòng)更改Header中的“Accept-Language”這一項(xiàng)屬性,改成“en-US,en;q=0.5”,相當(dāng)于給服務(wù)端說我是英語環(huán)境(PS:q參數(shù)表示用戶的喜愛度,不用管,隨便設(shè)一個(gè)就行)

SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入

最后的顯示效果如下:

SpringMVC使用Hibernate Validator驗(yàn)證用戶輸入

注:實(shí)際上,應(yīng)該把頁面中其他的一些中文也設(shè)置成國際化形式,那樣就可以在英文環(huán)境中顯示成英文了。不過為了減小理解難度,因此在這里就沒有添加上這個(gè)步驟,當(dāng)然我在后面可能會(huì)單獨(dú)寫一寫SpringMVC的國際化

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI