我承認有點標(biāo)題黨了,不過題目中所說的幾項技術(shù)確實有其相似之處,欲知事情原委,且聽我詳細道來。
項目一開始只是不滿 struts 龐大的體積,于是想自己根據(jù)其原理實現(xiàn)一個tiny 版。后來的開發(fā)中覺得,完全可以把上述的ajax、Restuful web service的一些思想加入進來。經(jīng)過幾周的努力,便開發(fā)出了一個基本成型的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。框架奉行約定大于配置的思想,至于請求如何分發(fā),這個不需要人工配置,框架自動解決。這里要介紹兩個概念A(yù)ction 和 Router,熟悉Struts的肯定都知道Action,Action替代Servlet、JSP時代的Servlet,所有提交的請求由struts分發(fā)給不同的Action來處理。這里道理也是一樣的,Action就是經(jīng)過框架處理后的請求接受者。再來說一下Router,字面意思路由器,學(xué)過計算機網(wǎng)絡(luò)的都知道,ip數(shù)據(jù)包在網(wǎng)絡(luò)上之所以能夠順利到達,就是因為路由器根據(jù)路由表來來確定出來傳輸?shù)耐緩健_@里Router也是這個作用,根據(jù)訪問服務(wù)器的URL來制定分發(fā)策略。Router是完全可以自定義的,用戶可以定義自己的Router來制定URL分發(fā)的策略,并且用戶自定義的Router比系統(tǒng)默認的Router有更高的優(yōu)先權(quán)。
二、URL上做文章
/UserAction/login/username=admin&&password=admin
先來介紹系統(tǒng)MethodRouter的處理方式。上面的url根據(jù)"/"分為三個部分,第一部分是請求的Action類,第二部分是類中的方法Method,第三部分是提交的參數(shù)Param。這一點受上篇文章優(yōu)酷的架構(gòu)里URL設(shè)計的啟發(fā)。
經(jīng)過這樣的設(shè)計,就明白在上述配置文件中為何可以如此簡單了。
當(dāng)然也可以不以這樣的方式,框架提供自定義Router的支持。比如你想這樣處理URL:/前臺頁面/子欄目/子欄目
想實現(xiàn)上面的方式,就可以自己定義Router,在Router里面獲取上述的URL,然后做處理、forward到相應(yīng)的jsp頁面。
三、使用Json傳輸數(shù)據(jù)
Ajax請求很容易處理json數(shù)據(jù),ajax可以與系統(tǒng)輕松交互。
當(dāng)初Web Service使用SOAP的xml格式傳輸數(shù)據(jù),如今也有人指責(zé)這是大費周折。Restful方式提倡遵循HTTP語義,完全使用URL結(jié)合GET、POST、PUT、DELETE來傳輸請求,結(jié)果在roil陣營里廣泛使用,認為是web service更優(yōu)雅的方式。所以本框架也吸取他們的優(yōu)點,也完全可以通過url傳輸請求的數(shù)據(jù),如上述URL中的Param部分。不過沒有遵循Restful強調(diào)的Http語義,全部使用Get和POST的請求方式,當(dāng)然也可以制定為其他,這完全看你的心情,因為這對功能實現(xiàn)無關(guān)緊要。而且我覺得統(tǒng)一使用一種,更避免了需要指定請求方式的麻煩。
數(shù)據(jù)的返回使用json格式,比SOAP更為輕量簡潔和優(yōu)雅,而且有更多的平臺直接支持。如在android平臺,本身就支持json格式的處理, 如果使用web service 的SOAP,你可能還要導(dǎo)入KSOAP的第三方庫。
在非瀏覽器的客戶端,可以借助編寫的工具類,來完成web service方式的操作,
public interface IWebService { public List<LiteInformationDTO> getInformationsOfOwnerApp(String ownerApp, int start, int limit) throws SocketTimeoutException; }
經(jīng)過這樣的封裝,已經(jīng)與使用web service毫無差別,而且還會更加高效,因為處理json總比處理SOAP的xml要容易。
先簡單寫這么多,之后的續(xù)篇詳細介紹。