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

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

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

    學(xué)習(xí)筆記

    Simple is beautiful.

    導(dǎo)航

    <2007年10月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    統(tǒng)計

    公告

    ...

    常用鏈接

    留言簿(1)

    隨筆分類(2)

    隨筆檔案(56)

    Weblog

    搜索

    最新評論

    評論排行榜

    [Z]JSP標(biāo)簽自定義 --- useBean

    今天要實現(xiàn)的功能是useBean標(biāo)簽。下表是它的一些屬性和用途。(我只選了個比較重要的屬性,并沒有實現(xiàn)所有屬性)

    屬性 用途
    id 給將要應(yīng)用bean的變量一個名字,如果發(fā)現(xiàn)有相同id和scope的bean對象,則應(yīng)用此對象而不會產(chǎn)生一個新的例示。
    class 指明了bean的整個包名。
    scope 表 明了此bean的作用范圍,共有四個值:page, request, session, 和 application,缺省的是page屬性,表明此bean只能應(yīng)用于當(dāng)前頁(保存在當(dāng)前頁的PageContext 中);request屬性表明此bean只能應(yīng)用于當(dāng)前的用戶請求中(保存在ServletRequest對象中);session屬性表明此bean能 應(yīng)用于當(dāng)前HttpSession生命周期內(nèi)的所有頁面;application屬性值則表明此bean能應(yīng)用于共享ServletContext的所有 頁面。需要注意的是,當(dāng)沒有具有相同的id和scope對象時,一個jsp:useBean 實體只能作用于一個新的例示中,反之,則作用于以前的對象,這時,在jsp:useBean標(biāo)簽之間的任何jsp:setParameter和其它實體都 將被忽略。
    type 說明將要索引對象的變量類型,它必須與類名及父類名相匹配。記住,這個變量的名字是由id屬性值代替的。
    beanName 給定此bean的名字,可以將其提供給bean的例示方法,只提供beanName和type而忽略class屬性的情況是允許的。

     下面是標(biāo)簽處理方法類:UseBean.java:

    import javax.servlet.jsp.*;

    import javax.servlet.jsp.tagext.*;

    import java.lang.reflect.*;

    //

    public class UseBean extends TagSupport{  //繼承自TagSupport類

           private String scope;

           private String type;

           public UseBean(){super();}

           /**

            *設(shè)置屬性存取方法,這個方法由容器自動調(diào)用。setId()和getId()由系統(tǒng)自動實現(xiàn)

            */

           public void setScope(String s) {

               this.scope = s;

          }    

           public String getScope(){return this.scope;}

           public void setType(String type){

                  this.type=type;

           }

           public String getType(){return this.type;}

           /**

            *覆蓋doStartTag方法

            */

            public int doStartTag() throws JspTagException 

            {  

                Object o = null;

               // find the bean in the specified scope

               if (scope.equals("page")) {

                         o = pageContext.getAttribute(getId(),PageContext.PAGE_SCOPE);

                  } else if (scope.equals("request")) {

                         o = pageContext.getAttribute(getId(), PageContext.REQUEST_SCOPE);

                  } else if (scope.equals("session")) {

                         o = pageContext.getAttribute(getId(), PageContext.SESSION_SCOPE);

                  } else if (scope.equals("application")) {

                         o = pageContext.getAttribute(getId(), PageContext.APPLICATION_SCOPE);

               }

                  if(o==null)

                  {

                         System.out.println("o is null!");

                         try{

                                Class u=Class.forName(type);

                                o=u.newInstance();//無參構(gòu)造方法

                                System.out.println("create success!");

                         }

                         catch(Exception e){

                                throw new JspTagException("error to created a "+getId()+" object!");

                         }

                  }

                  pageContext.setAttribute(getId(), o); //保存實例對象到上下文對象中

               return EVAL_BODY_INCLUDE; //返回類型

           }

    }

    現(xiàn) 在我們已經(jīng)把對象實例放到pageContext里了,是不是這樣就可以在JSP頁面中直接引用了?當(dāng)然不是了,直接將JAVA對象放進 pageContext中與在腳本中直接引用是不同的。差別在于JSP容器要負責(zé)取得這個對象,以腳本變量的形式提供給頁面。即JSP容器負責(zé)來維護腳本 變量與pageContext中相應(yīng)對象的狀態(tài)。有兩種方法可以為自定義標(biāo)簽來聲明腳本變量。

    一種是聲明variable,一種是通過TagExtraInfo類聲明變量。前者是JDK1.2后的方法,優(yōu)點是比較方便。后者因為要再寫一個類文件,所以顯得麻煩些,但更靈活,出于兼容性與功能上的考慮,建議還是采用后者。(關(guān)于此類的詳細說明,請參考PPT文檔)

     import javax.servlet.jsp.*;

    import javax.servlet.jsp.tagext.*;

     public class UseBeanTag extends TagExtraInfo {

        public VariableInfo[] getVariableInfo(TagData data) {

            return new VariableInfo[] {

          new VariableInfo(

                data.getId(),

               data.getAttributeString("type"),

                true,

                VariableInfo.AT_BEGIN)

            };

      }

    }

     

    現(xiàn)在,定義一個useBean標(biāo)簽的工作已進行大半,下面該定義標(biāo)簽庫描述(TLD)文件了,該文件是一個XML文檔,主要定義標(biāo)簽的屬性、處理類和擴展信息類的聲明。主要聲明部分如下:(tag.tld)

    ……………………(省去標(biāo)頭部分)

    <!-- useBEAN 標(biāo)簽-->

     <tag>

    <name>useBEAN</name>

    <!—聲明標(biāo)簽處理類-->

        <tag-class>cn.dever.tag.UseBean</tag-class>

    <!—聲明標(biāo)簽擴展信息類-->

        <tei-class>cn.dever.taginfo.UseBeanTag</tei-class>

        <!—主體內(nèi)容類型-->

        <body-content>jsp</body-content>

    <!—屬性設(shè)置-->

       <attribute>

            <name>scope</name>

    <!—是否必選-->

            <required>true</required>

    <!—是否可以使用JSP表達式-->

            <rtexprvalue>true</rtexprvalue>

          </attribute>

       

          <attribute>

            <name>id</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

          </attribute>

       

          <attribute>

            <name>type</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

          </attribute>

     </tag>

    其實這個標(biāo)簽庫描述文件應(yīng)該是最先建立的,因為我們主要是為了說明實現(xiàn)的方法,所以標(biāo)簽描述放在后邊了。接下就是將剛才做的這些東西部署到我們的應(yīng)用中去。在目標(biāo)JSP頁面中引用一下就OK了。

    <%@ taglib uri="/WEB-INF/tag.tld" prefix="dever" %>

    <dever:useBEAN id="test" type="cn.dever.common.User" scope="page" />


    OK,到此為止

    posted on 2007-10-15 00:57 Ecko 閱讀(596) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 特级毛片全部免费播放| 亚洲精品GV天堂无码男同| 青柠影视在线观看免费高清| 亚洲国产精品专区在线观看 | 亚洲av乱码一区二区三区| 久久免费看黄a级毛片| 亚洲国产精品综合一区在线| 99久久综合精品免费| 亚洲激情校园春色| 99在线视频免费观看视频 | 狼人大香伊蕉国产WWW亚洲| 全部免费a级毛片| 国产福利免费视频| 亚洲AV午夜福利精品一区二区 | 亚洲另类激情专区小说图片| 久久毛片免费看一区二区三区| 亚洲综合国产一区二区三区 | 白白国产永久免费视频| 免费视频成人国产精品网站| 亚洲日本一区二区三区在线| 67194成手机免费观看| 亚洲人成色4444在线观看| 全亚洲最新黄色特级网站 | 日韩亚洲人成在线综合| 中文字幕精品无码亚洲字| 免费一级毛片无毒不卡| 亚洲an日韩专区在线| www.91亚洲| 亚洲免费闲人蜜桃| 香蕉视频免费在线播放| 亚洲电影免费在线观看| 插B内射18免费视频| 两个人看的www高清免费观看| 亚洲精品高清国产麻豆专区| 日本特黄a级高清免费大片| 中文字幕一区二区免费| 亚洲综合激情五月丁香六月| 国产亚洲大尺度无码无码专线 | 亚洲AV色无码乱码在线观看| 亚洲精品午夜国产VA久久成人 | 亚洲一区二区三区国产精品|