所有代碼在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