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

Spring MVC InitBinder驗(yàn)證方法

 更新時(shí)間:2018年03月14日 16:34:13   作者:橫渡  
這篇文章主要介紹了Spring MVC InitBinder驗(yàn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

使用InitBinder做驗(yàn)證的情況一般會(huì)在此Controller中提交的數(shù)據(jù)需要有一些是業(yè)務(wù)性質(zhì)的,也即比較復(fù)雜的驗(yàn)證情況下才會(huì)使用。大部份簡(jiǎn)單的表單驗(yàn)證,使用annotation驗(yàn)證即可以解決。

Annotation驗(yàn)證使用方法可參見(jiàn):http://m.fzitv.net/article/136448.htm

這里需要注意的一點(diǎn):InitBinder和Annotation兩種驗(yàn)證只能二選一,如果使用了InitBinder,就不能使用Annotation驗(yàn)證。

前面的web.xml和spring.xml的配置就不再重復(fù),可參見(jiàn)上面鏈接中的配置。一模一樣。

直接上代碼:

1、User5 model實(shí)體類(lèi)

package com.my.controller.bean;
import java.util.Date;
public class User5 {
  
  private long id;
  private String name;
  private String password;
  private Date createTime;
  private int age;
  
  public long getId() {
    return id;
  }
  public void setId(long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public Date getCreateTime() {
    return createTime;
  }
  public void setCreateTime(Date createTime) {
    this.createTime = createTime;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

2、新增一個(gè)Validator:

package com.my.controller.validator;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.my.controller.bean.User5;

@Component
public class TestValidator implements Validator {

  @Override
  public boolean supports(Class<?> paramClass) {
    return User5.class.equals(paramClass);
  }

  @Override
  public void validate(Object obj, Errors errors) {
    User5 user = (User5) obj;
    
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "valid.name", null, "");
    
    if(user.getAge() < 18) {
      errors.rejectValue("age", "valid.ageMin", new Object[]{"age" ,18}, "年齡不能小于{1}歲");
    }
  }
}

這里需要加入@Component,注入DI

3、Controller

package com.my.controller;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.my.controller.bean.User5;
@Controller
@RequestMapping(value="binder")
public class TestInitBinderController {
  
  @Autowired
  @Qualifier(value="testValidator")
  private Validator validator;
  
  @InitBinder
  private void initBinder(WebDataBinder binder) {
    binder.setValidator(validator);
  }
  
  @RequestMapping(method=RequestMethod.GET)
  public String index() {
    return "/TestInitBinder/index";
  }
  
  @RequestMapping(value="add", method=RequestMethod.POST)
  public ModelAndView add(@ModelAttribute @Valid User5 user, BindingResult result) {
    ModelAndView view = new ModelAndView("TestInitBinder/index");
    view.addObject("user", user);
    
    if(result.hasErrors()) {
      List<FieldError> errs = result.getFieldErrors();
      Map<String, String> mapErrors = new LinkedHashMap<String, String>();
      for(FieldError err : errs) {
        System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField()
            + "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage());
        mapErrors.put(err.getField(), err.getDefaultMessage());
        view.addObject("errors", mapErrors);
      }
      return view;
    }
    return view;
  }
}

把Validator注入到Controller中。

事實(shí)上,使用InitBinder,在add controller中的err.getDefaultMessage()方法是取不到對(duì)應(yīng)正確的message的??梢钥醋詈蟮妮斎氪蛴〗Y(jié)果。

4、View

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="st" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Init binder</title>
</head>
<body>
  <form:form action="/TestSpringMvc1/binder/add" method="post" modelAttribute="user5">
    User name:<input type="text" id="name" name="name" value="${user.name}" /><br/>
    Password:<input type="text" id="password" name="password" value="${user.password}" /><br/>
    Age:<input type="text" id="age" name="age" value="${user.age}" /><br/>
    <input type="submit" value="Add"/>
    <hr/>
    Error:<br/>
    <form:errors path="*"></form:errors>
  </form:form>
</body>
</html>

注意,這里只能使用<form:errors />來(lái)取得錯(cuò)誤信息,且,這個(gè)<form:errors/>一定要在<form:form/>當(dāng)中。

5、結(jié)果測(cè)試

點(diǎn)擊Add button:

打印輸出:

可以看到,這里取不到錯(cuò)誤的正確信息

事實(shí)上,在一個(gè)非常復(fù)雜表單頁(yè)面,里頭所提交的數(shù)據(jù)驗(yàn)證有一定的業(yè)務(wù)邏輯性時(shí),InitBinder應(yīng)該都不多用,因?yàn)楹芏鄷r(shí)候我們可以使用一個(gè)Map,把errors插入進(jìn)去,在頁(yè)面讀取即可。比如:

Map<String, String> errors;
errors.add("name", "user name can NOT be empty!");
:
:

頁(yè)面中只需要使用:

<span style="color:red;">${errors.name}<span>

即可。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis?redisTemplate數(shù)據(jù)類(lèi)型基礎(chǔ)操作

    redis?redisTemplate數(shù)據(jù)類(lèi)型基礎(chǔ)操作

    這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類(lèi)型基礎(chǔ)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java使用開(kāi)源Rxtx實(shí)現(xiàn)串口通訊

    Java使用開(kāi)源Rxtx實(shí)現(xiàn)串口通訊

    這篇文章主要為大家詳細(xì)介紹了Java使用開(kāi)源Rxtx實(shí)現(xiàn)串口通訊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Scala入門(mén)之List使用詳解

    Scala入門(mén)之List使用詳解

    這篇文章主要介紹了Scala入門(mén)之List使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • IntelliJ IDEA如何增加右鍵菜單

    IntelliJ IDEA如何增加右鍵菜單

    本文描述了在IntelliJ IDEA安裝后右鍵文件夾沒(méi)有相關(guān)選項(xiàng)的解決方案,通過(guò)打開(kāi)注冊(cè)表編輯器并新建菜單項(xiàng),將IntelliJ IDEA添加到右鍵菜單中,并設(shè)置其圖標(biāo)和執(zhí)行路徑,最后,通過(guò)測(cè)試驗(yàn)證功能是否正常
    2025-01-01
  • zookeeper的Leader選舉機(jī)制源碼解析

    zookeeper的Leader選舉機(jī)制源碼解析

    這篇文章主要為大家介紹了zookeeper的Leader選舉源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問(wèn)題及解決方法

    一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問(wèn)題及解決方法

    這篇文章主要介紹了一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問(wèn)題及解決方法,需要的朋友可以參考下
    2018-11-11
  • java讀取某個(gè)文件夾下的所有文件實(shí)例代碼

    java讀取某個(gè)文件夾下的所有文件實(shí)例代碼

    這篇文章主要介紹了java讀取某個(gè)文件夾下的所有文件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java中Sentinel框架詳解

    Java中Sentinel框架詳解

    Sentinel是一個(gè)高可用、高擴(kuò)展、高穩(wěn)定性的開(kāi)源流量控制和熔斷降級(jí)框架,可以在分布式系統(tǒng)中實(shí)現(xiàn)實(shí)時(shí)的流量控制,防止系統(tǒng)因流量過(guò)大導(dǎo)致系統(tǒng)崩潰和服務(wù)降級(jí),Sentinel面向所有的Java應(yīng)用,本文就給大家詳細(xì)介紹一下Java中Sentinel框架,需要的朋友可以參考下
    2023-06-06
  • 關(guān)于報(bào)錯(cuò)IDEA Terminated with exit code 1的解決方法

    關(guān)于報(bào)錯(cuò)IDEA Terminated with exit code 

    如果在IDEA構(gòu)建項(xiàng)目時(shí)遇到下面這樣的報(bào)錯(cuò)IDEA Terminated with exit code 1,那必然是Maven的設(shè)置參數(shù)重置了,導(dǎo)致下載錯(cuò)誤引起的,本文給大家分享兩種解決方法,需要的朋友可以參考下
    2022-08-08
  • Java基礎(chǔ)之內(nèi)存泄漏與溢出詳解

    Java基礎(chǔ)之內(nèi)存泄漏與溢出詳解

    今天帶大家來(lái)了解一下Java內(nèi)存泄漏與溢出的知識(shí),文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java基礎(chǔ)的各位小伙伴呢很有幫助喲,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

桦南县| 莎车县| 米林县| 张家港市| 辉南县| 盘锦市| 克山县| 白城市| 岐山县| 米脂县| 哈巴河县| 杨浦区| 洞口县| 肥西县| 沙雅县| 张家口市| 阆中市| 景德镇市| 和平区| 永德县| 巴中市| 堆龙德庆县| 鄂托克前旗| 晋江市| 东乌珠穆沁旗| 肥西县| 临邑县| 临汾市| 兴山县| 卓资县| 丹寨县| 柞水县| 铜陵市| 滦平县| 丽水市| 保山市| 天镇县| 江川县| 红原县| 中江县| 红原县|