實踐參考: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後綴,就不存上述問題了。還是有後綴方便。