最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

JSR303/JSR-349,hibernate validation,spring validation之間的關系

JSR303是一項標準,JSR-349是其的升級版本,添加了一些新特性,他們規(guī)定一些校驗規(guī)范即校驗注解,如@Null,@NotNull,@Pattern,他們位于javax.validation.constraints包下,只提供規(guī)范不提供實現(xiàn)。而hibernate validation是對這個規(guī)范的實踐(不要將hibernate和數(shù)據(jù)庫orm框架聯(lián)系在一起),他提供了相應的實現(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項目中引入相關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對應
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 是一一對應的,如果有多個@Valid,那么每個@Valid后面跟著的BindingResult就是這個@Valid的驗證結果,順序不能亂

//用戶添加
@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 接口,存儲和暴露關于數(shù)據(jù)綁定錯誤和驗證錯誤相關信息的接口,提供了相關存儲和獲取錯誤消息的方法,具有如下幾個實現(xiàn)類:

  • BindingResult:代表數(shù)據(jù)綁定的結果,繼承了 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中。當然,也可以通過@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">關閉</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>

分組校驗

自定義校驗

手動校驗

基于方法校驗

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

相關文章

  • SpringBoot實現(xiàn)二維碼掃碼登錄的原理及項目實踐

    SpringBoot實現(xiàn)二維碼掃碼登錄的原理及項目實踐

    本文主要介紹了SpringBoot實現(xiàn)二維碼掃碼登錄的原理及項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • String.trim()消除不了空格的問題及解決

    String.trim()消除不了空格的問題及解決

    這篇文章主要介紹了String.trim()消除不了空格的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 關于Java實現(xiàn)HttpServer模擬前端接口調(diào)用

    關于Java實現(xiàn)HttpServer模擬前端接口調(diào)用

    這篇文章主要介紹了關于Java實現(xiàn)Http?Server模擬前端接口調(diào)用,Http?協(xié)議是建立在?TCP?協(xié)議之上的協(xié)議,所以能用?TCP?來自己模擬一個簡單的?Http?Server?當然是可以的,需要的朋友可以參考下
    2023-04-04
  • JAVA 十六進制與字符串的轉(zhuǎn)換

    JAVA 十六進制與字符串的轉(zhuǎn)換

    筆者前幾日在開服過程中需要將字符串轉(zhuǎn)化成為16進制的字符串,在網(wǎng)上找到了一些方法嘗試之后,均發(fā)現(xiàn)存在一個問題-->字符串轉(zhuǎn)為16進制后再轉(zhuǎn)回來,英文正常,中文出現(xiàn)亂碼
    2009-05-05
  • SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼

    SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼

    圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • spring cloud config和bus組件實現(xiàn)自動刷新功能

    spring cloud config和bus組件實現(xiàn)自動刷新功能

    今天通過本文給大家介紹spring cloud config和bus組件實現(xiàn)自動刷新功能,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-10-10
  • 基于Maven導入pom依賴很慢的解決方案

    基于Maven導入pom依賴很慢的解決方案

    這篇文章主要介紹了Maven導入pom依賴很慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解設計模式在Spring中的應用(9種)

    詳解設計模式在Spring中的應用(9種)

    這篇文章主要介紹了詳解設計模式在Spring中的應用(9種),詳細的介紹了這9種模式在項目中的應用,具有一定的參考價值,感興趣的可以了解一下
    2019-04-04
  • java IO實現(xiàn)電腦搜索、刪除功能的實例

    java IO實現(xiàn)電腦搜索、刪除功能的實例

    下面小編就為大家?guī)硪黄猨ava IO實現(xiàn)電腦搜索、刪除功能的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 簡單了解java局部變量與成員變量的區(qū)別

    簡單了解java局部變量與成員變量的區(qū)別

    這篇文章主要介紹了簡單了解java局部變量與成員變量的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10

最新評論

迁西县| 安岳县| 金昌市| 江城| 南汇区| 小金县| 永修县| 西青区| 阜新市| 铁岭县| 沙田区| 诸暨市| 迁西县| 米泉市| 东山县| 余干县| 宜州市| 汝南县| 德安县| 洛川县| 波密县| 曲麻莱县| 民和| 迭部县| 蒲江县| 牙克石市| 措勤县| 尉氏县| 东山县| 简阳市| 多伦县| 资源县| 榆树市| 台东县| 沂水县| 绥江县| 安图县| 延津县| 香格里拉县| 南川市| 肇源县|