鐵手劍譜

          上善若水

          公告

          天下皆知美之為美,斯惡已;皆知善之為善,斯不善已。 故有無(wú)相生,難易相成,長(zhǎng)短相形,高下相傾,音聲相和,前后相隨,恒也。
          <2005年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統(tǒng)計(jì)

          • 隨筆 - 127
          • 文章 - 1
          • 評(píng)論 - 952
          • 引用 - 26

          常用鏈接

          留言簿(49)

          隨筆分類(201)

          隨筆檔案(127)

          文章分類(1)

          文章檔案(1)

          DotNET

          Java站點(diǎn)

          我的其他空間

          朋友

          著名牛人

          搜索

          •  

          積分與排名

          • 積分 - 400830
          • 排名 - 140

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Struts秘籍之第1段:第2.3式:在JSP中使用常數(shù)

          第2.3式. 在JSP中使用常數(shù)

          問題

          不通過scriptlets, 你想要在JSP中使用Java類中定義的應(yīng)用常數(shù)public static字段。

          動(dòng)作要領(lǐng)

          使用Jakarta Taglibs的unstandard標(biāo)簽庫(kù)提供的bind標(biāo)簽來(lái)創(chuàng)建包含常數(shù)字段的JSTL變量:

          <%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
          <un:bind var="constantValue"
                  type
          ="com.foo.MyClass"
                 field
          ="SOME_CONSTANT"/>
          <bean:write name="constantValue"/>


          <%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %><un:bind var="constantValue"type="com.foo.MyClass"field="SOME_CONSTANT"/><bean:write name="constantValue"/>

           

          動(dòng)作變化

          大多數(shù)團(tuán)隊(duì)都費(fèi)力地通過使用publicstatic字段(常數(shù))來(lái)避免在Java類中使用硬編碼的字符串。不幸的是,不過是 Struts 還是 JSP都沒有提供相應(yīng)的手段來(lái)在JSP中不借助scriptlet 而使用這些常數(shù),如:

          <%= com.foo.MyClass.SOME_CONSTANT %>


          但是有許多開發(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)顯示這些值:

          Example 2-5. 使用bind 標(biāo)簽來(lái)訪問Struts全局常數(shù)

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
          <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
          <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
          <html>
          <head>
            
          <title>Struts Cookbook - Chapter 4 : Using Bind</title>
          </head>
          <body>
            
          <un:bind var="servletKey"
                    type
          ="org.apache.struts.Globals"
                   field
          ="SERVLET_KEY"/>
            
          <p>
            Field name: SERVLET_KEY
          <br />
            Field value: 
          <bean:write name="servletKey"/>< br />
            Attribute Value: 
          <c:out value="${applicationScope[servletKey]}"/>< br />
            
          </p>
          </body>
          </html>

          此頁(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-6. 包含Struts全局常數(shù)的JavaBean

           

          package com.oreilly.strutsckbk.ch04;

          import java.util.HashMap;
          import java.util.Map;

          import org.apache.struts.Globals;

          public class Constants {
              
          private Map strutsGlobals;
              
              
          public Constants( ) {
                  strutsGlobals 
          = new HashMap( );
                  strutsGlobals.put( 
          "ACTION_SERVLET_KEY"
                                     Globals.ACTION_SERVLET_KEY );
                  strutsGlobals.put( 
          "SERVLET_KEY", Globals.SERVLET_KEY );
              }

              
              
          public Map getStrutsGlobals( ) {
                  
          return strutsGlobals;
              }

              
          public void setStrutsGlobals(Map strutsGlobals) {
                  
          this.strutsGlobals = strutsGlobals;
              }

          }

           

          Example 2-7. 將常數(shù)載入到servlet context中的插件

           

          package com.oreilly.strutsckbk.ch04;

          import javax.servlet.ServletException;

          import org.apache.struts.action.ActionServlet;
          import org.apache.struts.action.PlugIn;
          import org.apache.struts.config.ModuleConfig;

          public class ConstantsPlugin implements PlugIn {
              
          public void destroy( ) {
              }

              
          public void init(ActionServlet servlet, ModuleConfig module)
                      throws ServletException 
          {
                  Constants constants 
          = new Constants( );
                  servlet.getServletContext( ).setAttribute(
          "Constants", constants);
              }

          }

          Example 2-8 (globals_test.jsp) 則展示了一個(gè)訪問和顯示ConstantsPlugin載入的常數(shù)的JSP頁(yè)面。第一個(gè)常數(shù)使用Struts bean:write標(biāo)簽,第二個(gè)則使用JSTL c:out標(biāo)簽。

          Example 2-8. 使用Struts 和JSTL訪問常數(shù)

           

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
          <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
          <html>
          <head>
            
          <title>Struts Cookbook - Chapter 4 : Accessing Constants</title>
          </head>
          <body>
            
          <p>
            Field name: ACTION_SERVLET_KEY
          <br />
            Field value: 
          <bean:write name="Constants" 
                                 property
          ="strutsGlobals(ACTION_SERVLET_KEY)"/><br />
            
          </p>
            
          <p>
            Field name: SERVLET_KEY
          <br />
            Field value: 
          <c:out value="${Constants.strutsGlobals.SERVLET_KEY}"/><br />
            
          </p>
          </body>
          </html>

          這種方式的最大缺點(diǎn)是你必須手動(dòng)創(chuàng)建持有常數(shù)值的map。如果類中添加了新的常數(shù),你必須修改Constants類的源代碼以便能夠獲取它。

          相關(guān)招式

          關(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系列

          評(píng)論

          # Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

          本系列源改編自O(shè)'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
          主站蜘蛛池模板: 平阴县| 滦南县| 宣恩县| 古浪县| 四子王旗| 灌南县| 南和县| 常德市| 华坪县| 台南市| 枣强县| 秦皇岛市| 云霄县| 兴安盟| 长岭县| 化隆| 滦平县| 鄂温| 遵化市| 山阳县| 柳江县| 聊城市| 电白县| 罗田县| 南陵县| 华池县| 江城| 莱阳市| 泸水县| 柳河县| 夏河县| 乾安县| 荣成市| 玛纳斯县| 南平市| 华容县| 来凤县| 宁明县| 鹤庆县| 渝北区| 黔南|