第一頁(共4頁) 自從我(原文作者)在2001年底發(fā)表了“JSP最佳實踐”以來,JSP技術(shù)已經(jīng)有了戲劇般的發(fā)展。許多的工具已經(jīng)使得開發(fā)基于JSP技術(shù)的網(wǎng)頁變的更加容易。在上一篇我的“最佳實踐”的文章中所提到的實踐依然適用。然而,隨著新的特性,工具,以及JSP開發(fā)思想的出現(xiàn)你需要使用更多的最佳實踐來開發(fā)更加平滑的高維護(hù)性能的JSP的應(yīng)用。這篇文章列出了一些應(yīng)用了最重要的新的特性,工具和思想的最佳實踐: l 開始編寫JSP document. l 引入JSP編程約定 l 使用正確的范圍(Scope) l 小心的管理“會話”范圍 l 利用JSTL(javaServer Pages Standard Tag Library)的特點 l 利用servlet filers(Intercepting Filter pattern)的特點 l 創(chuàng)建你的Jsp pages的文檔 l 預(yù)先編譯JSP網(wǎng)頁和文檔 l 組織文件和目錄以便于容易的開發(fā)和部署 l 小心使用私有的,與供應(yīng)商特定的特性 l Html標(biāo)簽使用XHTML(Extensible HyperText Markup Language)語法 使用JSP document.不是JSP pages
基于以下幾個原因我推薦使用JSP document. l JSP document.很好組織了的XML/HTML(You can easily verify JSP document. as well-formed XML/HTML) l 可以使用XML Schema來驗證JSP document. l 可以很容易的使用標(biāo)準(zhǔn)的XML工具來寫和解析 l 可以使用XSLT(Extensible Stylesheet Language Transformations)以不同的form來編寫JSP document.具體請看“JSP document.nbspwith XSLT” http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#sidebar1 l JSP使用了XML相容include和forward action,custom標(biāo)簽,因而使得整個document.XML相容,這樣就提高了編碼的一致性。 l JSP document.相對JSP pages需要稍微多一點的開發(fā)規(guī)則,但是帶來的好處是更加容易閱讀和維持的document.,特別是對于剛剛開始學(xué)習(xí)JSP的人來說。
關(guān)于創(chuàng)建JSP document.和其特點的詳細(xì)內(nèi)容請參考“Write JSPs in XML Using JSP1.2”(http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#resources) JSP document.最大的缺點是沒有與XML相兼容的JSP注釋存在。JSP document.以使用客戶端的注釋(HTML-/XML –style)或者是嵌入的java注釋。但是沒有JSP document.<%-- --> 而JSP可用的上面的兩種注釋方法都有其自身的缺點。你可以在得到的網(wǎng)頁中看到客戶端的注釋(通過瀏覽器視圖里面的“查看源文件”功能),而且要使用java的注釋需要將java代碼直接的寫在JSP document.中。
Sun Microsytem 最近已經(jīng)幫助一些組織來創(chuàng)建這樣的規(guī)范,制定了文檔“Code Conventions for the JavaServer Pages Technology Version 1.x Language”可以免費獲得,參考“Resources”(http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#resources)。如果你的公司還沒有遵循JSP編程規(guī)范的話,我建議使用這個文檔作為一個起點。你可以完全的遵照該文檔也可以在其基礎(chǔ)上創(chuàng)建自己的規(guī)范。
應(yīng)用范圍(Application scope) Application scope 是最為廣泛的一個范圍,應(yīng)該在必要的時候才采用這種形式。你可以在非會話相關(guān)(session-aware)的JSPs中創(chuàng)建綁定到application的對象(You can create objects bound at application level in JSPs that are not session-aware,)在這種類型的JSPs中可以用應(yīng)用范圍來存儲數(shù)據(jù)和信息。( so application scope is useful for storing information when using these types of JSPs)。你也可以使用綁定到application的對象用來在不同的會話(session)間共享數(shù)據(jù)。當(dāng)你不需要application范圍的對象的時候一定要顯式的刪除它們以便釋放內(nèi)存。
采用JSTL(標(biāo)準(zhǔn)標(biāo)簽庫) JSP的引入和采納已經(jīng)成為JSP開發(fā)人員的一個最為重要的進(jìn)步。JSTL有時候也稱為“JSP Standard Tag Library”。在JSTL中的T代表的是標(biāo)簽(Tag)而不是模板(Template)。
JSTL:背景與回顧 在我以前的文章里,我提到過JSP開發(fā)人員采納可以得到的自定義標(biāo)簽庫而不是自己從頭開始創(chuàng)建。有許多的商業(yè)的或者開源的自定義標(biāo)簽庫現(xiàn)在已經(jīng)可以加以利用。但是有一個缺點就是:開發(fā)人員需要在JSP中按照這些自定義標(biāo)簽庫所特定的格式來應(yīng)用這些標(biāo)簽。JSTL的出現(xiàn)解決了這個問題,因為JSTL提供了自定義標(biāo)簽的標(biāo)準(zhǔn)接口,這些標(biāo)簽足以滿足JSP開發(fā)人員的一些基本的要求。(The advent of JSTL has addressed this downside by PRoviding standard interfaces to the custom tags that perform many basic functions JSP developers need.) 不同的供應(yīng)商可能以不同的形式實現(xiàn)這些JSTL標(biāo)簽,但是JSP開發(fā)人員不要知道實現(xiàn)標(biāo)簽時的不同點。 如果JSP開發(fā)人員使用JSTL編寫了JSP page或者JSP document.JSP page或者JSP document.該適用所有的JSTL實現(xiàn)方法。 有許多有價值的書和一些在線的資源可以去學(xué)習(xí)JSTL。這里我將主要簡單的介紹JSTL的優(yōu)點與特性。
JSTL的優(yōu)點 簡短的說,JSTL提供了所有的已經(jīng)公布的自定義標(biāo)簽庫所有的好處,而且提供標(biāo)準(zhǔn)化的標(biāo)簽API。JSTL促進(jìn)了高可維護(hù)性和可移植性的pages和document.。我列出了JSTL一些特別的特點。 l JSTL提供了基于標(biāo)簽的遍歷,條件以及其他一些功能,這些功能以前或者是直接在JSP中嵌入代碼來實現(xiàn)的,或者是使用了自己創(chuàng)建的標(biāo)簽,非標(biāo)準(zhǔn)的標(biāo)簽庫,或者是通過使用Servlet來代替JSP來實現(xiàn)的。 l JSTL使用了EL(eXPression language)語法 l 編寫自定義標(biāo)簽相對其他一些JSP開發(fā)任務(wù)來說需要更多的精力與經(jīng)驗。JSTL通過兩種方法來簡化這些步驟:首先,如前所述,jstl能解決很多定制(自定義)的tags的需要.(JSTL handles many common needs for custome tags)。其次,JSTL提供了一些機制使得編寫你自定義的標(biāo)簽更簡單,尤其是編寫支持EL自定義標(biāo)簽的時候。
數(shù)據(jù)訪問標(biāo)簽庫(Database access library) JSTL提供了數(shù)據(jù)訪問標(biāo)簽庫,但是我很少用它,因為我強烈的認(rèn)為不應(yīng)該在JSP頁面內(nèi)直接訪問數(shù)據(jù)庫。如果在JSP中直接的訪問數(shù)據(jù)庫將會降低重用,因為數(shù)據(jù)庫訪問的代碼在使用數(shù)據(jù)庫范圍標(biāo)簽的JSP頁面外是不可以被訪問到的。在JSPs中直接的進(jìn)行數(shù)據(jù)庫訪問將會加大表示層與數(shù)據(jù)層之間的耦合。嚴(yán)格的分割意味著更好的模塊化,復(fù)用性,以及更容易的滿足表現(xiàn)層和數(shù)據(jù)層之間的規(guī)范(Disciplined separation means more modularity, greater opportunity for reuse, and better opportunities for specialization of presentation and database experts)。.我推薦在JSTL的其他三種標(biāo)簽庫可以滿足JSP開放人員的需求的時候使用這些標(biāo)簽庫,但是我不推薦使用JSTL的數(shù)據(jù)庫范圍標(biāo)簽庫outside of prototypes and the simplest Web applications。
JSTL 核心標(biāo)簽庫(JSTL core tag library) 正像名字一樣,JSTL核心標(biāo)簽庫是在JSTL四種標(biāo)簽庫中最常用的一種。這個標(biāo)簽庫提供了對collection的遍歷,條件語句以及其它一些常用的程序結(jié)構(gòu)。JSTL核心標(biāo)簽庫可以使得JSP開放人員不必編寫他們自己的自定義標(biāo)簽庫或者直接在JSPs中嵌入Java代碼。 JSTL XML 標(biāo)簽庫(JSTL XML tag library) 這個標(biāo)記庫提供了一些令人贊嘆的且功能強大的XML操縱標(biāo)簽和XSLT轉(zhuǎn)換標(biāo)簽。
JSTL formatting 標(biāo)簽庫 如果需要在多個國家提供網(wǎng)頁和網(wǎng)址,那么國際化(internationalization)對網(wǎng)絡(luò)開發(fā)項目(web development projects)來說是一個很大的挑戰(zhàn)。JSTL formatting標(biāo)簽庫為此向JSP開發(fā)人員提供了一些自定義標(biāo)簽,可以支持按照特定的區(qū)域讀寫數(shù)字和實踐。
Expression Language JSTL以上的自定義標(biāo)簽庫有兩種類型:RT(traditional request time)自定義標(biāo)簽庫和EL標(biāo)簽。因為EL要更靈活一些,所有我推薦使用EL自定義標(biāo)簽庫。 JSTL和其他一些自定義標(biāo)簽庫
因為自定義標(biāo)簽庫(custom tag library)在JSTL引入以前已經(jīng)使用了很長的時間,許多的個體和組織都已經(jīng)開發(fā)了自定義的標(biāo)簽庫。這些標(biāo)簽庫在很大程度上與JSTL的功能都有重復(fù)。在大多數(shù)情況下,在考慮實現(xiàn)相同的功能時,我推薦使用JSTL而不是自己開放的自定義標(biāo)簽庫或者時其他一些可以得到的自定義標(biāo)簽庫(other publicly available custom tag library)。JSTL提供的標(biāo)準(zhǔn)化是一個意義重大的優(yōu)點因為API可以學(xué)一次,而后你就可以一貫的使用了。 比較Struts的標(biāo)簽庫和JSTL標(biāo)簽庫提供可以獲得一個很好利用這些最佳實踐的例子(Comparing Struts tag libraries and JSTL provides a good example of how to implement this best practice)。Struts提供了MVC框架以外其他的一些優(yōu)點。其中包括的Struts的自定義標(biāo)簽庫集合。在JSTL引入之前,Struts的自定義標(biāo)簽庫已經(jīng)支持遍歷( iteration)以及條件標(biāo)簽,但是現(xiàn)在我開始使用JSTL的遍歷和條件標(biāo)簽而不是Struts里面的標(biāo)簽。我現(xiàn)在仍然再使用Struts的form標(biāo)簽,這是因為這個標(biāo)簽與Struts的表單(form)緊密的聯(lián)系在一起,而且在JSTL沒有相對應(yīng)的標(biāo)簽可用。 比較其他的一些自定義標(biāo)簽庫和JSTL標(biāo)簽庫,上面的討論也是適用的。如果JSTL標(biāo)簽庫可以完全的支持同樣的功能的話,應(yīng)該使用標(biāo)準(zhǔn)的JSTL標(biāo)簽。當(dāng)然如果JSTL不支持的話,你就沒有辦法了。在大多數(shù)情況下,像我上面討論的Struts標(biāo)簽和JSTL標(biāo)簽,通常需要同時使用JSTL和其他一些自定義標(biāo)簽。
JSTL:最后的補充 關(guān)于JSTL更詳細(xì)的內(nèi)容,她的特點,以及如何在你的jsp中應(yīng)用JSTL請參考“resources” http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp-p2.html#resources 在“resource”中包含了到“Apache’s Standard Taglib(一個開源的,廣泛使用的JSTL實現(xiàn))的連接。 Web server的提供商已經(jīng)開始在他們的web服務(wù)器上發(fā)布JSTL的實現(xiàn),JSTL預(yù)測將成為最終的JSP2。0規(guī)范中的一部分。