李琨 到目前為止,傳統(tǒng)的Java Web MVC框架(Struts、WebWork、Spring MVC、etc.)還無法很好地支持REST風(fēng)格的架構(gòu)設(shè)計(jì)。它們在設(shè)計(jì)之初時基本上都是圍繞著基于HTML表單的交互模式來設(shè)計(jì)的,View的粒度難以 達(dá)到單個頁面以下。不能把響應(yīng)Ajax請求而返回的XML/JSON/純文本格式的數(shù)據(jù)簡單地認(rèn)為是Web MVC框架中的View,實(shí)際上這個時候這些數(shù)據(jù)的語義已經(jīng)與傳統(tǒng)的Web MVC架構(gòu)中的View的語義相距甚遠(yuǎn)。 傳統(tǒng)的Web MVC框架一個最大的問題是它們看待URL的方式與REST有很大的差別。REST把服務(wù)器端所有的URL都當(dāng)作是抽象的資源(相當(dāng)于是面向?qū)ο笤O(shè)計(jì)中的 接口),雖然Web MVC也強(qiáng)調(diào)不應(yīng)該將硬編碼的URL(例如:http://www./yyy/zzz/abcd.jsp)直接暴露出來,而應(yīng)該通過某個 Controller來暴露,將這個頁面配置為Controller的一個View,但是Web MVC框架并沒有有意識地將URL當(dāng)作抽象的資源來看待和設(shè)計(jì)。 還有一個較為嚴(yán)重的問題是傳統(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,顯然其作者 并不認(rèn)為有必要支持HTTP的PUT和DELETE方法。 我沒有考察過Struts和WebWork,估計(jì)結(jié)果應(yīng)該是一樣的,而且也沒有聽說過Strust和WebWork的作者有支持REST風(fēng)格架構(gòu)設(shè) 計(jì)的計(jì)劃。JSF呢?雖然Gavin King以前在某地說過JSF完全可以支持REST,上次見面我沒有仔細(xì)向他請教這個問題,但是可以肯定的是JSF從來就沒有把支持REST風(fēng)格的架構(gòu)設(shè) 計(jì)作為他們的核心目標(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è)計(jì)模式可以利用,詳情見《Ajax模式與最佳實(shí)踐》。 |
|