不通過scriptlets, 你想要在JSP中使用Java類中定義的應(yīng)用常數(shù)public static字段。
使用Jakarta Taglibs的unstandard標(biāo)簽庫(kù)提供的bind標(biāo)簽來(lái)創(chuàng)建包含常數(shù)字段的JSTL變量:
大多數(shù)團(tuán)隊(duì)都費(fèi)力地通過使用publicstatic字段(常數(shù))來(lái)避免在Java類中使用硬編碼的字符串。不幸的是,不過是 Struts 還是 JSP都沒有提供相應(yīng)的手段來(lái)在JSP中不借助scriptlet 而使用這些常數(shù),如:
但是有許多開發(fā)團(tuán)隊(duì)禁止,或者至少不贊成在JSP中使用scriptlet 。
Scriptlets (<% . . . %>) 和運(yùn)行時(shí)表達(dá)式(<%= . . . %>) 都直接在JSP中置入Java代碼。它們不是與生俱來(lái)的惡人,但是它們因?yàn)槭沟媚愕捻?yè)面中混合HTML,JSP和Java代碼變得紛繁復(fù)雜,從而使開發(fā)效率大大降低。需要找到一種方法來(lái)避免使用scriptlets。你將發(fā)現(xiàn)JSTL的引入就是為了解決這個(gè)可怕的scriptlet的問題。
這種方法通過使用定制JSP標(biāo)簽來(lái)提供一種方式來(lái)解決這個(gè)窘境,即使用un:bind標(biāo)簽。該標(biāo)簽是unstandard標(biāo)簽庫(kù)的一部分,unstandard標(biāo)簽庫(kù)則是Jakarta Taglibs中的一個(gè)組件。unstandard標(biāo)簽庫(kù)包含已經(jīng)用于或者正在考慮用于標(biāo)準(zhǔn)標(biāo)簽庫(kù)的標(biāo)簽。標(biāo)準(zhǔn)標(biāo)簽庫(kù)是JSTL 規(guī)范的Jakarta Taglibs 的實(shí)現(xiàn)。
unstandard標(biāo)簽庫(kù)可以從下面的地方下載:http://cvs.apache.org/builds/jakarta-taglibs-sandbox/nightly/projects/unstandard/. 為了使用這個(gè)庫(kù),你需要將unstandard.jar和unstandard.tld文件拷貝到應(yīng)用的WEB-INF/lib目錄。
un:bind標(biāo)簽提供了一種方法來(lái)創(chuàng)建JSP頁(yè)面上下文變量,它一般引用java類中的一個(gè)字段。字段可以是實(shí)例變量或者靜態(tài)變量。良好設(shè)計(jì)的Java 類一般都不會(huì)將實(shí)例變量暴露為公共字段,而大多數(shù)都將靜態(tài)變量暴露為公共字段。
你可以創(chuàng)建一個(gè)使用Struts提供的靜態(tài)字段的簡(jiǎn)單JSP頁(yè)面來(lái)看看這種方法是否可行。從Struts 1.1開始, Struts 所用的常數(shù)都放在org.apache.struts.Globals類中。這些常數(shù)的值指定了各種存儲(chǔ)在請(qǐng)求、會(huì)話、應(yīng)用上下文中的Struts相關(guān)實(shí)體的關(guān)鍵字值。Example 2-5 中的JSP頁(yè)面使用了un:bind標(biāo)簽來(lái)顯示這些值:
此頁(yè)面使用un:bind來(lái)從Struts Globals類中獲取SERVLET_KEY字段的值。SERVLET_KEY字段的值被用于servlet 上下文屬性關(guān)鍵字,在其下存儲(chǔ)了為Struts controller servlet 定義的映射(如. /action/*或*.do)。
在你需要以一種特殊的方式訪問常數(shù)時(shí),un:bind標(biāo)簽是一個(gè)不錯(cuò)的選擇。但是它還是有些麻煩,因?yàn)槟阈枰紫仁褂胾n:bind標(biāo)簽來(lái)創(chuàng)建變量,然后使用bean:write或者c:out標(biāo)簽來(lái)顯示值。假定JSP顯示Globals類中的所有常數(shù),而這足有17 個(gè)之多。許多應(yīng)用嚴(yán)重依賴于常數(shù)并且可能有很多類,每一個(gè)類都包含很多字段。對(duì)每一個(gè)字段都使用一個(gè)單獨(dú)的標(biāo)簽是多么的麻煩。
你可以使用一種替代方法,雖然需要一些額外的Java 代碼,它可以將常數(shù)綁定到一個(gè)JavaBean 的一個(gè)Map屬性之中。你可以將這個(gè)bean 存儲(chǔ)在servlet 上下文中。然后就可以通過bean:write和c:out標(biāo)簽直接訪問這些值了。Example 2-6中的Constants類定義了一個(gè)包含Struts Globals類中的常數(shù)的map屬性的JavaBean 。Example 2-7 中的ConstantsPlugin則將Constants的一個(gè)實(shí)例載入到servlet context中。
Example 2-8 (globals_test.jsp) 則展示了一個(gè)訪問和顯示ConstantsPlugin載入的常數(shù)的JSP頁(yè)面。第一個(gè)常數(shù)使用Struts bean:write標(biāo)簽,第二個(gè)則使用JSTL c:out標(biāo)簽。
這種方式的最大缺點(diǎn)是你必須手動(dòng)創(chuàng)建持有常數(shù)值的map。如果類中添加了新的常數(shù),你必須修改Constants類的源代碼以便能夠獲取它。
關(guān)于Jakarta Taglibs 項(xiàng)目的詳細(xì)信息可以訪問http://jakarta.apache.org/taglibs.
第5.4式提供了如何從Struts 和JSTL訪問map的方法。
Struts plug-ins 我們?cè)诘?.1式討論過。
Kris Schneider 建立了一個(gè)類似于Example 2-6中的Constants類,使用反射來(lái)訪問特定類的公開靜態(tài)字段。源代碼可以從歸檔的struts-user mailing list 中找到:http://marc.theaimsgroup.com/?l=struts-user&m=108929374300664&w=2.
posted on 2005-05-12 11:01 鐵手 閱讀(2665) 評(píng)論(1) 編輯 收藏 所屬分類: Java 、Struts系列