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