<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鐵手劍譜

    上善若水
    數據加載中……
    Struts秘籍之第1段:第2.3式:在JSP中使用常數

    第2.3式. 在JSP中使用常數

    問題

    不通過scriptlets, 你想要在JSP中使用Java類中定義的應用常數public static字段。

    動作要領

    使用Jakarta Taglibs的unstandard標簽庫提供的bind標簽來創建包含常數字段的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"/>

     

    動作變化

    大多數團隊都費力地通過使用publicstatic字段(常數)來避免在Java類中使用硬編碼的字符串。不幸的是,不過是 Struts 還是 JSP都沒有提供相應的手段來在JSP中不借助scriptlet 而使用這些常數,如:

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


    但是有許多開發團隊禁止,或者至少不贊成在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標簽來顯示這些值:

    Example 2-5. 使用bind 標簽來訪問Struts全局常數

     

    <%@ 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>

    此頁面使用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-6. 包含Struts全局常數的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. 將常數載入到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) 則展示了一個訪問和顯示ConstantsPlugin載入的常數的JSP頁面。第一個常數使用Struts bean:write標簽,第二個則使用JSTL c:out標簽。

    Example 2-8. 使用Struts 和JSTL訪問常數

     

    <%@ 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>

    這種方式的最大缺點是你必須手動創建持有常數值的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)  編輯  收藏 所屬分類: JavaStruts系列

    評論

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

    本系列源改編自O'Reily的Strus Cookbook
    [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
      回復  更多評論    
    主站蜘蛛池模板: 久久久久久国产精品免费免费| 亚洲五月午夜免费在线视频| 1000部免费啪啪十八未年禁止观看 | 免费人成激情视频在线观看冫| 亚洲一级黄色视频| 日韩在线一区二区三区免费视频 | 亚洲成av人片在线观看天堂无码| 亚洲AV无码一区二区乱子仑| 日本免费人成黄页网观看视频| 亚洲一线产品二线产品| 在线a人片天堂免费观看高清| 亚洲中文字幕久久久一区| 日本不卡视频免费| 日韩色视频一区二区三区亚洲 | 亚洲狠狠久久综合一区77777| 免费人成黄页在线观看日本| 久久亚洲日韩精品一区二区三区 | 国产精品成人无码免费| 狠狠综合亚洲综合亚洲色| 免费在线观看毛片| 久久久WWW成人免费精品| 亚洲av午夜福利精品一区 | 久久免费精品一区二区| 亚洲经典在线中文字幕| 四虎永久在线观看免费网站网址 | 亚洲jjzzjjzz在线观看| 国产高清免费的视频| a一级爱做片免费| 亚洲视频一区二区三区| 毛片a级毛片免费观看品善网| 香蕉97碰碰视频免费| 久久精品国产精品亚洲色婷婷| 18观看免费永久视频| 国产亚洲女在线线精品| 亚洲国产美女精品久久久久∴| 精品女同一区二区三区免费站| 亚洲国产成人精品无码区花野真一| 亚洲午夜精品一级在线播放放| 4444www免费看| 美女被暴羞羞免费视频| 亚洲一区免费观看|