Spring MVC(十四)--SpringMVC驗證表單

在Spring MVC中提供了驗證器能夠進行服務端校驗,全部的驗證都必須先註冊校驗器,不過校驗器也是Spring MVC自動加載的,在使用Spring MVC校驗器以前首先要下載相關的jar包,下面是個人一些jar所對應的maven依賴:java

 1 <!-- 驗證器所需的包 -->
 2         <dependency>
 3             <groupId>com.fasterxml</groupId>
 4             <artifactId>classmate</artifactId>
 5             <version>1.4.0</version>
 6         </dependency>
 7 
 8         <dependency>
 9             <groupId>org.jboss.logging</groupId>
10             <artifactId>jboss-logging</artifactId>
11             <version>3.3.2.Final</version>
12         </dependency>
13 
14         <dependency>
15             <groupId>org.hibernate.validator</groupId>
16             <artifactId>hibernate-validator</artifactId>
17             <version>6.0.13.Final</version>
18         </dependency>
19 
20         <dependency>
21             <groupId>javax.validation</groupId>
22             <artifactId>validation-api</artifactId>
23             <version>2.0.1.Final</version>
24         </dependency>

其中:spring

  • validator-api-*:提供關於驗證註解的;
  • hibernate-validator-*:是經過hibernate校驗規則的包,他還要依賴classmate和jboss-logging這兩個包;

Spring MVC中有兩種校驗方式,一種是使用JSR 303註解驗證輸入內容,另外一種是使用校驗器。數據庫

1、使用JSR 303註解驗證輸入內容api

spring提供了對bean的校驗功能,經過註解@Valid代表對哪一個Bean須要啓用註解式校驗。這種方式能夠用來對字段進行非空、合法性等的校驗,它還提供了一些校驗規則約束:app

Bean Validate中提供的約束有如下幾種:maven

Hibernate中也提供了一些約束:ide

具體內容可參考這個網站:post

https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/測試

2、使用校驗器網站

有時候除了合法性校驗以外,還須要進行一些業務邏輯校驗,好比用戶名不能重複等,這就須要使用校驗器來完成。使用校驗器須要進行兩步操做:

一、完成校驗器:SpringMVC提供了一個validator接口,咱們只要實現這個接口中的方法便可;

二、綁定到控制器:建立完了校驗器以後要告訴容器須要校驗哪一個控制器,因此須要將校驗器和控制器綁定,綁定的方法很簡單,就是在控制器中寫一個方法並使用註解@InitBinder便可。

下面結合這兩種校驗方式寫一個例子說明。

三 、實例

一、建立一個表單

這個表單用來輸入一些信息

<form id="paramForm" action="<%=basePath%>customer/addCustomer"
                method="post">
                <table>
                    <tr>
                        <td>用戶名:</td>
                        <td><input type="text" name="cusName" id="input_cus_name"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>用戶年齡:</td>
                        <td><input type="text" name="cusAge" id="input_cus_age"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>用戶性別:</td>
                        <td><label for="input_cus_sex1"></label><input type="radio"
                            name="cusSex" id="input_cus_sex1" value="1"><label
                            for="input_cus_sex0"></label><input type="radio" name="cusSex"
                            id="input_cus_sex0" value="0"></td>
                    </tr>
                    <tr>
                        <td>手機號碼:</td>
                        <td><input type="text" name="cusPhone" id="input_cus_phone"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>郵箱地址:</td>
                        <td><input type="text" name="cusEmail" id="input_cus_email"
                            value=""></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td style="text-align: right;"><input type="submit"
                            value="提交" id="addCustomer"></td>
                    </tr>
                </table>
            </form>

由於向後臺傳的是個pojo對象,因此name名稱要和pojo對象屬性保持一致。

二、建立表單中數據對應的pojo,並使用JSR 303校驗字段

public class Customer {
    private Integer cusId;

    @NonNull @Pattern(regexp = "^([a-zA-Z]*[0-9_-]*$)", message = "只能包含字母、數字、下劃線,且不能以數字或下劃線開頭") @Size(min = 8, max = 128) private String cusName;

    @NotNull @Min(18) @Max(40) private Integer cusAge;

    @NotNull private Integer cusSex;

    @NotNull @Size(min = 6, max = 11) @Pattern(regexp = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$", message = "請輸入正確的手機號") private String cusPhone;

    @NotNull @Size(min = 10, max = 20) @Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "請輸入正確的電子郵箱") private String cusEmail;

    public Integer getCusId() {
        return cusId;
    }

    public void setCusId(Integer cusId) {
        this.cusId = cusId;
    }

    public String getCusName() {
        return cusName;
    }

    public void setCusName(String cusName) {
        this.cusName = cusName == null ? null : cusName.trim();
    }

    public Integer getCusAge() {
        return cusAge;
    }

    public void setCusAge(Integer cusAge) {
        this.cusAge = cusAge;
    }

    public Integer getCusSex() {
        return cusSex;
    }

    public void setCusSex(Integer cusSex) {
        this.cusSex = cusSex;
    }

    public String getCusPhone() {
        return cusPhone;
    }

    public void setCusPhone(String cusPhone) {
        this.cusPhone = cusPhone == null ? null : cusPhone.trim();
    }

    public String getCusEmail() {
        return cusEmail;
    }

    public void setCusEmail(String cusEmail) {
        this.cusEmail = cusEmail == null ? null : cusEmail.trim();
    }
}

上面紅色加粗的部分就是使用JSR 303中的約束規則。

三、建立校驗器

這個校驗器用來判斷輸入的用戶名是否是Administrator,若是是則校驗不經過,並給出提示,不然校驗成功;

public class CustomerValidator implements Validator {
/**
     * 檢驗驗證對象是否是Customer類,若是是則進行檢驗
     */
    @Override
    public boolean supports(Class<?> target) {
        return Customer.class.equals(target);
    }

    /**
     * 校驗用戶名是否已經存在
     */
    @Override
    public void validate(Object target, Errors errors) {
        Customer customer = (Customer) target;
        String name = customer.getCusName();
        if (name.equals("Administrator")) {
            errors.rejectValue("cusName", null, "該帳號已被使用!");

        }
    }

}

建立校驗器時只要實現Validator接口並重寫對應的方法便可,supports方法是用來斷定要校驗的bean類型,validate方法用來完成校驗邏輯。

四、建立控制器

@Controller
@RequestMapping("/customer")
public class CustomerController {

    @Autowired
    @Qualifier("customerService")
    CustomerService customerServiceImpl = null;

    /**
     * 綁定驗證器
     * 
     * @param dataBinder
     */ @InitBinder public void bindValidator(DataBinder dataBinder) {
        dataBinder.setValidator(new CustomerValidator());
    }

    /**
     * customer首頁
     * 
     * @param mv
     * @param customer
     * @return
     */
    @RequestMapping("index")
    public ModelAndView indexCustomer(ModelAndView mv, Customer customer) {
        mv.addObject("customer", customer);
        mv.setViewName("index");
        mv.addObject("customer", customer);
        return mv;
    }

    @RequestMapping(value = "addCustomer", method = RequestMethod.POST)
    public ModelAndView validByAnnotation(@Valid Customer customer, Errors errors,
            RedirectAttributes redirectAttributes) {
        ModelAndView mv = new ModelAndView();
        // 判斷是否存在錯誤
        if (errors.hasErrors()) {
            List<FieldError> errorList = errors.getFieldErrors();
            for (FieldError fieldError : errorList) {
                System.out.println("field:" + fieldError.getField() + ";errors:" + fieldError.getDefaultMessage());
            }
            mv.addObject("errorList", errorList);
            mv.setView(new MappingJackson2JsonView());
        } else {
            boolean insert = customerServiceImpl.addCustomer(customer);
            redirectAttributes.addFlashAttribute("customer", customer);
            if (insert) {
                mv.setViewName("redirect:./customer/index");
            } else {
                mv.setViewName("redirect:./customer/error");
            }
        }
        return mv;
    }

    /**
     * 出錯頁面
     * 
     * @param mv
     * @param customer
     * @return
     */
    @RequestMapping("error")
    public ModelAndView errorInfo(ModelAndView mv, Customer customer) {
        mv.addObject("customer", customer);
        mv.setViewName("customer/error");
        return mv;
    }

}

這個控制器邏輯以下:

  • 首先在方法bindValidator上使用註解@InitBinder完成校驗器和控制器的綁定;
  • 而後使用註解@Valid對Customer進行校驗,這樣校驗器中就能經過第一個方法的判斷;
  • 經過Error對象判斷是否是有錯誤,若是有錯誤表明校驗失敗,失敗後打印出失敗的信息並返回JDON視圖;
  • 若是校驗成功則將數據保存在數據庫,保存時也判斷是否成功,保存成功則返回index頁面,不然返回error頁面

五、測試

先來測試JSR 303的校驗,首先在頁面輸入如下信息,輸入信息都是不經過校驗的:

返回信息以下:

其實就是校驗失敗的提示信息,我是直接返回JSON視圖的,因此說明JSR 303校驗生效了。下面輸入一些合法數據進行測試:

點擊提交以後的結果以下:

保存成功並進入index頁面,校驗成功。

下面測試校驗器功能,須要釋放綁定邏輯,輸入如下正確信息,並讓用戶名爲Administrator

 

提交以後的結果以下:

從提示信息看出校驗器校驗沒用經過並給出提示信息,說明校驗經過了。

以上就是Spring MVC中對錶單進行服務端校驗的內容。

相關文章
相關標籤/搜索