欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springMVC如何對輸入數(shù)據(jù)校驗實現(xiàn)代碼

 更新時間:2020年10月15日 16:31:50   作者:xqqqiang  
數(shù)據(jù)的校驗是交互式網(wǎng)站一個不可或缺的功能,數(shù)據(jù)驗證分為客戶端驗證和服務(wù)器端驗證,這篇文章主要介紹了springMVC如何對輸入數(shù)據(jù)校驗,需要的朋友可以參考下

前言

數(shù)據(jù)的校驗是交互式網(wǎng)站一個不可或缺的功能,數(shù)據(jù)驗證分為客戶端驗證和服務(wù)器端驗證。前端的js校驗可以涵蓋大部分的校驗職責(zé),如用戶名唯一性,生日格式,郵箱格式校驗等等常用的校驗;但是為了避免用戶繞過瀏覽器,使用http工具直接向后端請求一些違法數(shù)據(jù),服務(wù)端的數(shù)據(jù)校驗也是必要的,可以防止臟數(shù)據(jù)落到數(shù)據(jù)庫中,如果數(shù)據(jù)庫中出現(xiàn)一個非法的郵箱格式,也會讓運維人員頭疼不已,服務(wù)器端驗證是整個應(yīng)用阻止非法數(shù)據(jù)的最后防線,通過在應(yīng)用中編程實現(xiàn)。
客戶端驗證在大多數(shù)情況下,使用 JavaScript 進行客戶端驗證的步驟如下:

  • 編寫驗證函數(shù)。
  • 在提交表單的事件中調(diào)用驗證函數(shù)。
  • 根據(jù)驗證函數(shù)來判斷是否進行表單提交。

服務(wù)器端驗證對于系統(tǒng)的安全性、完整性、健壯性起到了至關(guān)重要的作用。服務(wù)器端驗證Spring MVC 的 Converter 和 Formatter 在進行類型轉(zhuǎn)換時是將輸入數(shù)據(jù)轉(zhuǎn)換成領(lǐng)域?qū)ο蟮膶傩灾担ㄒ环N Java 類型),一旦成功,服務(wù)器端驗證器就會介入。也就是說,在 Spring MVC 框架中先進行數(shù)據(jù)類型轉(zhuǎn)換,再進行服務(wù)器端驗證。在 Spring MVC 框架中可以利用 Spring 自帶的驗證框架驗證數(shù)據(jù),也可以利用 JSR 303 實現(xiàn)數(shù)據(jù)驗證。

JSR303/JSR-349,hibernate validation,spring validation之間的關(guān)系

JSR303是一項標(biāo)準,JSR-349是其的升級版本,添加了一些新特性,他們規(guī)定一些校驗規(guī)范即校驗注解,如@Null,@NotNull,@Pattern,他們位于javax.validation.constraints包下,只提供規(guī)范不提供實現(xiàn)。而hibernate validation是對這個規(guī)范的實踐(不要將hibernate和數(shù)據(jù)庫orm框架聯(lián)系在一起),他提供了相應(yīng)的實現(xiàn),并增加了一些其他校驗注解,如@Email,@Length,@Range等等,他們位于org.hibernate.validator.constraints包下。而萬能的spring為了給開發(fā)者提供便捷,對hibernate validation進行了二次封裝,顯示校驗validated bean時,你可以使用spring validation或者hibernate validation,而spring validation另一個特性,便是其在springmvc模塊中添加了自動校驗,并將校驗信息封裝進了特定的類中。這無疑便捷了我們的web開發(fā)。本文主要介紹在springmvc中自動校驗的機制。

springMVC輸入數(shù)據(jù)校驗實現(xiàn)

首先在maven項目中引入相關(guān)jar包

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
 <groupId>org.hibernate.validator</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>6.0.13.Final</version>
</dependency>
<dependency>
 <groupId>javax.validation</groupId>
 <artifactId>validation-api</artifactId>
 <version>2.0.1.Final</version>
</dependency>
<dependency>
 <groupId>javax.el</groupId>
 <artifactId>javax.el-api</artifactId>
 <version>3.0.0</version>
</dependency>

開啟spring的Valid功能

<mvc:annotation-driven />

創(chuàng)建需要被校驗的實體類

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

//與數(shù)據(jù)庫中users對應(yīng)
public class UserInfo {
  private int id;
  @Pattern(regexp = Constants.USERNAMR, message = Constants.USERNAMRERROR)
  private String username;
  @NotBlank(message = Constants.NAMEERROR)
  private String name;
  @Email(message = Constants.EMAILERROR)
  private String email;
  @Length(min = 6, max = 16, message = Constants.PASSWORDERROR)
  private String password;
  @Pattern(regexp = Constants.PHONE, message = Constants.PHONEERROR)
  private String phoneNum;
  //...get/set方法
}

這些注解還是比較淺顯易懂的,字段上的注解名稱即可推斷出校驗內(nèi)容,每一個注解都包含了message字段,用于校驗失敗時作為提示信息,特殊的校驗注解,如Pattern(正則校驗),還可以自己添加正則表達式。

JSR提供的校驗注解:     
@Null  被注釋的元素必須為 null  
@NotNull  被注釋的元素必須不為 null  
@AssertTrue   被注釋的元素必須為 true  
@AssertFalse  被注釋的元素必須為 false  
@Min(value)   被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值  
@Max(value)   被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值  
@DecimalMin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值  
@DecimalMax(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值  
@Size(max=, min=)  被注釋的元素的大小必須在指定的范圍內(nèi)  
@Digits (integer, fraction)   被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)  
@Past  被注釋的元素必須是一個過去的日期  
@Future   被注釋的元素必須是一個將來的日期  
@Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式  


Hibernate Validator提供的校驗注解: 
@NotBlank(message =)  驗證字符串非null,且長度必須大于0  
@Email 被注釋的元素必須是電子郵箱地址  
@Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)  
@NotEmpty  被注釋的字符串的必須非空  
@Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)

我們將message錯誤信息放在一個Constants類中

public class Constants {
  public static final String PHONE = "^1[3|4|5|7|8][0-9]{9}$";
  public static final String USERNAMR = "^NH[0-9]{7}$";

  public static final String NAMEERROR = "用戶名不能為空";
  public static final String PHONEERROR = "請輸入一個正確的電話號碼";
  public static final String EMAILERROR= "請輸入一個正確的郵箱地址";
  public static final String USERNAMRERROR = "請輸入一個正確的用戶編號";
  public static final String PASSWORDERROR = "密碼的長度為6~16位";
  public static final String DATENOTNULL = "日期非空";
}

在@Controller中校驗數(shù)據(jù)

@Valid 和 BindingResult 是一一對應(yīng)的,如果有多個@Valid,那么每個@Valid后面跟著的BindingResult就是這個@Valid的驗證結(jié)果,順序不能亂

//用戶添加
@RequestMapping("/save.do")
//@PreAuthorize("authentication.principal.username == 'NH1905001'")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String save(@Valid @ModelAttribute(value="userInfo") UserInfo userInfo, BindingResult result) throws Exception {
  if(result.hasErrors()){
    List<FieldError> errors = result.getFieldErrors();
    for (FieldError fieldError : errors) {

      System.out.println("錯誤消息提示:" + fieldError.getDefaultMessage());
      System.out.println("錯誤的字段是?" + fieldError.getField());
      System.out.println(fieldError);
      System.out.println("------------------------");
    }
    return "user-add";
  }else {
    userService.save(userInfo);
    return "redirect:findAll.do";
  }
}

錯誤對象的代表者是 Errors 接口,存儲和暴露關(guān)于數(shù)據(jù)綁定錯誤和驗證錯誤相關(guān)信息的接口,提供了相關(guān)存儲和獲取錯誤消息的方法,具有如下幾個實現(xiàn)類:

  • BindingResult:代表數(shù)據(jù)綁定的結(jié)果,繼承了 Errors 接口;
  • BindException:代表數(shù)據(jù)綁定的異常,它繼承 Exception,并實現(xiàn)了BindingResult,這是內(nèi)部使用的錯誤對象;

Errors接口中的方法

void addAllErrors(Errors var1);

boolean hasErrors();

int getErrorCount();

List<ObjectError> getAllErrors();

boolean hasGlobalErrors();

int getGlobalErrorCount();

List<ObjectError> getGlobalErrors();

@Nullable
ObjectError getGlobalError();

boolean hasFieldErrors();

int getFieldErrorCount();

List<FieldError> getFieldErrors();

@Nullable
FieldError getFieldError();

boolean hasFieldErrors(String var1);

int getFieldErrorCount(String var1);

List<FieldError> getFieldErrors(String var1);

@Nullable
FieldError getFieldError(String var1);

@Nullable
Object getFieldValue(String var1);

@Nullable
Class<?> getFieldType(String var1);

根據(jù)方法名字就可以知道方法的作用

輸出的校驗信息

錯誤消息提示:用戶名不能為空
錯誤的字段是?name
Field error in object 'userInfo' on field 'name': rejected value []; codes [NotBlank.userInfo.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.name,name]; arguments []; default message [name]]; default message [用戶名不能為空]
------------------------
錯誤消息提示:請輸入一個正確的郵箱地址
錯誤的字段是?email
Field error in object 'userInfo' on field 'email': rejected value [111]; codes [Email.userInfo.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@462d227d,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@2a8eb300]; default message [請輸入一個正確的郵箱地址]
------------------------
錯誤消息提示:請輸入一個正確的用戶編號
錯誤的字段是?username
Field error in object 'userInfo' on field 'username': rejected value []; codes [Pattern.userInfo.username,Pattern.username,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.username,username]; arguments []; default message [username],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@72436888]; default message [請輸入一個正確的用戶編號]
------------------------
錯誤消息提示:請輸入一個正確的電話號碼
錯誤的字段是?phoneNum
Field error in object 'userInfo' on field 'phoneNum': rejected value []; codes [Pattern.userInfo.phoneNum,Pattern.phoneNum,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.phoneNum,phoneNum]; arguments []; default message [phoneNum],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@5d528277]; default message [請輸入一個正確的電話號碼]
------------------------
錯誤消息提示:密碼的長度為6~16位
錯誤的字段是?password
Field error in object 'userInfo' on field 'password': rejected value []; codes [Length.userInfo.password,Length.password,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.password,password]; arguments []; default message [password],16,6]; default message [密碼的長度為6~16位]
------------------------

數(shù)據(jù)校驗錯誤信息回顯

controller處理方法的形參pojo定義的對象與此類型同名 ,首字母小寫,此時spring能自動將該對象名為key,此對象作為value,保存到request中。當(dāng)然,也可以通過@Valid @ModelAttribute(value=“userInfo”) UserInfo userInfo自定義名稱。
modelAttribute="userInfo"中userInfo與controller方法的形參pojo定義的對象同名 。
注意頁面需要引入

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<form:form modelAttribute="userInfo" action="${pageContext.request.contextPath}/user/save.do"
  method="post">
  <!-- 正文區(qū)域 -->
  <section class="content"> <!--產(chǎn)品信息-->

  <div class="panel panel-default">
   <div class="panel-heading">用戶信息</div>
   <div class="row data-type">

     <div class="col-md-2 title">用戶名稱</div>
     <div class="col-md-4 data">
      <input type="text" class="form-control" name="username"
        placeholder="用戶名稱" value="">
     </div>
     <div class="col-md-6 data">
      <form:errors path="username" cssStyle="color:red"/>
     </div>
     <div class="col-md-2 title">姓名</div>
     <div class="col-md-4 data">
      <input type="text" class="form-control" name="name"
         placeholder="姓名" value="">
     </div>
     <div class="col-md-6 data">
      <form:errors path="name" cssStyle="color:red"/>
     </div>
     <div class="col-md-2 title">密碼</div>
     <div class="col-md-4 data">
      <input type="password" class="form-control" name="password"
        placeholder="密碼" value="">
     </div>
     <div class="col-md-6 data">
      <form:errors path="password" cssStyle="color:red"/>
     </div>
     <div class="col-md-2 title">郵箱</div>
     <div class="col-md-4 data">
      <input type="text" class="form-control" name="email"
        placeholder="郵箱" value="">
     </div>
     <div class="col-md-6 data">
      <form:errors path="email" cssStyle="color:red"/>
     </div>
     <div class="col-md-2 title">聯(lián)系電話</div>
     <div class="col-md-4 data">
      <input type="text" class="form-control" name="phoneNum"
        placeholder="聯(lián)系電話" value="">
     </div>
     <div class="col-md-6 data">
      <form:errors path="phoneNum" cssStyle="color:red"/>
     </div>
     <div class="col-md-2 title">用戶狀態(tài)</div>
     <div class="col-md-4 data">
      <select class="form-control select2" style="width: 100%"
        name="status">
        <option value="0" selected="selected">關(guān)閉</option>
        <option value="1">開啟</option>
      </select>
     </div>

   </div>
  </div>
  <!--訂單信息/--> <!--工具欄-->
  <div class="box-tools text-center">
   <button type="submit" class="btn bg-maroon">保存</button>
   <button type="button" class="btn bg-default"
     onclick="history.back(-1);">返回</button>
  </div>
  <!--工具欄/--> </section>
  <!-- 正文區(qū)域 /-->
</form:form>

 

在這里插入圖片描述

數(shù)據(jù)校驗錯誤信息回顯方法2

通過model方式在request中存儲指定key與value,如下:

//改變客戶到公海
@RequestMapping("/transformClients.do")
public String transformClientsById(@Valid @ModelAttribute("publicSea") PublicSea publicSea, BindingResult result, Model model) throws Exception {
  if(result.hasErrors()){  
  	model.addAttribute("failueError",failueError.getDefaultMessage());
    model.addAttribute("failueDesc",publicSea.getFailueDesc());
    model.addAttribute("cNumber",publicSea.getcNumber());
    return "publicSea-change";
  }else {
    return "redirect:findAll.do";
  }
}

客戶端代碼

<form action="${pageContext.request.contextPath}/clients/transformClients.do"
   method="post">
  <!-- 正文區(qū)域 -->
  <section class="content"> <!--產(chǎn)品信息-->

   <div class="panel panel-default">
     <div class="panel-heading">跟蹤失敗原因</div>
     <div class="row data-type">
      <input type="text" style="display:none" name="cNumber"
         placeholder="線索Id" value="${cNumber}">
      <div class="col-md-2 title rowHeight2x">跟蹤失敗描述</div>
      <div class="col-md-10 data rowHeight2x">
        <textarea class="form-control" rows="3" placeholder="跟蹤失敗描述"
            name="failueDesc">${failueDesc}</textarea>
      </div>
      <div class="col-md-12 data rowHeight2x">
        <label>${failueError}</label>
      </div>

     </div>
   </div>
   <!--訂單信息/--> <!--工具欄-->
   <div class="box-tools text-center">
     <button type="submit" class="btn bg-maroon">保存</button>
     <button type="button" class="btn bg-default"
        onclick="history.back(-1);">返回</button>
   </div>
   <!--工具欄/--> </section>
  <!-- 正文區(qū)域 /-->
</form>

分組校驗

自定義校驗

手動校驗

基于方法校驗

到此這篇關(guān)于springMVC如何對輸入數(shù)據(jù)校驗的文章就介紹到這了,更多相關(guān)springMVC數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合MyBatisPlus詳解

    SpringBoot整合MyBatisPlus詳解

    這篇文章詳細介紹了SpringBoot整合mybatisplus的全過程,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考一下
    2023-04-04
  • Spring?boot?啟動流程及外部化配置方法

    Spring?boot?啟動流程及外部化配置方法

    平時我們開發(fā)Spring boot 項目的時候,一個SpringBootApplication注解加一個main方法就可以啟動服務(wù)器運行起來,那它到底是怎么運行起來的呢?這篇文章主要介紹了Spring?boot?啟動流程及外部化配置,需要的朋友可以參考下
    2022-12-12
  • JAVA中Context的詳細介紹和實例分析

    JAVA中Context的詳細介紹和實例分析

    這篇文章主要介紹了JAVA中Context的詳細介紹和實例分析,Context是維持android各組件能夠正常工作的一個核心功能類。如果感興趣來學(xué)習(xí)一下
    2020-07-07
  • Java實現(xiàn)多個sheet頁數(shù)據(jù)導(dǎo)出功能

    Java實現(xiàn)多個sheet頁數(shù)據(jù)導(dǎo)出功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)多個sheet頁數(shù)據(jù)導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java網(wǎng)絡(luò)編程之簡單的服務(wù)端客戶端應(yīng)用實例

    Java網(wǎng)絡(luò)編程之簡單的服務(wù)端客戶端應(yīng)用實例

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程之簡單的服務(wù)端客戶端應(yīng)用,以實例形式較為詳細的分析了java網(wǎng)絡(luò)編程的原理與服務(wù)器端客戶端的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Java簡單實現(xiàn)銀行ATM系統(tǒng)

    Java簡單實現(xiàn)銀行ATM系統(tǒng)

    這篇文章主要為大家詳細介紹了Java簡單實現(xiàn)銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中5種方式實現(xiàn)String反轉(zhuǎn)

    Java中5種方式實現(xiàn)String反轉(zhuǎn)

    下面小編就為大家?guī)硪黄狫ava中5種方式實現(xiàn)String反轉(zhuǎn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。
    2016-06-06
  • mybatis-plus批處理IService的實現(xiàn)示例

    mybatis-plus批處理IService的實現(xiàn)示例

    這篇文章主要介紹了mybatis-plus批處理IService的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • IDEA如何解決代碼沒有提示問題

    IDEA如何解決代碼沒有提示問題

    文章介紹了如何解決IDEA中代碼提示功能缺失的問題,首先,需要調(diào)整快捷鍵設(shè)置,將CyclicExpandWord鍵映射為Ctrl+/,其次,確保輸入框中設(shè)置為Basic,然后添加鍵盤快捷鍵Alt+/,如果問題依然存在,可能是由于電腦省電模式導(dǎo)致的,需要取消相關(guān)設(shè)置
    2024-11-11
  • Java優(yōu)雅的關(guān)閉線程池的方法

    Java優(yōu)雅的關(guān)閉線程池的方法

    本文主要介紹了Java如何優(yōu)雅的關(guān)閉線程池,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論