sooxin-JAVA

          轉(zhuǎn):與struts的親密接觸&理解web開發(fā)

          與struts的親密接觸
          當(dāng)時(shí)上網(wǎng)看招聘信息,j2ee相關(guān)職位的都要求懂struts。看來學(xué)習(xí)struts是勢在必行了。Struts的確是當(dāng)時(shí)最優(yōu)秀的框架,開發(fā)人員再也不用對每個(gè)方法都寫一個(gè)servlet類了。請求成功或失敗后的頁面跳轉(zhuǎn)不用寫死在代碼中,而是可以通過struts-config.xml來進(jìn)行配置,表單組件可以自動(dòng)的綁定成actionForm對象。還可以自定義數(shù)據(jù)校驗(yàn)邏輯。Struts還提供了一個(gè)通用的數(shù)據(jù)校驗(yàn)框架.struts還提供了豐富的顯示標(biāo)簽。主要的時(shí)間都花在標(biāo)簽的學(xué)習(xí)上了。Struts顯示標(biāo)簽比時(shí)當(dāng)時(shí)的jsp 表達(dá)式的確是一大進(jìn)步了。在jsp頁面,不達(dá)再寫’<% %>’這些表過式語言了,而是使用像html那樣的標(biāo)簽。當(dāng)jstl出現(xiàn)后,jstl的類似c語言似的標(biāo)記語言要比struts顯示標(biāo)答優(yōu)秀得多。Struts顯示標(biāo)簽不能自動(dòng)處理null值問題,struts顯示標(biāo)簽還是顯得太復(fù)雜了,花那么大的力氣去學(xué)習(xí)struts顯示標(biāo)簽顯然是很不值的一件事!
          我用jsp+servlet開發(fā)的時(shí)間要比用struts進(jìn)行開發(fā)的時(shí)間長得多,但是struts的確是一個(gè)非常優(yōu)秀的框架。

          基于html: web應(yīng)用是基于html的,不管是jsp還是asp,asp.net還是jsf都是在服務(wù)器端把相應(yīng)的代碼解釋成html代碼,然后在客戶端通過瀏覽器解析顯示出來。
          無狀態(tài)編程:不管采用什么技術(shù),web開發(fā)終竟是無狀態(tài)編程。也就是在客戶端并不能保持應(yīng)用程序的任何狀態(tài)。在swing或vb等桌面開發(fā)時(shí),客戶程序可以通過變量來保持系統(tǒng)的狀態(tài)。而基于html的web應(yīng)用是無法保持狀態(tài)的。Web應(yīng)用狀態(tài)都需要由應(yīng)用服務(wù)器來保持。
          請求響應(yīng)及推/拉模式:在swing或vb等桌面應(yīng)用程序中,當(dāng)某一狀態(tài)發(fā)生改變時(shí),后臺(tái)程序可以觸發(fā)系統(tǒng)更新前端的UI組件,甚至可以使用觀察者模式,當(dāng)某一狀態(tài)發(fā)生改變時(shí),通知所有需要更新的前端UI組件,加載數(shù)據(jù)刷新組件。完成UI組件的更新,用戶可能沒有做任何動(dòng)作,這就是推模式。而web應(yīng)用正好相反,用戶從客戶端發(fā)出一個(gè)請求,服務(wù)器接到客戶端的請求后,讀取請求參數(shù),調(diào)用業(yè)務(wù)方法,獲得業(yè)務(wù)數(shù)據(jù),用業(yè)務(wù)數(shù)據(jù)重新生成新的html頁面,呈現(xiàn)給客戶端,由瀏覽器進(jìn)行解析顯示,這就是拉模式。請求響應(yīng)的拉模式是web應(yīng)用最大的特點(diǎn),任何請求的頁面在發(fā)出請求后,請求頁面所有組件的狀態(tài)都被刷新而無法得以保持。
          MVC:MVC即model模型數(shù)據(jù),view 視圖,controller 控制器。MVC模式讓每一個(gè)組件都有了一個(gè)明確的職責(zé),模型數(shù)據(jù)不含有視圖特有的代碼,視圖不含有控制代碼或數(shù)據(jù)訪問代碼,主要是顯示模型數(shù)據(jù)。控制器接收請求,獲得數(shù)據(jù),進(jìn)行視圖轉(zhuǎn)發(fā)。
          控制器是WEB應(yīng)用中的中樞神經(jīng),web應(yīng)用控制器的主要職責(zé):校驗(yàn)及獲取請數(shù)參數(shù),調(diào)用業(yè)務(wù)對象進(jìn)行業(yè)務(wù)處理,把從頁面獲得的請求參數(shù)傳遞給業(yè)務(wù)對象。通過業(yè)務(wù)調(diào)用獲得數(shù)據(jù)或創(chuàng)建模型數(shù)據(jù)。在需要保持服務(wù)端狀態(tài)的應(yīng)用中,創(chuàng)建或操作session狀態(tài)。創(chuàng)建一個(gè)視圖,由視圖來使用模型數(shù)據(jù)。
          模型含有由視圖顯示的數(shù)據(jù),在j2ee web應(yīng)用中,模型一般是JavaBean。Web應(yīng)用中的模型一般表示一個(gè)完整的業(yè)務(wù)操作的結(jié)果對象。這個(gè)結(jié)果對象通常不是一個(gè)真實(shí)的領(lǐng)域?qū)ο螅且粋€(gè)只有g(shù)etter,setter方法的對象(如值對象),通常稱為偽數(shù)據(jù)對象。模型沒有必要進(jìn)行進(jìn)一步的操作,如數(shù)據(jù)訪問等,模型也不應(yīng)該依賴Serlvet或某一WEB應(yīng)用框架.
          視圖用于呈現(xiàn)模型數(shù)據(jù),負(fù)責(zé)生成標(biāo)簽或其它內(nèi)容。視圖不需要了解控制器或業(yè)務(wù)對象。視圖不應(yīng)該直接處理請求參數(shù),而是應(yīng)該由控制器去做。也不應(yīng)該進(jìn)行數(shù)據(jù)查詢,如sql查詢,視圖不應(yīng)該處理數(shù)據(jù)查詢異常。顯圖只需要執(zhí)行必要的顯示邏輯,把模型數(shù)據(jù)通過一定的邏輯呈現(xiàn)給用戶。
          Front Controller前端控制器與命令模式:采用純Servlet和JSP的model 1進(jìn)行web開發(fā)都是非常復(fù)雜的。不可能實(shí)現(xiàn)java開發(fā)人員與UI開發(fā)人員角色的分離。采用純Servlet來開發(fā)web應(yīng)用,如果要從serlvet這種純java對象中配合html標(biāo)記進(jìn)行web開發(fā)是非常笨拙的,這樣將十分難以維護(hù)。采用純JSP來開發(fā)web應(yīng)用,JSP可能很容易的嵌入html代碼,并通過jsp表達(dá)式可以很容易的動(dòng)成生成html內(nèi)容,JSP還定義了對象的作用域。關(guān)鍵是可以在jsp中編寫任何java代碼,相比純servlet來說,用JSP開發(fā)要輕松多了。但是把所有業(yè)務(wù)代碼編寫在JSP中,任然不能把java開發(fā)人員與UI開發(fā)人員進(jìn)行分工。業(yè)務(wù)方法無法進(jìn)行測試和重用,代碼重用只能是簡單的代碼復(fù)制,這樣的web應(yīng)用仍然難以進(jìn)行維護(hù)。
          采用jsp+servlet的MVC模式進(jìn)行開發(fā),java開發(fā)人員負(fù)責(zé)開發(fā)servlet,而UI開發(fā)人員設(shè)計(jì)HTMl和編寫JSP,每一個(gè)請求對應(yīng)一個(gè)servlet,由servlet調(diào)用業(yè)務(wù)對象,獲得業(yè)務(wù)數(shù)據(jù),并選擇視圖進(jìn)行轉(zhuǎn)發(fā)。在這里JSP沒有了任何業(yè)務(wù)代碼,僅僅是顯示數(shù)據(jù)。這樣通過JSP與servlet相結(jié)合的MVC模式,可以讓java開發(fā)人員與UI人員進(jìn)行分工,也便于了業(yè)務(wù)代碼的測試。但是每一個(gè)請求都對應(yīng)一個(gè)單一的servlet,需要產(chǎn)生大量的servlet類,把許多方法分散到多個(gè)servlet類中,需要對相似的請求過程編寫?yīng)毩⒌姆椒ǎ荒苓M(jìn)行方法的重用。從而產(chǎn)生大量的重復(fù)代碼,大量的servlet配置將非常煩瑣。從而需要對大量的servlet進(jìn)行維護(hù)。如果有一個(gè)控制器來接收所有的請求,根據(jù)請求的參數(shù),把請求傳遞一個(gè)委托對象,由委托對象來完成以前控制器完成的工作。這個(gè)控制器一般由一個(gè)servlet來完成,這就是前端控制器模式。這個(gè)前端控制器作為一個(gè)web應(yīng)用的處理中心,用來處理所有相關(guān)的請求,對所有請求進(jìn)行集中控制。前端控制器相當(dāng)于web應(yīng)用的集中處理器,完成所有請求的控制,對所有請求都需要處理的邏輯可以在端控制器中完成。把請求對象傳遞給委托對象。這個(gè)委托對象就像以前的控制器那樣工作,也就是命令模式的運(yùn)用。通過這種方式,一個(gè)WEB應(yīng)用只需要配置一個(gè)前端控制器(當(dāng)然有必要時(shí)可以多個(gè)),具體的控制邏輯交給委托對象去完成,我把這個(gè)委托對象稱為控制器,可以很好的實(shí)現(xiàn)代碼重用,java開發(fā)人員與UI開發(fā)人員的真正分離,讓開發(fā)人員只關(guān)心真正的業(yè)務(wù)實(shí)現(xiàn)。業(yè)務(wù)對象是真正的pojo對象,可以方便的進(jìn)行單元測試。
          幾乎所有WEB框架都是基于前端控制器,命令模式的MVC運(yùn)用,如webwork,spring mvc,struts。

          posted on 2007-04-21 01:08 sooxin 閱讀(177) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA

          主站蜘蛛池模板: 太和县| 泰兴市| 贡嘎县| 江孜县| 从化市| 湘潭市| 惠来县| 响水县| 延寿县| 德令哈市| 福鼎市| 务川| 龙海市| 安西县| 勐海县| 武穴市| 德保县| 武川县| 涿州市| 集贤县| 鄢陵县| 洞头县| 乐清市| 澎湖县| 湟中县| 泸水县| 广河县| 霍城县| 吉木萨尔县| 罗平县| 玉田县| 和田县| 都江堰市| 寿宁县| 阳谷县| 云林县| 嘉义县| 杂多县| 沙河市| 西盟| 南京市|