1. 程式人生 > >SpringMVC_18_JSR303資料校驗 和 提示訊息的國際化

SpringMVC_18_JSR303資料校驗 和 提示訊息的國際化

作用,在註冊介面判斷你的註冊資料是否合法,比如是否符合一個基本的郵箱格式。

  • JSR 303 是Java為Bean資料合法性校驗提供的標準框架,它已經包含在JavaEE6.0中.

  • JSR 303 通過在Bean屬性上標註類似於@NotNull、@Max等標準的註解指定校驗規則,並通過標準的驗證介面對Bean進行驗證。

在這裡插入圖片描述

  • Hibernate Validator是JSR 303 的一個參考實現,除支援所有標準的校驗註解外,它還支援以下的擴充套件註解

在這裡插入圖片描述

一、如何校驗?註解?

①使用JSR 303 驗證標準

②加入hibernate validator驗證框架的jar包

在這裡插入圖片描述

③在SpringMVC配置檔案中新增mvc:annotation-driven/

④需要在bean的屬性上新增對應的註解

package com.springmvc.crud.entities;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.
annotation.NumberFormat; import javax.validation.constraints.Past; import java.util.Date; public class Employee { private Integer id; @NotEmpty //注意這裡 private String lastName; @Email //注意這裡 private String email; //1 male 0 female private Integer gender; private Department department;
@Past //注意這裡 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birth; @NumberFormat(pattern = "#,###,###.#") private Float salary; 省略get/set,toString public Employee(Integer id, String lastName, String email, Integer gender, Department department) { this.id = id; this.lastName = lastName; this.email = email; this.gender = gender; this.department = department; } public Employee() { } }

⑤在目標方法bean型別的前面新增@valid註解

之前的程式碼

@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String save(Employee employee, BindingResult result){

    System.out.println(employee);

    if(result.getErrorCount()>0){
        System.out.println("出錯了!");

        for(FieldError error:result.getFieldErrors()){
            System.out.println(error.getField()+":"+error.getDefaultMessage());
        }
    }

    employeeDao.save(employee);
    return "redirect:/emps";
}

現在的程式碼

@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String save(@Valid Employee employee, BindingResult result){  //注意這裡

    System.out.println(employee);

    if(result.getErrorCount()>0){
        System.out.println("出錯了!");

        for(FieldError error:result.getFieldErrors()){
            System.out.println(error.getField()+":"+error.getDefaultMessage());
        }
    }

    employeeDao.save(employee);
    return "redirect:/emps";
}

執行結果

在這裡插入圖片描述

在這裡插入圖片描述

二、驗證出錯轉向到哪一個頁面?

可以利用BindingResult 當出現了提交錯誤,在這裡處理錯誤進行轉發頁面等等。

@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String save(@Valid Employee employee, BindingResult result,
                   Map<String,Object> map){

    System.out.println(employee);

    if(result.getErrorCount()>0){
        System.out.println("出錯了!");

        for(FieldError error:result.getFieldErrors()){
            System.out.println(error.getField()+":"+error.getDefaultMessage());
        }

        //若驗證出錯,則轉向定製的頁面
        map.put("departments",departmentDao.getDepartments());
        return "input";

    }

    employeeDao.save(employee);
    return "redirect:/emps";
}

或者

@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String save(@Valid Employee employee, Errors result,  //注意這裡的EEors
                   Map<String,Object> map){

    System.out.println(employee);

    if(result.getErrorCount()>0){
        System.out.println("出錯了!");

        for(FieldError error:result.getFieldErrors()){
            System.out.println(error.getField()+":"+error.getDefaultMessage());
        }

        //若驗證出錯,則轉向定製的頁面
        map.put("departments",departmentDao.getDepartments());
        return "input";

    }

    employeeDao.save(employee);
    return "redirect:/emps";
}

三、錯誤訊息?如何顯示,如何把錯誤訊息進行國際化

錯誤訊息的顯示:

在input.jsp頁面新增以下標籤即可。path="*"的時候意味著顯示所有的錯誤資訊。

<form:errors path="*"></form:errors>

在這裡插入圖片描述

要是我們想要錯誤訊息顯示到相應的位置呢?只需要在相應的jsp原始碼相應的text後面,新增

<form:errors path="指定的名稱"></form:errors>
LastName: <form:input path="lastName"/>
<form:errors path="lastName"></form:errors>
Email:<form:input path="email"/>
<form:errors path="email"></form:errors>
Birth:<form:input path="birth"/>
<form:errors path="birth"></form:errors>

在這裡插入圖片描述

by the way:提示訊息的國際化

第一步:新建一個i18n.properties

寫入國際化的資料

NotEmpty.employee.lastName=^^LastName姓名不能為空
Email.employee.email=Email地址不正確
Past.employee.birth=Birth不能輸入一個將來的時間

第二步,在springmvc.xml中配置這個資原始檔

<!--配置國際化資原始檔-->
<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="i18n"></property>
</bean>

在這裡插入圖片描述