亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP中自定義標記符的使用

2024-09-05 00:20:02
字體:
來源:轉載
供稿:網友

摘要
   在jsp中有一種機制,可以讓你在jsp頁面中插入與html類似的標記。本文介紹jsp定制標記的基本概念和構成,以及如何開發和應用jsp定制標記。

 關鍵字
jsp,xml,tld,標記符

什么是標記
使用html語言我們可以這樣去編輯我們的網頁:

   <html>

    <head>

<title>

 hello  world

</title>

        </head>

        <body>

hello world

</body>

</html>

在這里我們把</head>,<title>,<body>稱為標記。html 標記( html markup)是html文檔的控制語言,用于指定瀏覽器顯示和打印文檔的方式.它是用小于號"<"和大于號">"括起來的短語和符號,如 <html>、</body>等。許多html標記以成對的方式出現,如<title>< /title>、<body></body> 等。在jsp中我們也可以定制自己的標記,以供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定制標記符。widtht、height是這個標記的屬性。<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>是一個標記庫定義指令,在稍后我們將會討論。在jsp中定制標記符,實質上就是以標記的形式封裝了一個俱有獨立功能的java類。標記的使用減少了直接嵌入jsp頁面的java代碼,方便了頁面的布局,并且有利于代碼的復用,提高了開發的效率。

jsp服務器解析標記的過程
那么當一個標記被嵌入jsp頁面后,jsp服務器是如何對這個標記進行解析的呢?各對象的含義如下所示:

client:   表示客戶端。

jsp-server:jsp服務器。

jsp-page:jsp頁面。

tld:   標記庫描述文件,定義標記和標記的各種屬性和處理文件等。

tagclass   標記處理程序

當一個用戶訪問一個jsp頁面時,這個請求被發送到jsp服務器,jsp服務器會根據這個請求去調用相應的頁面,如果這個頁面中有自定義的標記, jsp服務就會根據頁面指令<%@ taglib>去訪問tld得到處理程序的相關信息,接著調用該處理程序的構造器方法,啟動標記符處理程序,并讀取標記符的屬性和相應值。對每個沒有設置屬性的,調用相應的set方法。當標記符第一次使用時,它的任何屬性都不會做過設置,因此對每個屬性都調用set方法。屬性設置完以后,jsp服務器調用處理程序的dostarttag(),然后再調用doendtag()方法。最后jsp服務器會繼續處理剩下的頁面,在頁面結尾調用release ()方法,清理占用的所有資源。

tld文件
tld(tld:tag library descriptor標記庫描述符)文件,標準的xml格式的標記定義文件,被用來存放標記符的信息,下面就是一個典型的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>

<!—此標記說明我們開始描述一個標記庫-->

  <tlibversion>1.0</tlibversion>

 <!—標記庫的版本-->

  <jspversion>1.1</jspversion>

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

 <shortname>tagclass</shortname>

 <!—缺省的名稱-->

  <tag>

     <name>login</name>

    <!—標記的名稱-->

<tagclass>

tagclass.login.login

<!—處理這個tag的相應的類的名稱-->

</tagclass>

     <info>

      <!—對本標記符的描述-->

     </info>

<attribute>

<!—開始定義標記的屬性-->

          <name>height</name>

       <!—屬性的名稱-->

          <required>true</required>

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

          <rtexprvalue>true</rtexprvalue>

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

      </attribute>

<attribute>

          <name>width</name>

          <required>true</required>

          <rtexprvalue>true</rtexprvalue>

      </attribute>

    </tag>

</taglib>

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

taglib指令
那么當jsp服務器在解析一個標記符時,它是如何定義一個標記庫的呢?這就是taglib指令的主要責任。

taglib 指令

定義一個標記庫以及其自定義標記的前綴.

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文件使用了自定義的標記,同時引用標記庫,

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

屬性

uri="uritotaglibrary" :uniform resource identifier (uri)根據標記的前綴對自定義的標記進行唯一的命名,uri可以是一個相對或絕對的路徑。
  prefix="tagprefix":在自定義標記之前的前綴。如上例中的</tagclass:login>

標記符的處理程序(tag handle)
我們還是以一個例子來看下如何實現一個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;

 }

從以上我們可以看出,實現一個簡單的標記符處理程序有幾個要求:①增加一個類,使之繼承 java.servlet.jsp.tagext.tagsupport類。這個類提供了java.servlet.jsp.tagext.tag接口所要求的所有的方法。另外,還需要使用一些基本的api,使jsp容器能夠調用我們自己提供的標記符處理程序。②必須為每個標記符屬性分別創建一個 get<attribute>和set<attribute>方法,jsp容器需要使用這些方法處理程序傳遞參數。③要為標記符處理程序創建一個構造器和自毀器。jsp需要使用構造器啟動處理程序。自毀器是在realease()方法中定義的。在處理程序的生命周期結束時,需要調用自毀器釋放所占用的資源。④創建兩個名為dostarttag()和doendtag()的方法,執行具體的處理和輸出動作。這兩個方法是在處理自定義標記符的起始位置和結束位置調用的。它們的返回值是在tag interface里定義的靜態int,這幾個靜態值分別是:

skip_body隱含0  :跳過了開始和結束標簽之間的代碼。

eval_body_include隱含1:將body的內容輸出到存在的輸出流中

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

eval_page隱含6:繼續執行下面的頁

  當然標記符也有它自己的缺點。很不方便的封裝過程,有限的功能。對于一些不太復雜和功能單一的邏輯描述,需要傳遞的參數要求不高時,使用jsp標記,要方便的多。對于大多數的商業邏輯應用,還是使用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>

標記符描述庫: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>

標記符處理程序: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;

 }

標記符處理程序中所使用的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)

    {

     }

}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交xxxx黑人猛交| 国产不卡av在线免费观看| 欧美剧在线观看| 欧美一区二区大胆人体摄影专业网站| 亚洲精品色婷婷福利天堂| 国产精品成人国产乱一区| 亚洲一区二区三区香蕉| 中文字幕欧美日韩va免费视频| 精品免费在线视频| 欧美大奶子在线| 日韩成人在线视频| 日本精品视频在线| 91久久精品美女| 欧美亚洲国产视频小说| 亚洲国产成人久久| 日本高清视频一区| 欧美精品电影免费在线观看| 国产精品福利观看| 国产人妖伪娘一区91| 中文字幕综合在线| 久久久精品国产亚洲| 国产一区二区香蕉| 91在线视频成人| 亚洲欧美日本精品| 日韩在线视频观看正片免费网站| 国产精品久久久久久亚洲影视| 久久久久久久97| 青青草原成人在线视频| 色综合天天狠天天透天天伊人| 亚洲品质视频自拍网| 亚洲精品电影网在线观看| 国产成人精品久久二区二区91| 午夜免费日韩视频| 国产成人精品免费久久久久| 亚洲女同精品视频| 欧美亚洲国产日韩2020| 国产极品jizzhd欧美| 欧美在线视频网站| 青青久久av北条麻妃海外网| 久久亚洲精品成人| 国产97色在线|日韩| 欧美日韩在线观看视频| 亚洲欧美激情一区| 亚洲欧美国产高清va在线播| 国产男女猛烈无遮挡91| 亚洲欧洲成视频免费观看| 欧美老女人性生活| 日韩欧美国产免费播放| 69**夜色精品国产69乱| 欧美人与性动交a欧美精品| 91极品女神在线| 日韩电影中文 亚洲精品乱码| 亚洲亚裔videos黑人hd| 中文字幕亚洲在线| 茄子视频成人在线| 国产精品久久久一区| 5278欧美一区二区三区| 国产午夜精品视频免费不卡69堂| 国产精品视频资源| 国产欧美日韩中文字幕| 国内成人精品视频| 亚洲图片欧美午夜| 在线观看日韩专区| 富二代精品短视频| 欧美视频在线观看免费网址| 久久精品国产69国产精品亚洲| 亚洲亚裔videos黑人hd| 欧美激情精品久久久久久| 91精品国产高清自在线看超| 精品福利樱桃av导航| 日本精品免费观看| 欧美在线免费观看| 日韩在线一区二区三区免费视频| 性欧美视频videos6一9| 亚洲91av视频| 欧美专区在线观看| 欧美美最猛性xxxxxx| 久久99亚洲精品| xxx一区二区| 精品美女国产在线| 国产啪精品视频| 欧美一级在线亚洲天堂| 色综合男人天堂| 日韩成人在线视频网站| 精品国产一区二区三区四区在线观看| 亚洲影院色无极综合| 国产精品v片在线观看不卡| 亚洲精品动漫久久久久| 日韩视频在线免费| 欧美超级乱淫片喷水| 欧美裸体视频网站| 欧美一性一乱一交一视频| 国产97免费视| 亚洲黄色有码视频| 欧美性视频网站| 亚洲国产成人精品一区二区| 国产婷婷97碰碰久久人人蜜臀| 欧美性感美女h网站在线观看免费| 国产自摸综合网| 久久99久国产精品黄毛片入口| 亚洲第一色中文字幕| 亚洲www在线| www.国产精品一二区| 国产在线高清精品| 欧美性开放视频| 亚洲伊人一本大道中文字幕| 日韩av中文字幕在线免费观看| 精品久久香蕉国产线看观看gif| 欧美日韩中文在线观看| 综合136福利视频在线| 在线不卡国产精品| 日韩在线精品视频| 91夜夜揉人人捏人人添红杏| 91在线视频精品| 日韩精品www| 成人免费网站在线看| 久久久久久这里只有精品| 精品一区二区三区三区| 亚洲欧美一区二区三区久久| 欧美精品videosex性欧美| 国产视频999| 亚洲国产女人aaa毛片在线| 亚洲福利在线观看| 亚洲免费电影在线观看| 欧美成人激情视频免费观看| 欧美视频在线观看 亚洲欧| 一个人www欧美| 欧美日韩亚洲一区二| 91精品免费视频| 色偷偷偷综合中文字幕;dd| 久久99精品久久久久久青青91| 91国产精品91| 久久视频在线看| 日韩欧美a级成人黄色| 久久99视频精品| 欧美一区深夜视频| 久久久久久国产精品三级玉女聊斋| 欧美国产乱视频| 欧美在线中文字幕| 538国产精品视频一区二区| 精品成人国产在线观看男人呻吟| 久久中国妇女中文字幕| 欧美日韩国产在线看| 午夜精品一区二区三区视频免费看| 精品网站999www| 欧美视频精品一区| 久操成人在线视频| 97视频在线播放| 欧美高清自拍一区| 亚洲电影成人av99爱色| 国产精品美女久久久久久免费| 亚洲新声在线观看| 97在线观看免费| 亚洲日本欧美中文幕| 91精品国产高清久久久久久久久| 韩国三级电影久久久久久| 欧美激情视频一区| 国内精久久久久久久久久人| 久久综合五月天| 亚洲精品有码在线| 777777777亚洲妇女| 成人免费xxxxx在线观看| 成人精品在线视频| 国产精品自产拍在线观|