Java後臺框架篇--Spring與Restful風格API介面開發
Restful風格的API是一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。
在Restful風格中,使用者請求的url使用同一個url而用請求方式:get,post,delete,put...等方式對請求的處理方法進行區分,這樣可以在前後臺分離式的開發中使得前端開發人員不會對請求的資源地址產生混淆和大量的檢查方法名的麻煩,形成一個統一的介面。
在Restful風格中,現有規定如下:
- GET(SELECT):從伺服器查詢,可以在伺服器通過請求的引數區分查詢的方式。
- POST(CREATE):在伺服器新建一個資源,呼叫insert操作。
- PUT(UPDATE):在伺服器更新資源,呼叫update操作。
- PATCH(UPDATE):在伺服器更新資源(客戶端提供改變的屬性)。(目前jdk7未實現,tomcat7也不行)。
- DELETE(DELETE):從伺服器刪除資源,呼叫delete語句。
瞭解這個風格定義以後,我們舉個例子:
如果當前url是 http://localhost:8080/User
那麼使用者只要請求這樣同一個URL就可以實現不同的增刪改查操作,例如
http://localhost:8080/User?_method=get&id=1001 這樣就可以通過get請求獲取到資料庫 user 表裡面 id=1001 的使用者資訊
http://localhost:8080/User?_method=post&id=1001&name=zhangsan 這樣可以向資料庫 user 表裡面插入一條記錄
http://localhost:8080/User?_method=put&id=1001&name=lisi 這樣可以將 user表裡面 id=1001 的使用者名稱改為lisi
http://localhost:8080/User?_method=delete&id=1001 這樣用於將資料庫 user 表裡面的id=1001 的資訊刪除
這樣定義的規範我們就可以稱之為restful風格的API介面,我們可以通過同一個url來實現各種操作。
——————————————————————————————————————————————————————
接下來我們講解spring-mvc中是如何實現restful風格API介面的,並且對其中出現的問題進行解決!(java web對 put 和 delete 請求的不支援問題)
首先我們搭建好spring mvc的專案介面,並按照restful風格寫好控制器,這裡我寫了一個User控制器類和一個User "Action" ->
這裡的controller 和 action的url地址是按照restful風格編寫的 訪問地址 /User/User 用method區分請求方法
我們的前臺使用的是jquery ajax進行請求->
有人會問了? 為什麼delete 和put用的也是post的請求,這裡就要說說java裡面對put和delete的不支援了->
java裡面原本是對put和delete請求進行過濾掉的(不知道為什麼要這麼做),而且在servlet裡面還有doGet,doPost,doDelete,doPut的對應方法,但是不可以使用(尷尬不尷尬),同樣spring mvc裡面也有對應的method=RequestMethod.PUT 和Delete,但是ajax裡面type寫成Put、Delete是可以訪問到對應的方法的,但是引數卻無法傳遞過去,所有傳遞過去的引數都是null(鬱悶不鬱悶)!C#就不會這樣,C#的API程式設計需要開啟一下PUT和Delete就可以了,並不需要java裡面這麼複雜,說到這裡我們解決一下這個問題->
首先在springMVC 專案的Web.xml裡面增加一個過濾器filter
<!-- 瀏覽器不支援put,delete等method,由該filter將/xxx?_method=delete轉換為標準的http delete方法 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
當然有些新手不知道這段程式碼加在哪裡,那麼我就將我的web.xml一併貼上在此處(我也搞這個半天...)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 瀏覽器不支援put,delete等method,由該filter將/xxx?_method=delete轉換為標準的http delete方法 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--這段程式碼如果不用上面的的話是可以實現put的-->
<!--<filter>
<filter-name>HttpMethodPutFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodPutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>-->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- Spring MVC配置 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- load-on-startup元素標記容器是否在啟動的時候就載入這個servlet(例項化並呼叫其init()方法) -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Spring配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定Spring Bean的配置檔案所在目錄。預設配置在WEB-INF目錄下 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
這裡我們將過濾器配置好了,我有一段註釋掉了,如果用下面這個配置檔案->
<!--這段程式碼如果不用上面的的話是可以實現put的-->
<filter>
<filter-name>HttpMethodPutFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodPutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這個配置項如果寫在這裡的話是可以支援PUT請求的,但是DELETE請求依然不可以,那麼我只能選擇第一種方法了
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter>
這一段的方法是用 org.springframework.web.filter.HiddenHttpMethodFilter 的內建過濾器類進行對http請求的標準化。這樣讓我們可以自己宣告請求的方式。
配置完成這個以後,我們在ajax裡面需要傳遞一個引數_method:"PUT" 和 _method:"DELETE",但是請求方式仍然是POST
這樣配置的話,我們已經可以實現對DELETE修飾的方法進行訪問,同樣_method:'PUT'我們可以對PUT修飾的方法進行訪問,這樣我們上面定義的控制器類已經可以實現了。
本文為七小站主原創作品,轉載請註明出處:http://www.cnblogs.com/qixiaoyizhan/ 且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。