個人博客網:https://wushaopei.github.io/ (你想要這里多有)
一、Restful風格
1、Restful風格的介紹
Restful 一種軟件架構風格、設計風格,而不是標准,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
REST(英文:Representational State Transfer,簡稱REST)描述了一個架構樣式的網絡系統,比如 web 應用程序。在目前主流的三種Web服務交互方案中,REST相比於SOAP(Simple Object Access protocol,簡單對象訪問協議)以及XML-RPC更加簡單明了,無論是對URL的處理還是對Payload的編碼,REST都傾向於用更加簡單輕量的方法設計和實現。值得注意的是REST並沒有一個明確的標准,而更像是一種設計的風格。
原則條件
REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。
Web 應用程序最重要的 REST 原則是,客戶端和服務器之間的交互在請求之間是無狀態的。從客戶端到服務器的每個請求都必須包含理解請求所必需的信息。如果服務器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態請求可以由任何可用服務器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。
在服務器端,應用程序狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、數據庫記錄、算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個唯一的地址。所有資源都共享統一的接口,以便在客戶端和服務器之間傳輸狀態。使用的是標准的 HTTP 協議,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應用程序狀態的引擎,資源表示通過超鏈接互聯。
干貨(簡單明了):
Restful是一種設計風格。對於我們Web開發人員來說。就是使用一個url地址表示一個唯一的資源。然后把原來的請求參數加入到請求資源地址中。然后原來請求的增,刪,改,查操作。改為使用HTTP協議中請求方式GET、POST、PUT、DELETE表示。
- 把請求參數加入到請求的資源地址中
- 原來的增,刪,改,查。使用HTTP請求方式,POST、DELETE、PUT、GET分別一一對應。
二、如何學習restful風格,這里需要明確兩點:
1、就是把傳統的請求參數加入到請求地址是什么樣子?
傳統的方式是:
比如:http://ip:port/工程名/資源名?請求參數
舉例:http://127.0.0.1:8080/springmvc/book?action=delete&id=1
restful風格是:
請求的動作刪除由請求方式delete決定
2、restful風格中請求方式GET、POST、PUT、DELETE分別表示查、增、改、刪。
3、SpringMVC中如何發送GET請求、POST請求、PUT請求、DELETE請求
我們知道發起GET請求和POST請求,只需要在表單的form標簽中,設置method=”get” 就是GET請求。
設置form標簽的method=”post”。就會發起POST請求。而PUT請求和DELETE請求。要如何發起呢。
- 要有post請求的form標簽
- 在form表單中,添加一個額外的隱藏域_method=”PUT”或_method=”DELETE”
- 在web.xml中配置一個Filter過濾器org.springframework.web.filter.HiddenHttpMethodFilter(注意,這個Filter一定要在處理亂碼的Filter后面)
三、Restful風格的Controller如何實現
1、Controller實現代碼
2、restful風格的jsp頁面
四、Restful風格在高版本Tomcat中無法轉發到jsp頁面
在Tomcat8之后的一些高版本,使用restful風格訪問然后轉發到jsp頁面。就會有如下的錯誤提示:
解決有兩個方法:
1、在需要跳轉去的頁面中設置當前是錯誤頁面isErrorPage="true"
2、在put或delete方法中,使用重定向返回
五、@PathVariable 路徑參數獲取
前面我們已經知道如何編寫和配置restful風格的請求和控制器。
那么 現在的問題是。如何接收restful風格請求的參數。比如前面的id值。
第一種情況,一個path參數:
第二種情況,多個path參數:
六、Restful風格實現的CRUD圖書
把前面的傳統請求方式的圖書的CRUD換成剛剛講的Restful風格的圖書模塊的CRUD。只需要修改頁面端的請求方式和地址,以及服務器端Controller的接收。
1、Restful風格的crud工程的搭建
2、列表功能實現
Controller中的代碼:
請求方式:
<a href="${ pageContext.request.contextPath }/book">圖書管理</a>
3、刪除功能實現
Controller中的代碼:
到web.xml中去配置 支持restful風格的Filter過濾器
bookList.jsp中,需要修改提交的方式:
4、添加功能實現
bookEdit.jsp頁面請求方式需要調整:
5、更新功能實現
更新圖書分為兩個步驟:
- 查詢需要更新的圖書,填充到更新頁面
- 提交請求,發送數據給服務器更新保存修改。
5.1、查詢需要更新的圖書,填充到更新頁面
5.2、提交請求,發送數據給服務器更新保存修改。
bookEdit.jsp頁面的修改
6、字符集的Filter一定要在Restful的Filter前面
七、SpringMVC標簽庫
1、搭建SpringMVC開發環境
2、創建對象模型Person對象
PersonController控制器代碼:
addPerson.jsp頁面
八、自定義參數轉換器
1、WebDataBinder類介紹
在SpringMVC中有WebDataBinder類。這個類專門用來負責將請求參數類型轉換。以及請求參數數據驗證,錯誤信息綁定等功能。
WebDataBinder會調用各種類型轉換器,得到屬性相對應類型的值。然后再注入到屬性中(調用setXxxx方法)
在WebDataBinder類中有三個組件分別處理三種不同的功能。
conversionService 負責處理參數類型轉換。把請求的參數轉換成為Controller中的方法參數值。
converters 在ConversionService組件中需要各種類型轉換器,在conversionService組件中需要依賴於各種轉換器類去實現轉換工作。
validators 負責驗證傳入的參數值是否合法。
bindingResult 負責接收驗證后的錯誤信息。
下圖展示了WebDataBinder、ConversionService、Converter的關系。
如果我們要自定義請求參數的類型轉換器。需要實現
org.springframework.core.convert.converter.Converter<S,T>接口。
然后注入到ConversionService組件中。最后再將ConversionService注入到WebDataBinder中。
創建ConversionService組件,需要配置
org.springframework.format.support.FormattingConversionServiceFactoryBean對象。
2、自定義String到java.util.Date類型轉換器
到ApplicationContext.xml中去配置,並使用
3、@DateTimeFormat注解類型轉換器
我們也可以像上面。在類的Date類型的屬性上標上注解。就可以自動將String類型轉換成為Date數據
pattern屬性表示 日期的格式。最完成的格式是:yyyy-MM-dd hh:mm:ss
九、較驗器----參數的有效性驗證Validate----Hibernate
在JavaEE6.0中,定義了很多的驗證規范。這些規范統稱為:JSR303驗證規范。
而這些規范的實現。我們使用現在業內比較認可的Hibernate-Validate驗證
@AssertTrue |
用於boolean字段,該字段只能為true |
@AssertFalse |
該字段的值只能為false |
@CreditCardNumber |
對信用卡號進行一個大致的驗證 |
@DecimalMax |
只能小於或等於該值 |
@DecimalMin |
只能大於或等於該值 |
@Digits(integer=,fraction=) |
檢查是否是一種數字的整數、分數,小數位數的數字 |
|
檢查是否是一個有效的email地址 |
@Future |
檢查該字段的日期是否是屬於將來的日期 |
@Length(min=,max=) |
檢查所屬的字段的長度是否在min和max之間,只能用於字符串 |
@Max |
該字段的值只能小於或等於該值 |
@Min |
該字段的值只能大於或等於該值 |
@NotNull |
不能為null |
@NotBlank |
不能為空,檢查時會將空格忽略 |
@NotEmpty |
不能為空,這里的空是指空字符串 |
@Null |
檢查該字段為空 |
@Past |
檢查該字段的日期是在過去 |
@Pattern(regex=,flag=) |
被注釋的元素必須符合指定的正則表達式 |
@Range(min=,max=,message=) |
被注釋的元素必須在合適的范圍內 |
@Size(min=, max=) |
檢查該字段的size是否在min和max之間,可以是字符串、數組、集合、Map等 |
@URL(protocol=,host,port) |
檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件 |
使用Hiberante的驗證器較驗數據分以下步驟:
- 入Hibernate驗證的jar包
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
classmate-0.8.0.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar
2. 在實體bean對象的屬性上使用校驗的注解
3. 在Controller的方法參數上,給需要驗證的bean對象。添加驗證注解@Valid,以及在驗證對象后跟一個BindingResult 對象用於接收驗證的錯誤信息
4. 在SpringMVC的form表單字段后,使用<form:errors path="字段名" />輸出對應字段的錯誤信息
十、自定義錯誤信息的回顯
1、錯誤消息規則:
這是校驗錯誤的key規則:
參數轉換失敗的key規則:
2、在源碼目錄下配置錯誤信息的屬性配置文件
3、在application.xml中配置屬性信息
使用占位符{數字}
對於SpringMvc模型來說,傳值是框架做的工作。我們只需要寫好數字即可。
第一個參數Spring傳入的是驗證的屬性名