在HTML頁(yè)面中不要過(guò)多使用Java代碼:將所有的Java代碼直接放在JSP頁(yè)面中,對(duì)于小項(xiàng)目而言沒(méi)有問(wèn)題,但是過(guò)度使用將會(huì)導(dǎo)致意大利面條似的代碼,難于閱讀,難于理解。減少Java代碼的方法是編寫(xiě)?yīng)毩⒌腏ava類(lèi)來(lái)實(shí)現(xiàn)計(jì)算等邏輯。一旦測(cè)試了這些類(lèi),就創(chuàng)建了實(shí)例。
選擇合適的include機(jī)制: 最好將頁(yè)眉、頁(yè)腳和導(dǎo)航條內(nèi)容存儲(chǔ)在單個(gè)文件中,并且不要重新動(dòng)態(tài)產(chǎn)生它們。一旦將這些內(nèi)容存儲(chǔ)在各個(gè)獨(dú)立的文件中,使用下面include機(jī)制中的任何一個(gè)就能在所有的頁(yè)面中引入它們:
Include 指令: <%@ include file="filename" %>
Include行為: <jsp:include page="page.jsp" flush="true" />
當(dāng)JSP正在轉(zhuǎn)換成Servlet時(shí),第一種include機(jī)制將包含指定文件的內(nèi)容(轉(zhuǎn)換階段),對(duì)于第二種include機(jī)制來(lái)說(shuō),當(dāng)該頁(yè)面執(zhí)行后時(shí),頁(yè)面包含了用Response產(chǎn)生的內(nèi)容。當(dāng)被包含的頁(yè)面不太改變的時(shí)候,我推薦使用第一種include指令方式,這種方式比較快,性能較好;當(dāng)被包含的文件經(jīng)常改變(其中也有動(dòng)態(tài)內(nèi)容)時(shí),并且在執(zhí)行主頁(yè)的時(shí)候不能確定所要引入的的頁(yè)面的時(shí)候,使用第二種include行為方式。
另一種include機(jī)制是使用JSP標(biāo)準(zhǔn)標(biāo)記庫(kù)(JSTL)中的<c:import> 行為標(biāo)記??梢允褂眠@種方式來(lái)包含本地的或者遠(yuǎn)程的文件,下面是一些例子:
- <c:import url="./copyright.html"/><c:import url=
"http://www.somewhere.com/hello.xml"/>
不要將業(yè)務(wù)邏輯和表示混合起來(lái):在更為復(fù)雜的應(yīng)用中,并且更多的代碼被引入時(shí),很重要的一點(diǎn)是不要將業(yè)務(wù)邏輯與表示混在同一個(gè)文件中。分開(kāi)業(yè)務(wù)邏輯與表示使得當(dāng)其中的任何一方需要改動(dòng)是不至于影響到另外一方。JSP僅僅被作為前臺(tái)的表示。那么,該如何實(shí)現(xiàn)業(yè)務(wù)邏輯部分呢?這就是JavaBeans的用武之地了。JavaBeans技術(shù)是輕便的、平臺(tái)無(wú)關(guān)的組建模型,它使開(kāi)發(fā)人員編寫(xiě)組件并且可以處處運(yùn)行。在JSP環(huán)境中,JavaBeans組件處理業(yè)務(wù)邏輯并返回?cái)?shù)據(jù)給JSP頁(yè)面,這反過(guò)來(lái)格式化從JavaBeans組件返回的數(shù)據(jù),以便在瀏覽器中顯示。JSP頁(yè)面通過(guò)調(diào)用JavaBeans組件的get方法和set方法來(lái)操作Bean 的各項(xiàng)屬性。使用JavaBeans技術(shù)的好處如下:
可重用:不同的應(yīng)用可以使用同一個(gè)組件。
分離業(yè)務(wù)邏輯與表示:可以在JSP頁(yè)面上改變數(shù)據(jù)的顯示外觀而不影響業(yè)務(wù)邏輯。換而言之,網(wǎng)頁(yè)設(shè)計(jì)師只需要關(guān)注設(shè)計(jì),Java開(kāi)發(fā)人員只需要關(guān)注業(yè)務(wù)邏輯。
保持源代碼的安全性,保護(hù)自己的知識(shí)產(chǎn)權(quán)。
如果在你的應(yīng)用程序中使用了Enterprise JavaBeans (EJBs)組件,必須將業(yè)務(wù)邏輯保留在EJB組件中,提供生命周期管理,事務(wù)支持與對(duì)多客戶端對(duì)域?qū)ο螅▽?shí)體Beans)的存取??梢栽?Enterprise BluePrints 獲得更為詳細(xì)的資料。
使用自定義標(biāo)記:并不是所有HTML內(nèi)容開(kāi)發(fā)者都喜歡將Java代碼(或scriptlets)嵌入在HTML文檔中的,可能是因?yàn)樗麄儾涣私釰ava語(yǔ)言并且也不樂(lè)意學(xué)習(xí)它的語(yǔ)法。但是不能使用JavaBeans組件封裝很多Java代碼,在JSP頁(yè)面中使用它們?nèi)匀灰髢?nèi)容開(kāi)發(fā)者具有Java語(yǔ)法的知識(shí)。
JSP技術(shù)允許你通過(guò)標(biāo)記庫(kù)設(shè)備引入新的自定義標(biāo)記。作為一個(gè)Java開(kāi)發(fā)者,你可以通過(guò)引入能夠部署并在HTML這類(lèi)語(yǔ)法中使用的自定義標(biāo)記擴(kuò)展 JSP頁(yè)面。自定義標(biāo)記通過(guò)進(jìn)一步分隔業(yè)務(wù)邏輯和表示邏輯也允許你提供更好的封裝。另外,它們提供了自定義表示的方法,而使用JSTL卻很難做到這一點(diǎn)。
自定義標(biāo)記的好處:
他們能夠消除JSP應(yīng)用程序中的scriptlets。標(biāo)記必需的參數(shù)可以作為屬性或內(nèi)容體傳遞,因此,不需要Java代碼初始化或設(shè)置組件屬性。它們的語(yǔ)法非常類(lèi)似。Scriptlets是使用Java代碼編寫(xiě)的,但是可以在類(lèi)似于HTML語(yǔ)法中使用自定義標(biāo)記。它們能夠提高非程序員內(nèi)容開(kāi)發(fā)者的生產(chǎn)率,允許它們執(zhí)行HTML不行完成的任務(wù)。它們是可重用的。節(jié)省了開(kāi)發(fā)和測(cè)試的時(shí)間。Scriptlets不是可重用的,除非你通過(guò)剪切粘貼 來(lái)“重用”。簡(jiǎn)而言之,你可以使用和使用HTML創(chuàng)建表達(dá)式一樣的方法來(lái)通過(guò)自定義標(biāo)記完成復(fù)雜的任務(wù)。編寫(xiě)自定義標(biāo)記庫(kù)的時(shí)候,可以使用下列編程指南:保持簡(jiǎn)單性:如果需要在一個(gè)標(biāo)記中包含多個(gè)屬性,那么最好將它分為多個(gè)標(biāo)記。使它具有可用性:咨詢標(biāo)記的使用者(HTML開(kāi)發(fā)者)從而獲得高可用性。不要在JSP頁(yè)面中發(fā)明一種編程語(yǔ)言:不要開(kāi)發(fā)自定義標(biāo)記讓用戶編寫(xiě)顯式的程序。盡量不要重新發(fā)明輪子:目前有多個(gè)JSP標(biāo)記庫(kù)可用,如Jakarta Taglibs Project。查看這些標(biāo)記庫(kù),看看是否有你所想要的東西。
不要重新發(fā)明輪子:雖然自定義標(biāo)記提供了重用寶貴的組件的方法,但是仍然要?jiǎng)?chuàng)建、測(cè)試和調(diào)試它們。另外,開(kāi)發(fā)者仍然要不斷地重新發(fā)明輪子,該解決方案的效率不是最高的。問(wèn)題就是通過(guò)提供一組顆重用的標(biāo)準(zhǔn)標(biāo)記解決JavaServer Pages Standard Tag Library (JSTL) 。JSTL定義了一組在任何地方都一樣工作的標(biāo)準(zhǔn)標(biāo)記庫(kù),這樣你就不再需要使用scriptlet(或各類(lèi)供應(yīng)商提供的迭代標(biāo)記)在集合中進(jìn)行迭代。 JSTL 包括各類(lèi)標(biāo)記,循環(huán)、不使用Java語(yǔ)法就讀取屬性、迭代各類(lèi)數(shù)據(jù)結(jié)構(gòu)、有條件地計(jì)算表達(dá)式、通過(guò)一種精確的方式設(shè)置屬性和腳本變量并分析XML文檔。
使用JSTL表達(dá)式語(yǔ)言: 使用JSP范圍屬性和請(qǐng)求參數(shù)將信息傳遞給JSP頁(yè)面。表達(dá)式語(yǔ)言 (EL)是為頁(yè)面作者特別設(shè)計(jì)的語(yǔ)言,將JSP范圍屬性提升為業(yè)務(wù)邏輯到JSP頁(yè)面通訊的標(biāo)準(zhǔn)方法。然而Servlet和JSP,注意,然而EL是JSP技術(shù)的一個(gè)關(guān)鍵方面.
聯(lián)系客服