李琨 到目前為止,,傳統(tǒng)的Java Web MVC框架(Struts,、WebWork、Spring MVC,、etc.)還無法很好地支持REST風(fēng)格的架構(gòu)設(shè)計,。它們在設(shè)計之初時基本上都是圍繞著基于HTML表單的交互模式來設(shè)計的,View的粒度難以 達到單個頁面以下,。不能把響應(yīng)Ajax請求而返回的XML/JSON/純文本格式的數(shù)據(jù)簡單地認為是Web MVC框架中的View,,實際上這個時候這些數(shù)據(jù)的語義已經(jīng)與傳統(tǒng)的Web MVC架構(gòu)中的View的語義相距甚遠。 傳統(tǒng)的Web MVC框架一個最大的問題是它們看待URL的方式與REST有很大的差別,。REST把服務(wù)器端所有的URL都當(dāng)作是抽象的資源(相當(dāng)于是面向?qū)ο笤O(shè)計中的 接口),,雖然Web MVC也強調(diào)不應(yīng)該將硬編碼的URL(例如:http://www./yyy/zzz/abcd.jsp)直接暴露出來,而應(yīng)該通過某個 Controller來暴露,,將這個頁面配置為Controller的一個View,,但是Web MVC框架并沒有有意識地將URL當(dāng)作抽象的資源來看待和設(shè)計。 還有一個較為嚴重的問題是傳統(tǒng)的Web MVC框架基本上都只支持GET和POST兩種HTTP方法,,而不支持PUT和DELETE方法,,而Servlet API是支持上述所有的HTTP方法的(支持doPut和doDelete方法)。 舉個例子,Spring MVC所支持的HTTP方法封裝在 org.springframework.web.servlet.supportWebContentGenerator類中,,其中只有 METHOD_HEAD,、METHOD_GET、METHOD_POST幾個常量,,而沒有METHOD_PUT,、METHOD_DELETE,顯然其作者 并不認為有必要支持HTTP的PUT和DELETE方法,。 我沒有考察過Struts和WebWork,,估計結(jié)果應(yīng)該是一樣的,而且也沒有聽說過Strust和WebWork的作者有支持REST風(fēng)格架構(gòu)設(shè) 計的計劃,。JSF呢,?雖然Gavin King以前在某地說過JSF完全可以支持REST,上次見面我沒有仔細向他請教這個問題,,但是可以肯定的是JSF從來就沒有把支持REST風(fēng)格的架構(gòu)設(shè) 計作為他們的核心目標(biāo)之一,。 所以在這個方面,Java社區(qū)要比Ruby社區(qū)落后很多了,。目前只能脫離開傳統(tǒng)的Web MVC框架,,基于Servlet API來建造一個符合REST要求的新的服務(wù)器端架構(gòu)(當(dāng)然,Spring IoC,、Hibernate等框架仍然可以保留),。好在不需要我們親自來做這個事情,已經(jīng)有一些Java的服務(wù)器端框架可以支持REST了,。例如: Restlet(http://www.),。另外還有一些橫跨瀏覽器和服務(wù)器的設(shè)計模式可以利用,詳情見《Ajax模式與最佳實踐》,。 |
|