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

          Simple is beautiful.

          導(dǎo)航

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

          統(tǒng)計(jì)

          公告

          ...

          常用鏈接

          留言簿(1)

          隨筆分類(2)

          隨筆檔案(56)

          Weblog

          搜索

          最新評(píng)論

          評(píng)論排行榜

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

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

          屬性 用途
          id 給將要應(yīng)用bean的變量一個(gè)名字,如果發(fā)現(xiàn)有相同id和scope的bean對(duì)象,則應(yīng)用此對(duì)象而不會(huì)產(chǎn)生一個(gè)新的例示。
          class 指明了bean的整個(gè)包名。
          scope 表 明了此bean的作用范圍,共有四個(gè)值:page, request, session, 和 application,缺省的是page屬性,表明此bean只能應(yīng)用于當(dāng)前頁(yè)(保存在當(dāng)前頁(yè)的PageContext 中);request屬性表明此bean只能應(yīng)用于當(dāng)前的用戶請(qǐng)求中(保存在ServletRequest對(duì)象中);session屬性表明此bean能 應(yīng)用于當(dāng)前HttpSession生命周期內(nèi)的所有頁(yè)面;application屬性值則表明此bean能應(yīng)用于共享ServletContext的所有 頁(yè)面。需要注意的是,當(dāng)沒(méi)有具有相同的id和scope對(duì)象時(shí),一個(gè)jsp:useBean 實(shí)體只能作用于一個(gè)新的例示中,反之,則作用于以前的對(duì)象,這時(shí),在jsp:useBean標(biāo)簽之間的任何jsp:setParameter和其它實(shí)體都 將被忽略。
          type 說(shuō)明將要索引對(duì)象的變量類型,它必須與類名及父類名相匹配。記住,這個(gè)變量的名字是由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è)置屬性存取方法,這個(gè)方法由容器自動(dòng)調(diào)用。setId()和getId()由系統(tǒng)自動(dòng)實(shí)現(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();//無(wú)參構(gòu)造方法

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

                               }

                               catch(Exception e){

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

                               }

                        }

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

                     return EVAL_BODY_INCLUDE; //返回類型

                 }

          }

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

          一種是聲明variable,一種是通過(guò)TagExtraInfo類聲明變量。前者是JDK1.2后的方法,優(yōu)點(diǎn)是比較方便。后者因?yàn)橐賹懸粋€(gè)類文件,所以顯得麻煩些,但更靈活,出于兼容性與功能上的考慮,建議還是采用后者。(關(guān)于此類的詳細(xì)說(shuō)明,請(qǐng)參考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)在,定義一個(gè)useBean標(biāo)簽的工作已進(jìn)行大半,下面該定義標(biāo)簽庫(kù)描述(TLD)文件了,該文件是一個(gè)XML文檔,主要定義標(biāo)簽的屬性、處理類和擴(kuò)展信息類的聲明。主要聲明部分如下:(tag.tld)

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

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

           <tag>

          <name>useBEAN</name>

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

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

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

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

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

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

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

             <attribute>

                  <name>scope</name>

          <!—是否必選-->

                  <required>true</required>

          <!—是否可以使用JSP表達(dá)式-->

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

          其實(shí)這個(gè)標(biāo)簽庫(kù)描述文件應(yīng)該是最先建立的,因?yàn)槲覀冎饕菫榱苏f(shuō)明實(shí)現(xiàn)的方法,所以標(biāo)簽描述放在后邊了。接下就是將剛才做的這些東西部署到我們的應(yīng)用中去。在目標(biāo)JSP頁(yè)面中引用一下就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 閱讀(597) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阿巴嘎旗| 临潭县| 上高县| 望奎县| 来凤县| 雅安市| 炎陵县| 罗源县| 读书| 大城县| 东丽区| 新化县| 辽源市| 越西县| 辽阳县| 玉林市| 手机| 招远市| 卓尼县| 隆化县| 常德市| 二手房| 铜鼓县| 永福县| 湟源县| 泾源县| 拜城县| 庄浪县| 定边县| 贺兰县| 贵阳市| 西昌市| 剑川县| 会同县| 云安县| 宜都市| 泰宁县| 牙克石市| 肇州县| 白朗县| 长沙市|