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