Springmvc restful風格

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>

這一段的方法是用 org.springframework.web.filter.HiddenHttpMethodFilter 的內置過濾器類進行對http請求的標準化。這樣讓我們可以自己聲明請求的方式。

配置完成這個以後,我們在ajax裏面需要傳遞一個參數_method:"PUT" 和 _method:"DELETE",但是請求方式仍然是POST

這樣配置的話,我們已經可以實現對DELETE修飾的方法進行訪問,同樣_method:'PUT'我們可以對PUT修飾的方法進行訪問,這樣我們上面定義的控制器類已經可以實現了。

轉載:http://www.cnblogs.com/qixiaoyizhan/p/5864233.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章