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