1. 程式人生 > >SpringBoot2學習筆記(四)Web技術

SpringBoot2學習筆記(四)Web技術

一.驗證框架

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=) 檢查數字是否介於minmax之間. @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=) 引自:https://www.cnblogs.com/yangzhilong/p/3724967.html

在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";
    }
}

結果:

測試1,輸入錯誤資訊
這裡寫圖片描述
結果1

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.valid[email protected]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.valid[email protected]7af2bed5]; default message [不是一個合法的電子郵件地址]

測試2,輸入一個正確資訊
這裡寫圖片描述
結果2

Persion{id=123, name='lgggx', age=1, Email='[email protected]', phone='18750712756'}

二.獲取引數

@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";
    }
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;
 }

五.JavaWeb三大元件(Servlet,Filter,Listener)

六.錯誤處理

定製錯誤頁面

SpringBoot定製處理頁面只需要將在類路徑下靜態資原始檔夾下新建一個error資料夾,然後將相應錯誤狀態碼所對應的錯誤頁面儲存在裡面即可
這裡寫圖片描述

4xx.html:代表出現4xx錯誤狀態的情況下就會預設跳轉到4xx.html錯誤處理頁面
5xx.html:代表出現5xx錯誤狀態的情況下就會預設跳轉到5xx.html錯誤處理頁面
404.html:以準確的狀態嗎命名錯誤頁面,則此頁面只會處理相應的錯誤狀態,對於其他的4xx錯誤不會進行處理,例如 404.html只會處理404錯誤碼
錯誤頁面匹配的優先順序以命名的精確度從高到低,命名越準確,優先順序越高

定製錯誤響應Json資料

七.國際化

使用thymeleaf作為檢視處理
可以通過在類路徑下編寫國際化處理檔案實現
這裡寫圖片描述

en_US結尾 : 表示英文
zh_CN結尾 : 表示中文

例子:

i18n.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p th:text="#{word_1}">Hello World</p>
    <p th:text="#{word_2}">I like Java</p>
</body>
</html>

國際化處理檔案

web.properties

word_1=Hello World
word_2=I like Java

web_en_US.properties

word_1=Hello World
word_2=I like Java

web_zh_CN.properties

word_1=你好 世界
word_2=我喜歡Java

檢視跳轉,使用配置類處理

@Configuration
public class WebMvcConf {

    @Bean
    public WebMvcConfigurer myWebMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/index").setViewName("index");
                registry.addViewController("/i18n").setViewName("i18n");
            }
        };

    }
}

配置國際化資原始檔路徑application.properties

# 配置國際化資源路徑:路徑/名字
spring.messages.basename=i18n/word

測試結果:

設定瀏覽器語言環境為中文
這裡寫圖片描述
設定瀏覽器語言環境為英文
這裡寫圖片描述

相關推薦

SpringBoot2學習筆記Web技術

一.驗證框架 SpringBoot支援JSR-303,Bean等驗證框架 JSR-303 JSR-303是Java的標準驗證框架,已有實現Hibernate validator. JSR-303驗證型別 空檢查 @Null 驗證

Java Web學習筆記

ServletConfig 封裝了Servlet的配置資訊,並且可以獲取ServletContext物件 1.配置初始化引數; 2.獲取初始化引數: - getInitParameter(String name):獲取指定引數名的初始化引數 - getINitParameterN

Java nio 學習筆記 淘寶2012校招技術筆試題

 實現五:統計一個單詞可重複的英文檔案(假設4G)中每個單詞出現的次數,把結果按照英文排序放入一個檔案中。並能夠檢索特定單詞的出現次數。由於檔案過大,不重複單詞總數有限,需要考慮到執行速度和記憶體使用情況。(淘寶筆試技術題) import java.io.File; imp

Struts2學習筆記:action中訪問request,session以及applicationContext等web資源的方法

在struts2的action中有時會需要訪問request,session以及applicationContext等web資源,這裡我總結了四種可行的方法,供讀者參考。 (1)使用ActionContext <pre name="code" class="java

Java for Web學習筆記:Servlet2HelloServlet

繼承關係: javax.servlet.GenericServlet –》javax.servlet.http.HttpServlet。 405返回 如果我們不重寫Servlet的doGet而採用HTTP GET的方式,將返回405 將返回405 Method Not Allowed。 如果我們重寫do

Cocos2d-x學習筆記 布景層的加入移除

dcl from position 顏色 顯示地圖 idt col 分享 學習 布景層類也就是CCLayer類,每一個遊戲場景中都能夠有非常多層,每一層負責各自的任務。顯示地圖、顯示人物等。同一時候層還是一個容器,能夠放入文本、圖片和菜單。構成遊戲中一個個UI。這次

機器學習筆記機器學習可行性分析

資料 表示 image 隨機 訓練樣本 -s mage 例如 lin 從大量數據中抽取出一些樣本,例如,從大量彈珠中隨機抽取出一些樣本,總的樣本中橘色彈珠的比例為,抽取出的樣本中橘色彈珠的比例為,這兩個比例的值相差很大的幾率很小,數學公式表示為: 用抽取到的樣本作為訓練

Python_sklearn機器學習學習筆記decision_tree決策樹

min n) 空間 strong output epo from 標簽 ict # 決策樹 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.

Python學習筆記 列表生成式_生成器

rec triangle 小寫 ont 無限 end clas 普通 執行過程 筆記摘抄來自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431

Unity3D之Mecanim動畫系統學習筆記:Animation State

大致 面板 輸入 jpg any 動畫播放 速度 nsf 顯示 動畫的設置 我們先看看Animation Clip的一些設置: Loop time:動畫是否循環播放。 下面出現了3個大致一樣的選項: Root Transform Rotation:表示為播放動畫

.net core 2.0學習筆記:遷移.net framework 工程到.net core

編譯 its evel hashtable ref 學習筆記 inline null 創建 在遷移.net core的過程中,第一步就是要把.net framework 工程的目標框架改為.net core2.0,但是官網卻沒有提供轉換工具,需要我們自己動手完成了

ES6學習筆記—— async 函數

ons fst cte code span pre getname 普通 聲明 await 是 async wait 的簡寫, 是 generator 函數的語法糖。 async 函數的特點: async 聲明一個方法是異步的,await 則等待這個異步方法執行的完

Hibernate學習筆記 --- 映射基本數據類型的List集合

varchar prim drop n) 進行 lis auth pos 方案 集合按其內元素的數據類型分為兩種:基本數據類型集合及復雜對象類型集合,Hibernate對於兩類集合提供不同的映射方式。(在類上以@Embeddable註解的復雜對象數據類型處理方式同基本數據類

java學習筆記:import語法

employee sign cnblogs java 調用 變量賦值 temp 職位 求職 Import 語法是給編譯器尋找特定類的適當位置的一種方法。 創建一個Employee 類,包括四個實體變量姓名(name),年齡(age),職位(designation)和薪水(s

Cesium學習筆記Camera

ttr can str efault 簡單的 list 事件處理 get provider http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相機控制場景中的視野。操作相機的方法有很多,如

python學習筆記-數據類型

rand 兩個 urn 浪費 line 平年 randint .com .cn 0. 在 Python 中的數據類型詳解 http://www.cnblogs.com/scios/p/8026576.html 1. 為什麽布爾類型(bool)的 True 和 False 分

Nodejs學習筆記-----Buffer

pretty 成員 保存 n) tin 設置 amp 個數 普通 Node.js Buffer(緩沖區) JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。 但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buf

Elasticsearch學習筆記ElasticSearch分布式機制

clas cse 負載均衡 丟失 數據 不可 分布式 復雜 發生 一、Elasticsearch對復雜分布式機制透明的隱藏特性 1、分片機制: (1)index包含多個shard,每個shard都是一個最小工作單元,承載部分數據,lucen

DeepLearning.ai學習筆記卷積神經網絡 -- week1 卷積神經網絡基礎知識介紹

除了 lock 還需要 情況 好處 計算公式 max 位置 網絡基礎 一、計算機視覺 如圖示,之前課程中介紹的都是64* 64 3的圖像,而一旦圖像質量增加,例如變成1000 1000 * 3的時候那麽此時的神經網絡的計算量會巨大,顯然這不現實。所以需要引入其他的方法來

python學習筆記字符串及字符串操作

默認 小寫字母 是不是 swap git 查找字符 英文 去掉 title 字符串   字符串可以存任意類型的字符串,比如名字,一句話等等。 字符串還有很多內置方法,對字符串進行操作,常用的方法如下: 1 name1=‘hello world‘ 2 print(nam