在.Net的世界裡,最受關注的應該是控件的開發了,一個設計良好,功能強大的控件對於提高開發效率無疑是極好的助推器。很多.NET的開發人員都將精力花在設計控件上,.Net就像一個聚寶盆一樣,不斷匯聚開發人員智慧結晶。
[前言] 寫這篇Post源於我既做過.Net開發又做過J2EE開發的經歷。在這樣的轉變過程中,我對單一平台開發所帶來的思維局限性有了很多清晰卻零散的想法。在看了振河兄的頁面間傳遞變量的方法及使用范圍的討論之後,我更能體會到在不同的平台進行開發,思維方式會是如此之不同,原來那些零散的想法也隨之不斷在腦海中湧現,讓我有了寫下這篇Post的沖動。其實我一直都在宣揚一種觀點:技術之間是相通的,精於觸類旁通,善於聯想是我們程序員應有的優勢。我們在專注.NET技術的時候,不妨在工作間隙休息的時候看看.Net外面的世界。
提到.NET和J2EE,一般都會想到它們之間兵戎相見,水火不容的關系,畢竟兩者都在努力地去虜獲程序員的青睐,占領更多的市場份額。我無意去鼓吹.NET是如何如何之強大,J2EE是如何如何的成熟,也無意去探究NHibernate,Spring.Net等等Project的起源,只想從一個程序員的角度去看待兩者在互相競爭的過程當中到底相互借鑒了什麼,同時探討一下同時了解兩個領域知識的必要性。好,讓我們言歸正傳。
還記得2003年初,我到了DELL公司實習,所承擔的工作任務就是建立一個Web Application供多個有密切聯系的部門使用,以提高部門間的協作程度。在選擇用什麼技術來做這個Web Application的時候,我放棄了比較熟悉的ASP,進而選擇了ASP.NET。正是做這個Project,我跟ASP.NET乃至.NET結下了不解之緣。當時第一次接觸到ASP.Net,第一個感覺就是,它比ASP好多了,再也不用像寫ASP那樣在Html嵌套著一堆堆的Scriptlet,動態內容的呈現都包含在一個個方法中,如Page.OnInit()和Page.OnLoad()等等,這些方法讓我看到ClIEnt端JS方法的影子。
在開發ASP.NET頁面的過程中,我需要做的就是在頁面中引入不同的Web Control或者是HTML Control,這些Controls與HTML標簽是何等的類似,除了它有ASP的prefix和那時看起來如Magic一般的runat="server"。這樣的相似性讓熟悉Html和JS的我很快掌握了ASP.NET的基本應用,而我也以極高的效率完成了公司分配給我的任務,盡管我對諸如Request、Response、Session和Application這樣的對象並不是十分了解。ASP.NET所帶來的進步是革命性的,難怪有朋友認為ASP.NET是.NET家族中最為成功的產品了。我當時只是拿ASP.Net來跟ASP作對比,其優越性自然顯露無遺,尤其是在控件設計方面的優勢。
事實上直到後來進入J2EE的開發領域,我依然對ASP.NET的開發方式贊賞有加。Microsoft在技術的創新上一直秉持削弱領域開發特性的原則,讓開發人員能夠在不同的開發領域中都可以輕松上手,游刃有余。ASP.Net的出現帶來了WebForm,而在桌面程序開發中則有WinForm,兩者相通的地方隨處可見,這讓原有的桌面程序開發人員可以平滑的過渡到Web Application開發中來;ASP.NET對於控件在設計以及使用上的支持堪稱完美,也為網頁設計人員進入ASP.Net開發領域掃除了不少的障礙。反觀J2EE領域,做Swing開發的人員,如果要學習Web的開發,原有的知識幾乎無用武之地了。
在這個人氣就是財富的年代,在一定層面上求同存異,讓開發人員能夠一通百通,無疑是一個十分明智的做法。J2EE領域也開始意識到了這一點,將Swing概念應用到Web開發的Wicket Framwork的發布著實是一個極大的進步啊。J2EE在降低web開發的難度,吸引入門級開發人員方面需要向.Net好好請教一番了。
好,個人經歷接著說。2003年底,我進入了一家軟件公司從事J2EE的開發工作。當時公司技術部門負責人在面試我的時候提到了我缺乏J2EE的開發經驗的問題,我信心滿滿的告訴他,我做過.NET的項目,而.NET和J2EE都是專注在企業級應用上的,因此肯定會很快上手,不會有什麼問題。然而後來的工作證明了平台之間的差異性是很大的,從.Net過渡到J2EE並不是一件輕松的事情。沒有了熟悉的Web Control,取而代之的是簡陋的Tag Library;沒有了簡單易用的Event-Driven的方法,呈現眼前的是doGet、doPost、doHead和service這樣看似丑陋的面孔。
蛻變的過程是痛苦的,但是蛻變帶來了進化。開發方式的改變讓我可以從一個更加深入的層面去看待Web開發,而我開始重新認識Web Application。web開發的復雜性在很大程度上源於Http是一個無狀態的連接協議,Web Server不管你是Michael,還是Jordon,只要你在浏覽器上使用了相同的URL,就會得到相同的資源。在這裡,你必須清楚URL到底是什麼的縮寫。也許你會站出來反駁我剛才所說的結論,但是這種情況在只有靜態HTML網頁的年代是絕對正確的。隨著時代的發展,資源已經不再局限於靜態的Html網頁,隨之出現了所謂的動態網頁。這裡的動態不是指充滿Flash動畫的網頁,而是指網頁的內容會根據不同的Request而發生變化。雖然Web的內容開始個性化了,但是仍然沒有脫離ClIEnt發送Request,Server返回Response這樣的模式。
由於Http是一個無狀態的連接協議,為了能夠識別用戶訪問同一資源的狀態,在J2EE的世界裡,我們就得從Request、Response和Session這樣的對象入手,控制這些對象的Life Cycle。因此,我們哪怕要進行最為簡單的Web應用程序,都必須對Request、Response和Session這樣的對象有充分的了解。關注這些基本的對象,讓我們對於應用程序的Flow有更為准確的把握,能夠更好地進行模塊地劃分,便於開發人員進行協作。
然而在.NET的世界裡,對Request和Session這樣的對象關注遠不如對Page的關注,從振河兄的Post就可見一斑了。ASP.NET開發降低了開發難度,卻在一定程度上阻礙了開發人員對Web Application的整體把握,正如春魚兄的Feedback中提到的,過分糾纏頁面之間關系,“不利於系統整體架構的良好設計”。J2EE的應用程序可以讓程序員在Web Application的整體架構上有一個很好的體現,.NET還是得好好努力啊!建議.Net的程序員能夠嘗試著利用J2EE的技術來開發一個簡單的Web Application,我相信這樣的一個過程會讓你對web開發有進一步的認識。
進入了J2EE的領域,除了開發方式變了,buzz Words也跟著改變了。兩個使用頻率極高的詞匯充斥著每天的工作,一個是MVC,另一個則是Framework。我感慨於Pattern在J2EE中使用的廣泛性,感慨於應用實現了MVC模式的Framework竟然可以讓龐大的團隊協同開發一個Project。那時的我開始相信Pattern的廣泛應用給軟件開發帶來的變化是巨大而深遠的,也開始閱讀《Core J2EE Patterns》並從中獲益。而在.Net的世界裡,對Pattern的重視則遠不如J2EE,盡管這樣的情況在改變。說到了MVC,不得不對這樣一個份量很重的詞匯做些陳述了。
JSP的發展經歷了兩個階段:JSP Model1和JSP Model2。在Model1中是JSP和JavaBean的結合,在一定程度上實現了MVC,但是Model與Control之間的耦合仍然普遍存在;而Model2則真正實現了MVC:JSP作為Presentation層,負責數據的顯示;Servlet充當著一個Request Dispatcher的角色,將Request分發至不同的處理Business的模塊中,它就是一個指揮官,扛著Controller這面大旗;而VO則是一個數據的載體,是MVC三角中的Model。
MVC的概念是進入J2EE開發領域必備的,從你做第一個簡單的應用程序開始,從你看第一篇關於J2EE開發的文章開始,而豐富的開源MVC Framework也成為了我們學習MVC Pattern的良好教材。對J2EE有了初步的認識之後,就可以選擇一些優秀的MVC Framework來研究了,例如WebWork和Spring。這對於學習系統整體架構設計方面是大有裨益的。
也許物極必反真的是一條不變的真理,J2EE領域中對於開發Framework的追求可謂之瘋狂,大家朝這裡看:Wicket - Introduction。你會發現可以用來開發Web Application的Framework竟然達到了55個,並且還在日益增加。事實上J2EE開發的軟肋不在於Control這個層面,而是在VIEw。許多天才的精力都耗在重復制造輪子上,卻沒有想辦法去完善一個或者多個Framework,這不得不讓人感到痛心啊!在這一點,J2EE是不是得向.NET好好學習一下呢?在.Net的世界裡,最受關注的應該是控件的開發了,一個設計良好,功能強大的控件對於提高開發效率無疑是極好的助推器。
很多.NET的開發人員都將精力花在設計控件上,.Net就像一個聚寶盆一樣,不斷匯聚開發人員智慧結晶。在J2EE的世界裡,為了減少這種資源浪費的情況,Wicket Framework的出現了。它強調組件設計和組件重用,讓開發人員集中精力於組件的開發,從而增強Framework的功能已經易用性。但願,Wicket Framework能夠為J2EE世界帶來少許的改變吧!
說著說著,真的有點野馬脫缰的感覺了。不知道說了半天,大家是否明白我真正的用意呢? 在這個技術如此Open的年代,.Net的程序員應該去了解J2EE,反之亦然。我想,相互學習,共同進步這句再普通不過的話可以概括這羅羅嗦嗦的數千字吧。