我承認有點標題黨了,不過題目中所說的幾項技術確實有其相似之處,欲知事情原委,且聽我詳細道來。
項目一開始只是不滿 struts 龐大的體積,於是想自己根據其原理實現一個tiny 版。後來的開發中覺得,完全可以把上述的ajax、Restuful web service的一些思想加入進來。經過幾周的努力,便開發出了一個基本成型的web 架構,暫且起名為unicorn(獨角獸,吼吼)。下文開始便對這個自編寫的架構做一些列的介紹,並且初步打算是將其開源,希望能一起交流和完善它。
首先,為了能快速瞭解它是什麼,先來看一下設定檔:
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<routers>
<router class="com.mh.router.MySessionCheckRouter"></router>
</routers>
<actions>
<action class="com.mh.action.UserAction"></action>
<action class="com.mh.action.InformationAction"></action>
<action class="com.mh.action.MobileAction"></action>
</actions>
</config>
上面就是整個工程的設定檔,可以看出需要配置的東西非常少,只需要制定action類 和 router類有哪些就Ok。架構奉行約定大於配置的思想,至於請求如何分發,這個不需要人工配置,架構自動解決。這裡要介紹兩個概念Action 和 Router,熟悉Struts的肯定都知道Action,Action替代Servlet、JSP時代的Servlet,所有提交的請求由struts分發給不同的Action來處理。這裡道理也是一樣的,Action就是經過架構處理後的請求接受者。再來說一下Router,字面意思路由器,學過電腦網路的都知道,ip資料包在網路上之所以能夠順利到達,就是因為路由器根據路由表來來確定出來傳輸的途徑。這裡Router也是這個作用,根據訪問伺服器的URL來制定分發策略。Router是完全可以自訂的,使用者可以定義自己的Router來制定URL分發的策略,並且使用者自訂的Router比系統預設的Router有更高的優先權。
二、URL上做文章
/UserAction/login/username=admin&&password=admin
先來介紹系統MethodRouter的處理方式。上面的url根據"/"分為三個部分,第一部分是請求的Action類,第二部分是類中的方法Method,第三部分是提交的參數Param。這一點受上篇文章優酷的架構裡URL設計的啟發。
經過這樣的設計,就明白在上述設定檔中為何可以如此簡單了。
當然也可以不以這樣的方式,架構提供自訂Router的支援。比如你想這樣處理URL:/前台頁面/子欄目/子欄目
想實現上面的方式,就可以自己定義Router,在Router裡面擷取上述的URL,然後做處理、forward到相應的jsp頁面。
三、使用Json傳輸資料
Ajax請求很容易處理json資料,ajax可以與系統輕鬆互動。
當初Web Service使用SOAP的xml格式傳輸資料,如今也有人指責這是大費周折。Restful方式提倡遵循HTTP語義,完全使用URL結合GET、POST、PUT、DELETE來傳輸請求,結果在roil陣營裡廣泛使用,認為是web service更優雅的方式。所以本架構也吸取他們的優點,也完全可以通過url傳輸請求的資料,如上述URL中的Param部分。不過沒有遵循Restful強調的Http語義,全部使用Get和POST的請求方式,當然也可以制定為其他,這完全看你的心情,因為這對功能實現無關緊要。而且我覺得統一使用一種,更避免了需要指定請求方式的麻煩。
資料的返回使用json格式,比SOAP更為輕量簡潔和優雅,而且有更多的平台直接支援。如在android平台,本身就支援json格式的處理, 如果使用web service 的SOAP,你可能還要匯入KSOAP的第三方庫。
在非瀏覽器的用戶端,可以藉助編寫的工具類,來完成web service方式的操作,
public interface IWebService {public List<LiteInformationDTO> getInformationsOfOwnerApp(String ownerApp, int start, int limit) throws SocketTimeoutException;}
經過這樣的封裝,已經與使用web service毫無差別,而且還會更加高效,因為處理json總比處理SOAP的xml要容易。
先簡單寫這麼多,之後的續篇詳細介紹。