Struts、Ajax、Restful、Web Service 狂想曲框架實(shí)現(xiàn)篇(一)
Posted on 2011-11-25 11:43 馬航 閱讀(350) 評(píng)論(0) 編輯 收藏承接上篇的簡(jiǎn)單介紹,下面詳細(xì)介紹整個(gè)框架的大致結(jié)構(gòu)。
先來(lái)看一下整個(gè)框架包的結(jié)構(gòu):
可以看出框架包含的包很少,包的結(jié)構(gòu)也超簡(jiǎn)單。這里 涉及Filter、ActionSupport、Router等三個(gè)概念,他們之間的關(guān)系,通過(guò)下圖來(lái)表示:
圖也不規(guī)范,說(shuō)不上來(lái)是哪個(gè)UML圖,不過(guò)通過(guò)它也能看出一個(gè)請(qǐng)求到達(dá)時(shí),框架基本的處理流程。首先由Filter攔截到所有請(qǐng)求,然后把請(qǐng)求交給所有注冊(cè)的Router類,如果請(qǐng)求的Url正好是一個(gè)Router要攔截的,則把此請(qǐng)求交給這個(gè)Router,框架不再把請(qǐng)求向下傳遞。Router得到請(qǐng)求后,分析Url,通過(guò)Url里的信息把請(qǐng)求交給對(duì)應(yīng)的ActionSupport的子類來(lái)處理。
這里攔截采用Filter來(lái)處理,這跟多數(shù)的web框架一樣,使用Filter比Servlet有更多的能力進(jìn)行請(qǐng)求的分發(fā)。首先在一個(gè)web工程的web.xml文件中配置框架的UrlFilter類來(lái)攔截所有的請(qǐng)求。需要注意的一點(diǎn)是dispatcher 要設(shè)置為request,如果設(shè)置了forward的話,由框架內(nèi)部進(jìn)行的forward又會(huì)被框架攔截,從而造成無(wú)限的循環(huán)。Url-pattern設(shè)置為/*,表示所有的請(qǐng)求都會(huì)攔截,從而把對(duì)url分發(fā)的權(quán)利交由框架本身,而不是采用jsp規(guī)范里的url分發(fā)策略。框架在處理所有請(qǐng)求的url 時(shí),依次交給各個(gè)Router類來(lái)處理,如果Router類判斷是符合自己的url格式,則分發(fā)給 action 處理。如果不能處理再交給下一級(jí)的Router,最后url經(jīng)由所有Router處理完,剩下的資源文件的url,如http://xxx.xxx.xxx.jpg,則框架調(diào)用filter的doChain()方法,通過(guò)filter的過(guò)濾去訪問(wèn)web里的資源。
<filter> <filter-name>unicornWeb</filter-name> <filter-class>com.mh.mvc.filter.UrlFilter</filter-class> </filter> <filter-mapping> <filter-name>unicornWeb</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> |
大致的原理就是這樣,在下篇介紹框架的詳細(xì)實(shí)現(xiàn)。