RestFul風格學習

實踐參考:http://blog.csdn.net/greensurfer/article/details/19296247


1、每種資源對應一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。

URI只代表資源的實體,不代表它的形式。嚴格地說,有些網址最後的".html"後綴名是不必要的,因爲這個後綴名錶示格式,屬於"表現層"範疇,而URI應該只代表"資源"的位置。它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段纔是對"表現層"的描述。

2、互聯網通信協議HTTP協議,是一個無狀態協議。這意味着,所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生"狀態轉化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。


綜合上面的解釋,我們總結一下什麼是RESTful架構:

  (1)每一個URI代表一種資源;

  (2)客戶端和服務器之間,傳遞這種資源的某種表現層(Representation);

  (3)客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。



REST(Representational State Transfer表述性狀態轉移)是一種針對網絡應用的設計和開發方式,最直觀表現就在於URL地址的不一樣了


在SpringMVC靜態資源的訪問,Controller中的路徑訪問

/**

   * @RequestMapping("/userinfo") 具有層次關係,方法級的將在類一級@RequestMapping之一,

   * 如下面示例, 訪問方法級別的@RequestMapping("/new"),則URL爲 /userinfo/new

*/


  以下對方法的進行討論

    a.  若URL中沒有參數

         @RequestMapping(value="/B/C")

    b.  若需要顯示參數, 如 user/delete?id=1234, 可以換成user/delete/1234

 

@RequestMapping(value="/user/delete/{id}")

public String delete( @PathVariable String id) {

     //  Spring會自動注入id=1234

}

 

 

  c. 靜態資源文件

      由於在web.xml中配置SpringMVC的URL攔截地址設置爲"/",Spring會攔截所有地址,包括含有後綴名的js、圖片等靜態資源文件。




方案一:激活Tomcat的defaultServlet來處理靜態文件

 

Xml代碼 

 

<servlet-mapping>

  <servlet-name>default</servlet-name>

  <url-pattern>*.jpg</url-pattern>

</servlet-mapping>


<servlet-mapping>

  <servlet-name>default</servlet-name>

  <url-pattern>*.js</url-pattern>

</servlet-mapping>


<servlet-mapping>

  <servlet-name>default</servlet-name>

  <url-pattern>*.css</url-pattern>

</servlet-mapping>

 

 

要配置多個,每種文件配置一個

要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截,這個就不會進入Spring了,我想性能是最好的吧。

Tomcat, Jetty, JBoss, and GlassFish 自帶的默認Servlet的名字 -- "default"

Google App Engine 自帶的 默認Servlet的名字 -- "_ah_default"

Resin 自帶的 默認Servlet的名字 -- "resin-file"

WebLogic 自帶的 默認Servlet的名字  -- "FileServlet"

WebSphere  自帶的 默認Servlet的名字 -- "SimpleFileServlet"

 

方案二: 在spring3.0.4以後版本提供了mvc:resources

mvc:resources 的使用方法:

 

Xml代碼 

<!-- 對靜態資源文件的訪問 -->

 

<!-- 這樣配置的話,先前的靜態文件路徑前都要加上res, 如在images下面的a.jpg,要訪問的話就得加上res/images/a.jpg -->

<mvc:resources location="/" mapping="/res/**" />

 

 

/images/**映射到ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包裏面,這樣可以把靜態資源壓縮到jar包中。cache-period 可以使得靜態資源進行web cache

 

如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。

報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

使用<mvc:resources/>元素,把mapping的URI註冊到SimpleUrlHandlerMapping的urlMap中,

key爲mapping的URI pattern值,而value爲ResourceHttpRequestHandler,

這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支持classpath目錄,jar包內靜態資源的訪問.

另外需要注意的一點是,不要對SimpleUrlHandlerMapping設置defaultHandler.因爲對static uri的defaultHandler就是ResourceHttpRequestHandler,

否則無法處理static resources request.

 

方案三: 使用<mvc:default-servlet-handler/>

Xml代碼 

<!-- 對靜態資源文件的訪問 不支持訪問WEB-INF目錄 -->  

<mvc:default-servlet-handler/>

 

會把"/**" url, 註冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler處理並返回.

DefaultServletHttpRequestHandler使用就是各個Servlet容器自己的默認Servlet.  

補充說明:多個HandlerMapping的執行順序問題:DefaultAnnotationHandlerMapping的order屬性值是:0

 

<mvc:resources/ >自動註冊的 SimpleUrlHandlerMapping的order屬性值是: 2147483646

<mvc:default-servlet-handler/>自動註冊 的SimpleUrlHandlerMapping 的order屬性值是: 2147483647

spring會先執行order值比較小的。

當訪問一個a.jpg圖片文件時,先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,我們沒有叫a.jpg的Action。再 按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹配"/**"的,所以一定會匹配上,再響應圖片。 訪問一個圖片,還要走層層匹配。真不知性能如何?改天做一下壓力測試,與Apache比一比。 最後再說明一下, 如何你的DispatcherServlet攔截 *.do這樣的URL後綴,就不存上述問題了。還是有後綴方便。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章