驗證框架 SpringBoot支持JSR-303,Bean等驗證框架 JSR-303 JSR-303是Java的標準驗證框架,已有實現Hibernate validator. JSR-303驗證類型 在MVC中使用JSR-303校驗 可以使用@Validated註解來觸發一次校驗 例子: index ...
驗證框架
SpringBoot支持JSR-303,Bean等驗證框架
JSR-303
JSR-303是Java的標準驗證框架,已有實現Hibernate validator.
JSR-303驗證類型
空檢查 @Null 驗證對象是否為null @NotNull 驗證對象是否不為null, 無法查檢長度為0的字元串 @NotBlank 檢查約束字元串是不是Null還有被Trim的長度是否大於0,只對字元串,且會去掉前後空格. @NotEmpty 檢查約束元素是否為NULL或者是EMPTY. Booelan檢查 @AssertTrue 驗證 Boolean 對象是否為 true @AssertFalse 驗證 Boolean 對象是否為 false 長度檢查 @Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之內 @Length(min=, max=) Validates that the annotated string is between min and max included. 日期檢查 @Past 驗證 Date 和 Calendar 對象是否在當前時間之前 @Future 驗證 Date 和 Calendar 對象是否在當前時間之後 @Pattern 驗證 String 對象是否符合正則表達式的規則 數值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為“”時無法轉換為int,但可以轉換為Stirng為"",Integer為null @Min 驗證 Number 和 String 對象是否大等於指定的值 @Max 驗證 Number 和 String 對象是否小等於指定的值 @DecimalMax 被標註的值必須不大於約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字元串表示.小數存在精度 @DecimalMin 被標註的值必須不小於約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字元串表示.小數存在精度 @Digits 驗證 Number 和 String 的構成是否合法 @Digits(integer=,fraction=) 驗證字元串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。 @Range(min=, max=) 檢查數字是否介於min和max之間. @Range(min=10000,max=50000,message="range.bean.wage") private BigDecimal wage; @Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證) @CreditCardNumber 信用卡驗證 @Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。 @ScriptAssert(lang= ,script=, alias=) @URL(protocol=,host=, port=,regexp=, flags=)
在MVC中使用JSR-303校驗
可以使用@Validated註解來觸發一次校驗
例子:
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post" action="/login"> id:<input type="text" name="id"><br> name:<input type="text" name="name"><br> age:<input type="text" name="age"><br> Email:<input type="text" name="Email"><br> phone:<input type="text" name="phone"><br> <input type="submit" value="提交"> </form> </body> </html>
Persion類
public class Persion { @NotNull(message = "id不能為空") private Integer id; @NotBlank(message = "姓名不能為空") private String name; @Min(value = 1,message = "年齡不能小於1歲") private Integer age; @Email private String Email; @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手機號碼格式錯誤") private String phone; // 省略getter setter toString }
Controller
@Controller public class PersionController { @RequestMapping("/login") @ResponseBody public String login(@Validated Persion persion){ System.out.println(persion); return "success"; } }
結果:
輸入錯誤的情況 ->
Field error in object 'persion' on field 'id': rejected value [12313456131]; codes [typeMismatch.persion.id,typeMismatch.id,typeMismatch.java.lang.Integer,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persion.id,id]; arguments []; default message [id]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'id'; nested exception is java.lang.NumberFormatException: For input string: "12313456131"] Field error in object 'persion' on field 'name': rejected value []; codes [NotBlank.persion.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persion.name,name]; arguments []; default message [name]]; default message [姓名不能為空] Field error in object 'persion' on field 'phone': rejected value [1]; codes [Pattern.persion.phone,Pattern.phone,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persion.phone,phone]; arguments []; default message [phone],[Ljavax.validation.constraints.Pattern$Flag;@31780db2,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@402f9c39]; default message [手機號碼格式錯誤] Field error in object 'persion' on field 'age': rejected value [0]; codes [Min.persion.age,Min.age,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persion.age,age]; arguments []; default message [age],1]; default message [年齡不能小於1歲] Field error in object 'persion' on field 'Email': rejected value [1]; codes [Email.persion.Email,Email.Email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persion.Email,Email]; arguments []; default message [Email],[Ljavax.validation.constraints.Pattern$Flag;@7204f41e,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@7af2bed5]; default message [不是一個合法的電子郵件地址]
輸入正確的情況:
Persion{id=123, name='lgggx', age=1, Email='[email protected]', phone='11122233344'}
獲取參數
@PathVariable
@PathVariable 用於從請求URL中獲取參數並映射到方法參數
例子:
@RequestMapping("/get/{name}/{age}/{id}") @ResponseBody public String getParam(@PathVariable("name") String name, @PathVariable("age") Integer age, @PathVariable("id") Integer id){ System.out.println("name:" + name); System.out.println("age:" + age); System.out.println("id:" + id); return "success";
訪問:http://localhost:8080/get/zhangsan/18/1001
結果:
name:zhangsan age:18 id:1001
文件上傳
MultipartFile
通過MultipartFile 來處理文件上傳
@RequestMapping("/uploads") @ResponseBody public String fileUpload(String name, MultipartFile file) throws IOException { //如果文件不為空 if (file != null && !file.isEmpty()){ //獲取文件名 String fileName = file.getName(); //獲取文件大小 long size = file.getSize(); //返回系統原始文件名 String originalFilename = file.getOriginalFilename(); //返迴文件類型 String contentType = file.getContentType(); //獲取文件輸入流 InputStream inputStream = file.getInputStream(); //拷貝到本地方式1 //使用文件流拷貝文件 //FileOutputStream ops = new FileOutputStream(new File("/" + originalFilename)); //byte[] bytes = new byte[1024]; //int len = 0; // //while((len = inputStream.read(bytes)) > 0){ // ops.write(bytes,0,len); //} //inputStream.close(); //ops.close(); //拷貝到本地方式2 //保存上傳文件到目標文件系統 file.transferTo(new File("E:\\" + originalFilename)); } return "upload success"; }
form表單提交方式必須是post,且設置enctype=”multipart/form-data”
<form method="post" action="/uploads" enctype="multipart/form-data"> name:<input type="text" name="name"><br> file:<input type="file" name="file"><br> <input type="submit" value="提交"/> </form>
Json的使用
@RequestBody 與 @ResponseBody
使用@RequestBody來接收Json,使用@ResponseBody來返回Json
@RequestMapping("/savejson") @ResponseBody public String getJson(@RequestBody User user){ return user; }