基于J2EE輕量級(jí)容器構(gòu)件框架三、控制器部分
Posted on 2005-11-18 10:23 publisher luo 閱讀(1742) 評(píng)論(0) 編輯 收藏 所屬分類: 框架設(shè)計(jì)及應(yīng)用controller包提供了三個(gè)主要功能:
如下圖:
1、 mvc的主控制servlet
Main Controller類提供了總體控制作用,所有的請(qǐng)求都先映射到此類上,然后在統(tǒng)一分發(fā)到各個(gè)部分控制類。由于servlet是支持多線程的,所以性能是可以保證的。
MainController類繼承于HttpServlet類,主要方法有:
1)
init()方法,初始化方法,在此方法里面主要初始化一些公共的資源、服務(wù),過濾器和一些系統(tǒng)基礎(chǔ)配置參數(shù)等。初始化服務(wù)過程委托services包中的Service
Manager類來完成,初始化各種filter由filter包下的Filter Manager來完成。
2)
doPost()和doGet()方法,接收各種請(qǐng)求并交給processRequest()方法統(tǒng)一處理,統(tǒng)一了post, get兩種請(qǐng)求方式。
通過在web.xml中注冊(cè)和映射,使得各種符合要求的請(qǐng)求都直接轉(zhuǎn)發(fā)到此控制類上,配置如下:
<servlet> <servlet-name>mainCommand</servlet-name> <servlet-class> com.daosheng.blackfin.controller.MainController </servlet-class> <init-param> <param-name>sysconfig</param-name> <param-value>/WEB-INF/blackfin-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mainCommand</servlet-name> <url-pattern>/command/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>mainCommand</servlet-name> <url-pattern>/main/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>mainCommand</servlet-name> <url-pattern>*.cmd</url-pattern> </servlet-mapping> |
這樣碰到請(qǐng)求url以.cmd結(jié)尾的或者以/command/或/main/開頭的都映射到此類上來做統(tǒng)一處理。實(shí)現(xiàn)了統(tǒng)一控制功能。
2、filter的接口和管理類
filter包主要包含filter接口和filter的管理類。FilterManager類負(fù)責(zé)初始化各注冊(cè)的filter(開發(fā)人員可以自己開發(fā)并注冊(cè)在注冊(cè)文件中),系統(tǒng)控制類接收到各種請(qǐng)求先按需要交給過濾類(filter)來進(jìn)行過濾,然后在由各自業(yè)務(wù)處理類完成業(yè)務(wù)處理。
統(tǒng)一過濾類可以用來完成一些需要每次請(qǐng)求都需要判斷的邏輯,比如說登入校驗(yàn)(判斷用戶是否登入過,如果沒有直接跳轉(zhuǎn)到登入頁面)還有一個(gè)比較關(guān)鍵的過濾就是CodeFilter類。一般的http請(qǐng)求分為兩種類型,一種是普通類型,一種是為multipart 類型(form的enctype="multipart/form-data",可以上傳文件)兩種類型導(dǎo)致在后面服務(wù)器端接收form中的參數(shù)使用的方法各不相同,multipart類型的用getParameter()方法是沒法取出提交上來的參數(shù)的,而是要得到一個(gè)Binary數(shù)組自己進(jìn)行分拆才能得到。導(dǎo)致程序取參數(shù)的不一致性,可移植性減弱。所以使用CodeFilter對(duì)每個(gè)request進(jìn)行過濾,將兩種情況上傳的各種參數(shù)都重新setAttribute到request中,這樣就能夠使后面的command類只使用getAttribute()方法就能取到實(shí)際的參數(shù)而不需要管是哪種方式提交的了,并且CodeFilter中還可以把一些字符過濾掉,比如說單引號(hào)等。
3、請(qǐng)求輔助類
請(qǐng)求輔助類(RequestHelper)主要有兩個(gè)作用,一是將request,response和配置參數(shù)封裝起來然后作為command的參數(shù),使每個(gè)command都能夠獲取到前臺(tái)請(qǐng)求的各種信息,第二個(gè)作用是查找command的各種配置參數(shù)信息。