溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC使用Hibernate Validator驗證用戶輸入

發布時間:2020-07-11 21:11:06 來源:網絡 閱讀:8146 作者:pangfc 欄目:開發技術

一 簡介

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


二 測試實例

(1)新建一個動態Java web項目,然后下載“Hibernate Validator”的jar包,下載地址:http://hibernate.org/validator/ ,最后是導入必要的幾個jar包和springmvc所需要的jar包,最后的項目結構如下:

SpringMVC使用Hibernate Validator驗證用戶輸入    SpringMVC使用Hibernate Validator驗證用戶輸入

(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處理請求的后綴是.html,同時設置了編碼為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"/> 

	<!-- 視圖相關配置 -->
	<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>

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

(4)兩個國際化文件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

這里以鍵值對的形式定義了三個中文錯誤提示信息,需要注意的是使用了“Unicode編碼”,如果開發工具不能自動編碼的話,可以在這個網頁進行手動轉換編碼: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)實體類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;
	}

}

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

(6)UserController.java這個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);
		// 如果出現驗證錯誤,則轉到"userForm"視圖
		if (result.hasErrors()) {
			modelAndView.setViewName("userForm");
		} else {
			modelAndView.setViewName("userResult");
		}

		return modelAndView;
	}

}

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

(7)三個前臺jsp頁面:

i)根目錄下的index.jsp:

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

這個文件就簡單的一句話,在項目啟動時直接請求“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表單驗證</title>
<style type="text/css">
.formFieldError {
	background-color: #FAFFBD;
}
</style>
</head>
<body>

	<h3>用戶注冊:</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>

這個文件中定義的errors標簽就是分別顯示各個參數驗證之后的錯誤提示信息

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表單驗證結果</title>
</head>
<body>
	<h3>用戶注冊結果</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>

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

三 測試

(1)中文環境下的錯誤提示:

項目啟動后,使用中文類型的瀏覽器填寫表單,可以發現,出現錯誤后顯示的提示信息如下:

SpringMVC使用Hibernate Validator驗證用戶輸入

可以發現,出現了預期的提示效果

(2)英文環境下的錯誤提示:

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

SpringMVC使用Hibernate Validator驗證用戶輸入

最后的顯示效果如下:

SpringMVC使用Hibernate Validator驗證用戶輸入

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女