JSP開(kāi)發(fā)中Servlet之導(dǎo)入事件驅(qū)動(dòng)技術(shù)
JSP-Servlet為Web應(yīng)用程序開(kāi)發(fā)者提供了一個(gè)優(yōu)秀的平臺(tái)。但是,現(xiàn)在國(guó)內(nèi)大多數(shù)的基于JSP-Servlet的開(kāi)發(fā)都處在最基礎(chǔ)的狀態(tài),代碼重用率低,開(kāi)發(fā)效率低,無(wú)法適應(yīng)大型、復(fù)雜的Web開(kāi)發(fā)要求。
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù),首先,要實(shí)現(xiàn)事件驅(qū)動(dòng),必須在JSP-Servlet開(kāi)發(fā)中采用MVC技術(shù)。
◆M=Model(模型)
◆V=View(視圖)
◆C=Control(控制)
視圖(V)定義了用戶(hù)界面。模型(M)定義了抽象類(lèi)和邏輯??刂疲–)則負(fù)責(zé)根據(jù)視圖發(fā)生的事件調(diào)用模型的邏輯完成業(yè)務(wù)處理。
一般
◆Model(模型)由普通的Java類(lèi)來(lái)實(shí)現(xiàn)。
◆View(視圖)由Jsp來(lái)實(shí)現(xiàn)。
◆Control(控制)由Servlet來(lái)實(shí)現(xiàn)。
視圖和模型是緊密關(guān)聯(lián),又相互獨(dú)立的。
模型是視圖的抽象,必須包含一定的邏輯來(lái)處理視圖所表現(xiàn)的對(duì)象的事件。
同時(shí)對(duì)于相同的邏輯,視圖可以以各種方式表現(xiàn)。
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù)的實(shí)例中的問(wèn)題,例如,在Web開(kāi)發(fā)中,
[1] 對(duì)于一個(gè)代表“單選”抽象的SingleSelection類(lèi),在用戶(hù)的瀏覽器上可以顯示為Radio button, 也可以是單選下拉框,或者是其他任何的單選性質(zhì)的控件。
[2] 對(duì)于一個(gè)代表“提交”抽象的Submition類(lèi),在用戶(hù)的瀏覽器上可以顯示為Submit button, 也可以是超鏈接、圖片,甚至可以是可觸發(fā)JavaScript的submit()方法的任何控件。
事件驅(qū)動(dòng)對(duì)于MVC技術(shù)是極其重要的,主要由Control(控制)來(lái)實(shí)現(xiàn)。而JSP-SERVLET的實(shí)現(xiàn)本身就非常適合于編寫(xiě)事件驅(qū)動(dòng)的程序。
眾所周知,javax.servlet.http.HttpServlet類(lèi)每次都調(diào)用
doPost(HttpServletRequest req, HttpServletResponse resp)
或者
doGet(HttpServletRequest req, HttpServletResponse resp)
方法來(lái)響應(yīng)客戶(hù)端的submit操作。
Servlet響應(yīng)的事件就是客戶(hù)端瀏覽器的submit操作??蛻?hù)端瀏覽器的submit事件觸發(fā)Servlet的特定事件處理方法,但是入口只有一個(gè):javax.servlet.http.HttpServlet類(lèi)的service(HttpServletRequest req, HttpServletResponse resp)方法。(具體到對(duì)于客戶(hù)端的操作的響應(yīng),則可能是doPost(HttpServletRequest req, HttpServletResponse resp)或者是doGet(HttpServletRequest req, HttpServletResponse resp)方法。
所以可以重寫(xiě)這些方法來(lái)控制Servlet對(duì)submit事件的響應(yīng)處理,調(diào)用不同的JSP,JAVA BEAN,甚至于EJB。
例:EventDrivenServlet繼承javax.servlet.http.HttpServlet,并且重寫(xiě)doPost(HttpServletRequest req, HttpServletResponse resp)和doGet(HttpServletRequest req, HttpServletResponse resp)方法,令這2個(gè)方法都直接調(diào)用同一個(gè)方法,我們把這個(gè)方法命名為“act”??
void act(HttpServletRequest req, HttpServletResponse resp)
act方法應(yīng)該根據(jù)req參數(shù)傳入的信息,調(diào)用相應(yīng)的類(lèi)以及方法,***將resp返回給客戶(hù)端。
act方法進(jìn)行的處理必須包括如下幾點(diǎn):
◆解析req。
◆根據(jù)上一步的解析結(jié)果初始化(或者更新)相應(yīng)的類(lèi)。
◆調(diào)用相應(yīng)的方法進(jìn)行邏輯處理。
◆將處理結(jié)果反映到resp里。
◆根據(jù)邏輯處理結(jié)果指定下一個(gè)顯示的頁(yè)面
◆forward到下一個(gè)頁(yè)面。
但是,act方法又是怎么知道該調(diào)用哪一個(gè)類(lèi)的哪一個(gè)方法,該遷移到哪一個(gè)畫(huà)面去的呢?
答案是傳遞給act方法一個(gè)消息 Message。
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù),Message類(lèi)是消息的抽象,應(yīng)該定義成abstract的,可以是一個(gè)空類(lèi)。從這個(gè)Message類(lèi)派生出所有的具體的消息類(lèi)。所有的消息類(lèi)都必須從Message類(lèi)繼承。
前面講過(guò),畫(huà)面上(JSP)的每一個(gè)可submit的控件在邏輯上都對(duì)應(yīng)一個(gè)Submition,每一個(gè)Submition都和一個(gè)特定的消息類(lèi)相關(guān)聯(lián)。這樣,只要我們?cè)贑ontrol層能夠截獲這些消息類(lèi),并且解析這些消息類(lèi)攜帶的信息,并將它們委派給相應(yīng)的類(lèi)的方法去處理,就可以實(shí)現(xiàn)事件驅(qū)動(dòng)。
例:
畫(huà)面上有一個(gè)“登錄”按鈕,它對(duì)應(yīng)著一個(gè)Submition類(lèi),并且產(chǎn)生一個(gè)LoginMessage的消息。LoginMessage繼承Message,并且加入了一個(gè)Hashtable成員變量,攜帶了用戶(hù)名和密碼的信息。
畫(huà)面上還一個(gè)“變更密碼”按鈕,它對(duì)應(yīng)著一個(gè)ChangePasswordSubmition類(lèi),并且產(chǎn)生一個(gè)ChangePasswordMessage的消息。ChangePasswordMessage繼承Message,并且加入了一個(gè)Hashtable成員變量,攜帶了用戶(hù)名和密碼的信息。
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù),當(dāng)Servlet響應(yīng)這個(gè)submit時(shí),可以根據(jù)傳來(lái)的消息的類(lèi)型和攜帶的信息來(lái)委派處理。
具體實(shí)現(xiàn)時(shí),我們應(yīng)該重載EventDrivenServlet的act()方法,加入一個(gè)Message類(lèi)的參數(shù)。
void act(HttpServletRequest req, HttpServletResponse resp,Message message)
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù),如果message instanceof LoginMessage為true,那么就將message造型成LoginMessage,并且將LoginMessage傳遞給相應(yīng)的方法,處理完成后指定相應(yīng)的畫(huà)面并發(fā)回客戶(hù)端。
對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù),如果message instanceof ChangePasswordMessage為true, 那么就將message造型成ChangePasswordMessage,并且將ChangePasswordMessage傳遞給相應(yīng)的方法,處理完成后指定相應(yīng)的畫(huà)面并發(fā)回客戶(hù)端。
以上就是對(duì)于在JSP-Servlet中導(dǎo)入事件驅(qū)動(dòng)技術(shù)的一點(diǎn)點(diǎn)闡述,對(duì)你是否有一點(diǎn)幫助呢?
【編輯推薦】