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

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

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

    posts - 14,  comments - 37,  trackbacks - 0
    http://www.ibm.com/developerworks/cn/java/j-jsp07233/index.html ibm的一篇文章, 不過太基礎(chǔ)了
    下面抄的一篇網(wǎng)上廣泛流傳的文章:[文章中的tag例子有錯誤, 請使用eclipse之類的工具自己修改]

    摘要
       在JSP中有一種機(jī)制,可以讓你在JSP頁面中插入與HTML類似的標(biāo)記。本文介紹JSP定制標(biāo)記的基本概念和構(gòu)成,以及如何開發(fā)和應(yīng)用JSP定制標(biāo)記。

     關(guān)鍵字
    JSP,XML,TLD,標(biāo)記符

    什么是標(biāo)記
    使用HTML語言我們可以這樣去編輯我們的網(wǎng)頁:

       <HTML>

        <HEAD>

    <TITLE>

     HELLO  WORLD

    </TITLE>

            </HEAD>

            <BODY>

    HELLO WORLD

    </BODY>

    </HTML>

    在這里我們把</HEAD>,<TITLE>,<BODY>稱為標(biāo)記。HTML 標(biāo)記( HTML Markup)是HTML文檔的控制語言,用于指定瀏覽器顯示和打印文檔的方式.它是用小于號"<"和大于號">"括起來的短語和符號,如 <Html>、</Body>等。許多HTMl標(biāo)記以成對的方式出現(xiàn),如<TITLE>< /TITLE>、<Body></Body> 等。在JSP中我們也可以定制自己的標(biāo)記,以供JSP頁面使用,如下例所示

    <!—login.jsp-->

    <%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

    <html>

          <head>

               <title>login</title>

          </head>

          <body>

            <tagclass:login width="200" height= "100" >

               </tagclass:login>

          </body>

    </html>

    在上例中</tagclass:login>就是一個JSP定制標(biāo)記符。widtht、height是這個標(biāo)記的屬性。<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>是一個標(biāo)記庫定義指令,在稍后我們將會討論。在JSP中定制標(biāo)記符,實(shí)質(zhì)上就是以標(biāo)記的形式封裝了一個俱有獨(dú)立功能的Java類。標(biāo)記的使用減 少了直接嵌入JSP頁面的Java代碼,方便了頁面的布局,并且有利于代碼的復(fù)用,提高了開發(fā)的效率。

    JSP服務(wù)器解析標(biāo)記的過程
    那么當(dāng)一個標(biāo)記被嵌入JSP頁面后,JSP服務(wù)器是如何對這個標(biāo)記進(jìn)行解析的呢?各對象的含義如下所示:

    Client:   表示客戶端。

    JSP-Server:JSP服務(wù)器。

    JSP-Page:JSP頁面。

    TLD:   標(biāo)記庫描述文件,定義標(biāo)記和標(biāo)記的各種屬性和處理文件等。

    TagClass   標(biāo)記處理程序

    當(dāng)一個用戶訪問一個JSP頁面時,這個請求被發(fā)送到JSP服務(wù)器,JSP服務(wù)器會根據(jù)這個請求去調(diào)用相應(yīng)的頁面,如果這個頁面中有自定義的標(biāo)記, JSP服務(wù)就會根據(jù)頁面指令<%@ taglib>去訪問TLD得到處理程序的相關(guān)信息,接著調(diào)用該處理程序的構(gòu)造器方法,啟動標(biāo)記符處理程序,并讀取標(biāo)記符的屬性和相應(yīng)值。對每個沒 有設(shè)置屬性的,調(diào)用相應(yīng)的set方法。當(dāng)標(biāo)記符第一次使用時,它的任何屬性都不會做過設(shè)置,因此對每個屬性都調(diào)用set方法。屬性設(shè)置完以后,JSP服務(wù) 器調(diào)用處理程序的doStartTag(),然后再調(diào)用doEndTag()方法。最后JSP服務(wù)器會繼續(xù)處理剩下的頁面,在頁面結(jié)尾調(diào)用release ()方法,清理占用的所有資源。

    TLD文件
    TLD(TLD:Tag Library Descriptor標(biāo)記庫描述符)文件,標(biāo)準(zhǔn)的XML格式的標(biāo)記定義文件,被用來存放標(biāo)記符的信息,下面就是一個典型的TLD文件。

    <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!—XML的版本及其字符集-->

    <!DOCTYPE taglib

          PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

         "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

    <!—文檔類型定義-->

    <taglib>

    <!—此標(biāo)記說明我們開始描述一個標(biāo)記庫-->

      <tlibversion>1.0</tlibversion>

     <!—標(biāo)記庫的版本-->

      <jspversion>1.1</jspversion>

     <!—所使用的JSP的版本-->

     <shortname>tagclass</shortname>

     <!—缺省的名稱-->

      <tag>

         <name>login</name>

        <!—標(biāo)記的名稱-->

    <tagclass>

    tagclass.login.login

    <!—處理這個Tag的相應(yīng)的類的名稱-->

    </tagclass>

         <info>

          <!—對本標(biāo)記符的描述-->

         </info>

    <attribute>

    <!—開始定義標(biāo)記的屬性-->

              <name>height</name>

           <!—屬性的名稱-->

              <required>true</required>

           <!—表示這個屬性是不是必須的-->

              <rtexprvalue>true</rtexprvalue>

    <!—表示這個屬性是否可以用JSP的程序段的結(jié)果輸出-->

          </attribute>

    <attribute>

              <name>width</name>

              <required>true</required>

              <rtexprvalue>true</rtexprvalue>

          </attribute>

        </tag>

    </taglib>


    在這個TLD文件中定義了只有一個標(biāo)記符的標(biāo)記符庫,這個名為login的標(biāo)記符會調(diào)用一個Applet以驗(yàn)證用戶的合法性。處理這個標(biāo)記的類就是 tagclass.login.login。width、height是這個標(biāo)記的兩個屬性。屬性是在使用標(biāo)記符時作為參數(shù)發(fā)送的值。我們可以在上面的示 例中增加幾個標(biāo)記,也可以為每個標(biāo)記添加幾個屬性。我們開發(fā)標(biāo)記符庫時不一定非要從頭開始,自己編寫一個全新TLD。我們可以使用某個集成的開發(fā)的環(huán)境, 也可以修改上面的例子。

    TagLib指令
    那么當(dāng)JSP服務(wù)器在解析一個標(biāo)記符時,它是如何定義一個標(biāo)記庫的呢?這就是TagLib指令的主要責(zé)任。

    Taglib 指令

    定義一個標(biāo)記庫以及其自定義標(biāo)記的前綴.

    JSP 語法

    <%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>

    例子
    <%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

    <html>

          <head>

               <title>login</title>

          </head>

          <body>

            <tagclass:login width="200" height= "100" >

               </tagclass:login>

          </body>

    </html>

    描述

    <% @ taglib %>指令聲明此JSP文件使用了自定義的標(biāo)記,同時引用標(biāo)記庫,

    也指定了他們的標(biāo)記的前綴。 你必須在使用自定義標(biāo)記之前使用<% @ taglib %>指令。

    屬性

    uri="URIToTagLibrary" :Uniform Resource Identifier (URI)根據(jù)標(biāo)記的前綴對自定義的標(biāo)記進(jìn)行唯一的命名,URI可以是一個相對或絕對的路徑。
      prefix="tagPrefix":在自定義標(biāo)記之前的前綴。如上例中的</tagclass:login>

    標(biāo)記符的處理程序(Tag handle)
    我們還是以一個例子來看下如何實(shí)現(xiàn)一個Tag handle。首先是看一下它的類圖:

    讓我們再看一下它的代碼:

    package  tagclass.login;

    import javax.servlet.jsp.tagext.TagSupport;

    import javax.servlet.jsp.*;

    import java.io.*;

    public class login extends TagSupport

    {

          public login()

         {

                 super();

          }

          public int doStartTag() throws JspTagException

         {

                    JspWriter out = pageContext.getOut();

                    try

                    {

                            out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");

    }

                    catch(Exception e)

                    {

     

                    }

                 return SKIP_BODY;

    }

    publicc int doEndTag()throws JsptagException

    {

         return EVAL_PAGE;

    }

           public void release()

           {

                     super.release();

           }

          public void setWidth(String language)

          {

                 this.width = width;

          }

          public String getWidth()

          {

                 return this.width;

          }

          public void setHeight(String height)

          {

              this.height=height;

          }

    public String getHeight()

          {

              return this.height;

          }

          private String width;

          private String height;

     }

    從以上我們可以看出,實(shí)現(xiàn)一個簡單的標(biāo)記符處理程序有幾個要求:①增加一個類,使之繼承 java.Servlet.jsp.tagext.TagSupport類。這個類提供了java.Servlet.jsp.tagext.Tag接口所 要求的所有的方法。另外,還需要使用一些基本的API,使JSP容器能夠調(diào)用我們自己提供的標(biāo)記符處理程序。②必須為每個標(biāo)記符屬性分別創(chuàng)建一個 get<attribute>和set<attribute>方法,JSP容器需要使用這些方法處理程序傳遞參數(shù)。③要為標(biāo)記符 處理程序創(chuàng)建一個構(gòu)造器和自毀器。JSP需要使用構(gòu)造器啟動處理程序。自毀器是在realease()方法中定義的。在處理程序的生命周期結(jié)束時,需要調(diào) 用自毀器釋放所占用的資源。④創(chuàng)建兩個名為doStartTag()和doEndTag()的方法,執(zhí)行具體的處理和輸出動作。這兩個方法是在處理自定義 標(biāo)記符的起始位置和結(jié)束位置調(diào)用的。它們的返回值是在Tag Interface里定義的靜態(tài)int,這幾個靜態(tài)值分別是:

    SKIP_BODY隱含0  :跳過了開始和結(jié)束標(biāo)簽之間的代碼。

    EVAL_BODY_INCLUDE隱含1:將body的內(nèi)容輸出到存在的輸出流中

    SKIP_PAGE隱含5 : 忽略剩下的頁面。

    EVAL_PAGE隱含6:繼續(xù)執(zhí)行下面的頁

      當(dāng)然標(biāo)記符也有它自己的缺點(diǎn)。很不方便的封裝過程,有限的功能。對于一些不太復(fù)雜和功能單一的邏輯描述,需要傳遞的參數(shù)要求不高時,使用JSP標(biāo)記,要方便的多。對于大多數(shù)的商業(yè)邏輯應(yīng)用,還是使用bean要好的多,也宜于servlet控制。

    附錄:文章中所用示例的完整代碼
    JSP代碼:login.jsp
    <%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

    <html>

         <head>

               <title></title>

         </head>

         <body>

               <tagclass:login width="200" height= "100" >

               </tagclass:login>

         </body>

    </html>

    標(biāo)記符描述庫:taglib.tld
    <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!DOCTYPE taglib

          PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

         "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

    <taglib>

      <tlibversion>1.0</tlibversion>

      <jspversion>1.1</jspversion>

     <shortname>tagclass</shortname>

      <tag>

         <name>login</name>

    <tagclass>

    tagclass.login.login

    </tagclass>

         <info>

        </info>

    <attribute>

              <name>height</name>

              <required>true</required>

              <rtexprvalue>true</rtexprvalue>

          </attribute>

    <attribute>

              <name>width</name>

              <required>true</required>

              <rtexprvalue>true</rtexprvalue>

          </attribute>

        </tag>

    </taglib>

    標(biāo)記符處理程序:login.java
    package  tagclass.login;

    import javax.servlet.jsp.tagext.TagSupport;

    import javax.servlet.jsp.*;

    import java.io.*;

    public class login extends TagSupport

    {

          public login()

         {

                 super();

          }

          public int doStartTag() throws JspTagException

         {

                    JspWriter out = pageContext.getOut();

                    try

                    {

                            out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");

    }

                    catch(Exception e)

                    {

     

                    }

                 return SKIP_BODY;

    }

    publicc int doEndTag()throws JsptagException

    {

         return EVAL_PAGE;

    }

           public void release()

           {

                     super.release();

           }

          public void setWidth(String language)

          {

                 this.width = width;

          }

          public String getWidth()

          {

                 return this.width;

          }

          public void setHeight(String height)

          {

              this.height=height;

          }

          public String getHeight()

          {

              return this.height;

          }

    private String width;

          private String height;

     }

    標(biāo)記符處理程序中所使用的Applet : login.java
    import java.awt.*;

    import java.awt.event.*;

    import java.applet.*;

    public class login extends Applet implements ActionListener

    {

        private String s_username;

        private String s_userpassword;

        private Button b_ok;

        private Button b_register;

        private Label l_username;

        private Label l_userpassword;

        private TextField t_username;

        private TextField t_userpassword;

        private GridLayout g_gridlayout;

        public void init()

        {

           b_ok=new Button("ok");

           b_register=new Button("register");

           l_username= new Label("name");

           l_userpassword=new Label("password");

           t_username=new TextField();

           t_userpassword=new TextField();

           b_ok.addActionListener(this);

           b_register.addActionListener(this);

           g_gridlayout=new GridLayout(3,2,10,10);

           this.setLayout(g_gridlayout);

                    //this.setBackground(Color.blue);

                    add(l_username);

                    add(t_username);

           add(l_userpassword);

           add(t_userpassword);

           add(b_ok);

           add(b_register);

        }

        public void actionPerformed(ActionEvent ev)

        {

               String s_label=ev.getActionCommand();

               if (s_label.equals("ok"))

               {

                     t_username.setText("name");

               }

               if (s_label.equals("register"))

               {

                     t_userpassword.setText("password");

               }

        }

        public void paint(Graphics g)

        {

         }

    }


    posted on 2007-07-10 09:33 冰封的愛 閱讀(108) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品亚洲专区无码WEB| 亚洲高清视频免费| 美国毛片亚洲社区在线观看 | 日韩成全视频观看免费观看高清 | 国产精品国产亚洲区艳妇糸列短篇| 我的小后妈韩剧在线看免费高清版| 亚洲国产精品久久久久婷婷老年| 97无码人妻福利免费公开在线视频| 亚洲熟妇无码乱子AV电影| 中文字幕视频在线免费观看| 亚洲AV无码不卡在线播放| 日韩视频免费在线观看| 久久久亚洲裙底偷窥综合| 3344永久在线观看视频免费首页 | 亚洲最大天堂无码精品区| 在线观看免费毛片| 深夜a级毛片免费无码| 亚洲色成人WWW永久网站| 午夜无码A级毛片免费视频| 亚洲第一网站免费视频| 成年女人视频网站免费m| 国产在亚洲线视频观看| 中文字幕亚洲专区| 97久久免费视频| 亚洲一区二区三区写真| 亚洲精品国精品久久99热| 国产婷婷成人久久Av免费高清| 亚洲精品综合一二三区在线| 午夜毛片不卡免费观看视频| 一级看片免费视频| 精品无码一区二区三区亚洲桃色 | 亚洲AV日韩精品久久久久久| 人妻视频一区二区三区免费| 一级a性色生活片久久无少妇一级婬片免费放 | 免费黄色app网站| 一级毛片在线完整免费观看| 亚洲国产精品自在线一区二区| 国产精品成人免费一区二区| 国产高潮流白浆喷水免费A片 | 亚洲校园春色小说| 免费二级毛片免费完整视频|