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

          摘要
             在JSP中有一種機制,可以讓你在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)記符,實質(zhì)上就是以標(biāo)記的形式封裝了一個俱有獨立功能的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以驗證用戶的合法性。處理這個標(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)
          我們還是以一個例子來看下如何實現(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;

           }

          從以上我們可以看出,實現(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)記符也有它自己的缺點。很不方便的封裝過程,有限的功能。對于一些不太復(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 冰封的愛 閱讀(110) 評論(0)  編輯  收藏 所屬分類: J2EE
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乐安县| 阆中市| 新营市| 登封市| 大名县| 仙桃市| 武胜县| 五大连池市| 临夏县| 晋中市| 泰宁县| 会理县| 拉孜县| 兴义市| 中山市| 连平县| 綦江县| 黄石市| 石城县| 磴口县| 涞水县| 昭苏县| 砚山县| 嘉祥县| 绥滨县| 荥经县| 将乐县| 吴忠市| 南城县| 竹北市| 宝丰县| 临沧市| 康保县| 临沂市| 武威市| 黑山县| 获嘉县| 襄城县| 衡阳市| 徐闻县| 湘乡市|