轉:與struts的親密接觸&理解web開發
與struts的親密接觸
當時上網看招聘信息,j2ee相關職位的都要求懂struts。看來學習struts是勢在必行了。Struts的確是當時最優秀的框架,開發人員再也不用對每個方法都寫一個servlet類了。請求成功或失敗后的頁面跳轉不用寫死在代碼中,而是可以通過struts-config.xml來進行配置,表單組件可以自動的綁定成actionForm對象。還可以自定義數據校驗邏輯。Struts還提供了一個通用的數據校驗框架.struts還提供了豐富的顯示標簽。主要的時間都花在標簽的學習上了。Struts顯示標簽比時當時的jsp 表達式的確是一大進步了。在jsp頁面,不達再寫’<% %>’這些表過式語言了,而是使用像html那樣的標簽。當jstl出現后,jstl的類似c語言似的標記語言要比struts顯示標答優秀得多。Struts顯示標簽不能自動處理null值問題,struts顯示標簽還是顯得太復雜了,花那么大的力氣去學習struts顯示標簽顯然是很不值的一件事!
我用jsp+servlet開發的時間要比用struts進行開發的時間長得多,但是struts的確是一個非常優秀的框架。
基于html: web應用是基于html的,不管是jsp還是asp,asp.net還是jsf都是在服務器端把相應的代碼解釋成html代碼,然后在客戶端通過瀏覽器解析顯示出來。
無狀態編程:不管采用什么技術,web開發終竟是無狀態編程。也就是在客戶端并不能保持應用程序的任何狀態。在swing或vb等桌面開發時,客戶程序可以通過變量來保持系統的狀態。而基于html的web應用是無法保持狀態的。Web應用狀態都需要由應用服務器來保持。
請求響應及推/拉模式:在swing或vb等桌面應用程序中,當某一狀態發生改變時,后臺程序可以觸發系統更新前端的UI組件,甚至可以使用觀察者模式,當某一狀態發生改變時,通知所有需要更新的前端UI組件,加載數據刷新組件。完成UI組件的更新,用戶可能沒有做任何動作,這就是推模式。而web應用正好相反,用戶從客戶端發出一個請求,服務器接到客戶端的請求后,讀取請求參數,調用業務方法,獲得業務數據,用業務數據重新生成新的html頁面,呈現給客戶端,由瀏覽器進行解析顯示,這就是拉模式。請求響應的拉模式是web應用最大的特點,任何請求的頁面在發出請求后,請求頁面所有組件的狀態都被刷新而無法得以保持。
MVC:MVC即model模型數據,view 視圖,controller 控制器。MVC模式讓每一個組件都有了一個明確的職責,模型數據不含有視圖特有的代碼,視圖不含有控制代碼或數據訪問代碼,主要是顯示模型數據。控制器接收請求,獲得數據,進行視圖轉發。
控制器是WEB應用中的中樞神經,web應用控制器的主要職責:校驗及獲取請數參數,調用業務對象進行業務處理,把從頁面獲得的請求參數傳遞給業務對象。通過業務調用獲得數據或創建模型數據。在需要保持服務端狀態的應用中,創建或操作session狀態。創建一個視圖,由視圖來使用模型數據。
模型含有由視圖顯示的數據,在j2ee web應用中,模型一般是JavaBean。Web應用中的模型一般表示一個完整的業務操作的結果對象。這個結果對象通常不是一個真實的領域對象,而是一個只有getter,setter方法的對象(如值對象),通常稱為偽數據對象。模型沒有必要進行進一步的操作,如數據訪問等,模型也不應該依賴Serlvet或某一WEB應用框架.
視圖用于呈現模型數據,負責生成標簽或其它內容。視圖不需要了解控制器或業務對象。視圖不應該直接處理請求參數,而是應該由控制器去做。也不應該進行數據查詢,如sql查詢,視圖不應該處理數據查詢異常。顯圖只需要執行必要的顯示邏輯,把模型數據通過一定的邏輯呈現給用戶。
Front Controller前端控制器與命令模式:采用純Servlet和JSP的model 1進行web開發都是非常復雜的。不可能實現java開發人員與UI開發人員角色的分離。采用純Servlet來開發web應用,如果要從serlvet這種純java對象中配合html標記進行web開發是非常笨拙的,這樣將十分難以維護。采用純JSP來開發web應用,JSP可能很容易的嵌入html代碼,并通過jsp表達式可以很容易的動成生成html內容,JSP還定義了對象的作用域。關鍵是可以在jsp中編寫任何java代碼,相比純servlet來說,用JSP開發要輕松多了。但是把所有業務代碼編寫在JSP中,任然不能把java開發人員與UI開發人員進行分工。業務方法無法進行測試和重用,代碼重用只能是簡單的代碼復制,這樣的web應用仍然難以進行維護。
采用jsp+servlet的MVC模式進行開發,java開發人員負責開發servlet,而UI開發人員設計HTMl和編寫JSP,每一個請求對應一個servlet,由servlet調用業務對象,獲得業務數據,并選擇視圖進行轉發。在這里JSP沒有了任何業務代碼,僅僅是顯示數據。這樣通過JSP與servlet相結合的MVC模式,可以讓java開發人員與UI人員進行分工,也便于了業務代碼的測試。但是每一個請求都對應一個單一的servlet,需要產生大量的servlet類,把許多方法分散到多個servlet類中,需要對相似的請求過程編寫獨立的方法,不能進行方法的重用。從而產生大量的重復代碼,大量的servlet配置將非常煩瑣。從而需要對大量的servlet進行維護。如果有一個控制器來接收所有的請求,根據請求的參數,把請求傳遞一個委托對象,由委托對象來完成以前控制器完成的工作。這個控制器一般由一個servlet來完成,這就是前端控制器模式。這個前端控制器作為一個web應用的處理中心,用來處理所有相關的請求,對所有請求進行集中控制。前端控制器相當于web應用的集中處理器,完成所有請求的控制,對所有請求都需要處理的邏輯可以在端控制器中完成。把請求對象傳遞給委托對象。這個委托對象就像以前的控制器那樣工作,也就是命令模式的運用。通過這種方式,一個WEB應用只需要配置一個前端控制器(當然有必要時可以多個),具體的控制邏輯交給委托對象去完成,我把這個委托對象稱為控制器,可以很好的實現代碼重用,java開發人員與UI開發人員的真正分離,讓開發人員只關心真正的業務實現。業務對象是真正的pojo對象,可以方便的進行單元測試。
幾乎所有WEB框架都是基于前端控制器,命令模式的MVC運用,如webwork,spring mvc,struts。
posted on 2007-04-21 01:08 sooxin 閱讀(178) 評論(0) 編輯 收藏 所屬分類: JAVA