天天看點

Taglib筆記--摘自http://tech.acnow.net/Html/Program/Java/2002-04/10/092611588.shtml

  所有代碼在win2000 + tomcat 4.1.17 下通過。

  我剛開始使用java,有不當之處,請高手多指教。 

第一章:怎樣使用Taglib

一、第一種方法:僅聲明TLD位置

在jsp檔案頭部,聲明:

<%@ taglib uri=”/WEB-INF/tlds/orataglib_1_0.tld” prefix=”ora”%>

這樣就ok了

二、第二種方法:定義庫名稱

<%@ taglib uri=”/orataglib” prefix=”ora”%>

<taglib>

<taglib-uri>/orataglib</taglib-uri>

<taglib-location>/WEB-INF/tlds/orataglib_1_0.tld</taglib-location>

</taglib>

在tld裡加上:

<shortname>ora</shortname>

<uri>/orataglib</uri>

三、差別

 如果類不多,用tld引用就行了。否則就用庫形式,便于更新,改動。

第二章:編寫最簡單的Taglib

一、編寫HelloWorldTag 類

package mytag; 

import java.io.IOException;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

public class HelloWorldTag extends TagSupport{

    public int doStartTag() throws JspTagException{

        return EVAL_BODY_INCLUDE;

    }

  public int doEndTag() throws JspTagException{

    try{

            pageContext.getOut().write("Hello World");

        }

    catch (IOException ex){

             throw new JspTagException("Error!");

    return EVAL_PAGE;

}

二、編寫相應TLD檔案

取名為hello.tld

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

<!DOCTYPE taglib

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

 <tlibversion>1.0</tlibversion>

 <jspversion>1.1</jspversion>

 <shortname>myTag</shortname> 

  <tag>

        <name>hello</name>

        <tagclass>mytag.HelloWorldTag</tagclass>

        <bodycontent>empty</bodycontent>

  </tag>

三、編寫testtag1.jsp進行調用

<%@ page language="java"%>

<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>

<html>

<body>

<mytag:hello></mytag:hello>

</body>

</html>

四、注意點

1.   實際生成的類在包mytag内,要把該包放到WEB-INF\classes目錄下

2.   tld檔案裡的shortname 就是 jsp裡的 prefix

3.   tld檔案裡的<tag>标簽中,<name>表示實際類的一個别名,供jsp頁面引用。<tagclass>表示實際的類

 4。把tld檔案放到WEB-INF 下的tlds檔案夾内。

五、概述

1.   必須導入javax.servlet.jsp.* 和 javax.servlet.jsp.tagext.* 兩個包

2.   讓自己的類繼承TagSupport 類,并且實作doStartTag 或 doEndTag 方法。

3.   編寫tld标簽,隻需指定<shortname>标簽,和編寫具體的類标簽<tag>,其他的可以複制粘貼。

4.   在jsp頁面是用導入tld的辦法。然後用字首:類名的方式調用。

第三章:編寫帶BODY的Taglib

一、編寫HelloBodyTag 類

package mytag;

import java.io.*;

public class HelloBodyTag extends BodyTagSupport {

    public int doAfterBody() throws JspException {

        BodyContent bc = getBodyContent();

        JspWriter out = getPreviousOut();

        try {

            out.write(bc.getString());

        catch (IOException e) {} // Ignore

        return SKIP_BODY;

二、修改tld檔案

加入:

     <tag>

        <name>HelloBodyTag</name>

        <tagclass>mytag.HelloBodyTag</tagclass>

   </tag>

三、        寫testtag2.jsp調用

<mytag:HelloBodyTag>Hello,BodyTag!</mytag:HelloBodyTag>

四、概述

1.類最好繼承BodyTagSupport

2.BodyContent 和 JspWriter 都是容器内的對象

3.GetPreviousOut表示外層輸出。對于某個tag來說,外層輸出就是jsp頁面。對于某個嵌套的tag,外層輸出就是父tag

第四章:讓行為互相協作

一、編寫互相協作的行為

編寫這樣的tag,在jsp頁面調用時

<mytag:helloMan><mytag:param name=”diego” ></mytag:param></mytag: helloMan>

 會得到 hello diego 的值。

二、編寫兩個Tag類

1.編寫ParamTag 類

import java.net.*;

public class ParamTag extends TagSupport {

    private String name;

    public void setName(String name) {

        this.name = name;

    public int doEndTag() throws JspException {

        Tag parent = findAncestorWithClass(this, ParamParent.class);

        ParamParent paramParent = (ParamParent) parent;

        paramParent.setParam(name);

        return EVAL_PAGE;

    public void release() {

        name = null;

        super.release();

2.編寫HelloParamTag 類

import javax.servlet.http.*;

public class HelloParamTag extends TagSupport implements ParamParent {

    public void setParam(String name) {

    public int doStartTag() {

        return EVAL_BODY_INCLUDE;

        JspWriter out = pageContext.getOut();

        try{

     out.print("hello " + this.name );   

     }

catch(IOException e){

         }            

        return EVAL_PAGE;

     name = null;

3.編寫輔助的接口ParamParent

public interface ParamParent {

    void setParam(String name);

三、修改tld檔案

        <name>helloMan</name>

        <tagclass>mytag.HelloParamTag</tagclass>

    <tag>

        <name>param</name>

        <tagclass>mytag.ParamTag</tagclass>

        <attribute>

            <name>name</name>

            <required>false</required>

        </attribute>

四、編寫testtag3.jsp進行測試

<mytag:helloMan><mytag:param name="diego" ></mytag:param></mytag:helloMan>

1.嵌套行為中,一般父Tag實作業務邏輯,子Tag為父Tag提供參數

2.子Tag通過findAncestorWithClass 找到父Tag,為了達到通用化,設計接口ParamParent

3.在父Tag内實作了接口的setParam方法,子Tag通過調用該方法,設定了父Tag的參數

4.父Tag實作業務邏輯。列印Hello

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

本文轉自kenty部落格園部落格,原文連結http://www.cnblogs.com/kentyshang/archive/2007/06/29/800275.html如需轉載請自行聯系原作者

kenty