中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JSP中自定義標記符的使用 (轉)

發布時間:2020-08-08 16:15:17 來源:ITPUB博客 閱讀:165 作者:worldblog 欄目:編程語言
JSP中自定義標記符的使用 (轉)[@more@]

JSP中自定義標記符的使用

 

摘要

   在JSP中有一種機制,可以讓你在JSP頁面中插入與HTML類似的標記。本文介紹JSP定制標記的基本概念和構成,以及如何開發和應用JSP定制標記。XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 關鍵字

JSP,XML,TLD,標記符

什么是標記

使用HTML語言我們可以這樣去編輯我們的網頁:

 

    

</P> <P> HELLO  WORLD</P> <P>

 

 

HELLO WORLD

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

<%@ taglib uri="/tlds/taglib.tld" prefix="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文件。

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

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

  1.0

 

  1.1

 

 tagclass

 

 

     login

    

tagclass.login.login

     

      

     

      height

       

      true

       

      true

     

      width

      true

      true

     

 

在這個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" %>

   

  login

   

   

     

 

   

描述

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

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

屬性

uri="URIToTagLibrary" :UnifoRM Resource identifier (URI)根據標記的前綴對自定義的標記進行唯一的命名,URI可以是一個相對或絕對的路徑。
  prefix="tagPrefix":在自定義標記之前的前綴。如上例中的

標記符的處理程序(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(" ");

}

     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和set方法,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" %>

 

 

 

 

 

 

 

標記符描述庫:taglib.tld

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

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

  1.0

  1.1

 tagclass

 

     login

tagclass.login.login

     

    

      height

      true

      true

     

      width

      true

      true

     

 

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

}

     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)

  {

   }

}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙口市| 延津县| 绥芬河市| 金秀| 江津市| 中牟县| 徐汇区| 绥德县| 江西省| 英超| 兰考县| 吴堡县| 东乡县| 同德县| 夏津县| 曲周县| 汤原县| 东兴市| 堆龙德庆县| 扎赉特旗| 揭西县| 江达县| 屏东县| 湾仔区| 晋城| 北川| 彰化县| 油尖旺区| 凯里市| 平远县| 丰城市| 鹿泉市| 山丹县| 山东省| 江达县| 光泽县| 景泰县| 绥阳县| 新乐市| 江山市| 惠来县|