Gay Bird

          登高者必自卑,行遠者必自邇,在這個世界上,重要的不是你正站在那里,而是你正朝什么方向移動......

          編程經(jīng)驗系列-Java學(xué)習(xí)雜談(八)

          終于正式進入J2ee的細節(jié)部分了,首當(dāng)其沖的當(dāng)然是Servlet和Jsp了,上篇曾經(jīng)提到過J2ee只是一個規(guī)范和指南,定義了一組必須要遵循的接口,核心概念是組件和容器。曾經(jīng)有的人問筆者Servlet的Class文件是哪里來的?他認(rèn)為是J2ee官方提供的,我舉了一個簡單的反例:稍微檢查了一下Tomcat5.0里面的Servlet.jar文件和JBoss里面的Servlet.jar文件大小,很明顯是不一樣的,至少已經(jīng)說明了它們不是源自同根的吧。其實Servlet是由容器根據(jù)J2ee的接口定義自己來實現(xiàn)的,實現(xiàn)的方式當(dāng)然可以不同,只要都遵守J2ee規(guī)范和指南。

              上述只是一個常見的誤區(qū)罷了,告訴我們要編譯運行Servlet,是要依賴于實現(xiàn)它的容器的,不然連jar文件都沒有,編譯都無法進行。那么Jsp呢? Java       Server       Page的簡稱,是為了開發(fā)動態(tài)網(wǎng)頁而誕生的技術(shù),其本質(zhì)也是Jsp,在編寫完畢之后會在容器啟動時經(jīng)過編譯成對應(yīng)的Servlet.只是我們利用Jsp 的很多新特性,可以更加專注于前后臺的分離,早期Jsp做前臺是滿流行的,畢竟里面支持Html代碼,這讓前臺美工人員可以更有效率的去完成自己的工作。然后Jsp將請求轉(zhuǎn)發(fā)到后臺的Servlet,由Servlet處理業(yè)務(wù)邏輯,再轉(zhuǎn)發(fā)回另外一個Jsp在前臺顯示出來。這似乎已經(jīng)成為一種常用的模式,最初筆者學(xué)習(xí)J2ee的時候,大量時間也在編寫這樣的代碼。

              盡管現(xiàn)在做前臺的技術(shù)越來越多,例如Flash、Ajax等,已經(jīng)有很多人不再認(rèn)為Jsp重要了。筆者覺得Jsp帶來的不僅僅是前后端分離的設(shè)計理念,它的另外一項技術(shù)成就了我們今天用的很多框架,那就是Tag標(biāo)簽技術(shù)。所以與其說是在學(xué)習(xí)Jsp,不如更清醒的告訴自己在不斷的理解Tag標(biāo)簽的意義和本質(zhì)。

              1.   Servlet以及Jsp的生命周期

              Servlet是Jsp的實質(zhì),盡管容器對它們的處理有所區(qū)別。Servlet有init()方法初始化,service()方法進行Web服務(wù), destroy()方法進行銷毀,從生到滅都由容器來掌握,所以這些方法除非你想自己來實現(xiàn)Servlet,否則是很少會接觸到的。正是由于很少接觸,才容易被廣大初學(xué)者所忽略,希望大家至少記住Servlet生命周期方法都是回調(diào)方法。回調(diào)這個概念簡單來說就是把自己注入另外一個類中,由它來調(diào)用你的方法,所謂的另外一個類就是Web容器,它只認(rèn)識接口和接口的方法,注入進來的是怎樣的對象不管,它只會根據(jù)所需調(diào)用這個對象在接口定義存在的那些方法。由容器來調(diào)用的Servlet對象的初始化、服務(wù)和銷毀方法,所以叫做回調(diào)。這個概念對學(xué)習(xí)其他J2ee技術(shù)相當(dāng)關(guān)鍵!

              那么Jsp呢?本事上是Servlet,還是有些區(qū)別的,它的生命周期是這樣的:

              a)   一個客戶端的Request到達服務(wù)器       ->

              b)   判斷是否第一次調(diào)用       ->       是的話編譯Jsp成Servlet

              c)   否的話再判斷此Jsp是否有改變       ->       是的話也重新編譯Jsp成Servlet

              d)   已經(jīng)編譯最近版本的Servlet裝載所需的其他Class e)   發(fā)布Servlet,即調(diào)用它的Service()方法

              所以Jsp號稱的是第一次Load緩慢,以后都會很快的運行。從它的生命的周期確實不難看出來這個特點,客戶端的操作很少會改變Jsp的源碼,所以它不需要編譯第二次就一直可以為客戶端提供服務(wù)。這里稍微解釋一下Http的無狀態(tài)性,因為發(fā)現(xiàn)很多人誤解,Http的無狀態(tài)性是指每次一張頁面顯示出來了,與服務(wù)器的連接其實就已經(jīng)斷開了,當(dāng)再次有提交動作的時候,才會再次與服務(wù)器進行連接請求提供服務(wù)。當(dāng)然還有現(xiàn)在比較流行的是Ajax與服務(wù)器異步通過 xml交互的技術(shù),在做前臺的領(lǐng)域潛力巨大,筆者不是Ajax的高手,這里無法為大家解釋。2.   Tag標(biāo)簽的本質(zhì)

              筆者之前說了,Jsp本身初衷是使得Web應(yīng)用前后臺的開發(fā)可以脫離耦合分開有效的進行,可惜這個理念的貢獻反倒不如它帶來的Tag技術(shù)對J2ee的貢獻要大。也許已經(jīng)有很多人開始使用Tag技術(shù)了卻并不了解它。所以才建議大家在學(xué)習(xí)J2ee開始的時候一定要認(rèn)真學(xué)習(xí)Jsp,其實最重要的就是明白標(biāo)簽的本質(zhì)。

              Html標(biāo)簽我們都很熟悉了,有   <html>   、   <head>   、   <body>   、   <title>   ,Jsp帶來的Tag標(biāo)簽遵循同樣的格式,或者說更嚴(yán)格的Xml格式規(guī)范,例如   <jsp:include>   、   <jsp:useBean>   、   <c:if>   、   <c:forEach>   等等。它們沒有什么神秘的地方,就其源頭也還是Java       Class而已,Tag標(biāo)簽的實質(zhì)也就是一段Java代碼,或者說一個Class文件。當(dāng)配置文件設(shè)置好去哪里尋找這些Class的路徑后,容器負責(zé)將頁面中存在的標(biāo)簽對應(yīng)到相應(yīng)的Class上,執(zhí)行那段特定的Java代碼,如此而已。

              說得明白一點的話還是舉幾個簡單的例子說明一下吧:

              <jsp:include>   去哪里找執(zhí)行什么class呢?首先這是個jsp類庫的標(biāo)簽,當(dāng)然要去jsp類庫尋找相應(yīng)的class了,同樣它也是由Web容器來提供,例如 Tomcat就應(yīng)該去安裝目錄的lib文件夾下面的jsp-api.jar里面找,有興趣的可以去找一找啊!

              <c:forEach>   又去哪里找呢?這個是由Jsp2.0版本推薦的和核心標(biāo)記庫的內(nèi)容,例如   <c:if>   就對應(yīng)在頁面中做if判斷的功能的一斷Java代碼。它的class文件在jstl.jar這個類庫里面,往往還需要和一個standard.jar類庫一起導(dǎo)入,放在具體Web項目的WEB-INF的lib目錄下面就可以使用了。

              順便羅唆一句,Web       Project的目錄結(jié)構(gòu)是相對固定的,因為容器會按照固定的路徑去尋找它需要的配置文件和資源,這個任何一本J2ee入門書上都有,這里就不介紹了。了解Tag的本質(zhì)還要了解它的工作原理,所以大家去J2ee的API里找到并研究這個包:javax.servlet.jsp.tagext.它有一些接口,和一些實現(xiàn)類,專門用語開發(fā)Tag,只有自己親自寫出幾個不同功能的標(biāo)簽,才算是真正理解了標(biāo)簽的原理。別忘記了自己開發(fā)的標(biāo)簽要自己去完成配置文件,容器只是集成了去哪里尋找jsp標(biāo)簽對應(yīng)class的路徑,自己寫的標(biāo)簽庫當(dāng)然要告訴容器去哪里找啦。

              說了這么多,我們?yōu)槭裁匆脴?biāo)簽?zāi)兀客耆贘sp里面來個   <%       %>   就可以在里面任意寫Java代碼了,但是長期實踐發(fā)現(xiàn)頁面代碼統(tǒng)一都是與html同風(fēng)格的標(biāo)記語言更加有助于美工人員進行開發(fā)前臺,它不需要懂Java,只要Java程序員給個列表告訴美工什么標(biāo)簽可以完成什么邏輯功能,他就可以專注于美工,也算是進一步隔離了前后臺的工作吧!

              3.   成就Web框架框架是什么?曾經(jīng)看過這樣的定義:與模式類似,框架也是解決特定問題的可重用方法,框架是一個描述性的構(gòu)建塊和服務(wù)集合,開發(fā)人員可以用來達成某個目標(biāo)。一般來說,框架提供了解決某類問題的基礎(chǔ)設(shè)施,是用來創(chuàng)建解決方案的工具,而不是問題的解決方案。

              正是由于Tag的出現(xiàn),成就了以后出現(xiàn)的那么多Web框架,它們都開發(fā)了自己成熟實用的一套標(biāo)簽,然后由特定的Xml文件來配置加載信息,力圖使得Web 應(yīng)用的開發(fā)變得更加高效。下面這些標(biāo)簽相應(yīng)對很多人來說相當(dāng)熟悉了:

              <html:password>

              <logic:equal>

              <bean:write>

              <f:view>

              <h:form>

              <h:message>

              它們分別來自Struts和JSF框架,最強大的功能在于控制轉(zhuǎn)發(fā),就是MVC三層模型中間完成控制器的工作。Struts-1實際上并未做到真正的三層隔離,這一點在Struts-2上得到了很大的改進。而Jsf向來以比較完善合理的標(biāo)簽庫受到人們推崇。

              今天就大概講這么多吧,再次需要強調(diào)的是Servlet/Jsp是學(xué)習(xí)J2ee必經(jīng)之路,也是最基礎(chǔ)的知識,希望大家給與足夠的重視!

          posted on 2008-09-12 17:21 Sky Yi 閱讀(172) 評論(0)  編輯  收藏 所屬分類: 編程經(jīng)驗系列-Java學(xué)習(xí)雜談(轉(zhuǎn))

          主站蜘蛛池模板: 南充市| 宜州市| 山东省| 临江市| 玉山县| 穆棱市| 商洛市| 泊头市| 乌鲁木齐县| 虞城县| 台北县| 准格尔旗| 平阴县| 仙居县| 鲁山县| 襄城县| 普定县| 西丰县| 呼伦贝尔市| 治多县| 天祝| 肃宁县| 深水埗区| 南丹县| 三穗县| 乐山市| 花垣县| 上饶市| 公主岭市| 刚察县| 乡城县| 南昌市| 清河县| 五指山市| 噶尔县| 潞城市| 马关县| 农安县| 新余市| 万源市| 迁安市|