您的位置:首页 > Web前端 > JavaScript

Taglib学习笔记

2004-11-06 02:00 253 查看

第一章:怎样使用Taglib

一、第一种方法:仅声明TLD位置

在jsp文件头部,声明:<%@ taglib uri=”/WEB-INF/tlds/orataglib_1_0.tld” prefix=”ora”%>
这样就ok了

二、第二种方法:定义库名称

在jsp文件头部,声明:
<%@ taglib uri=”/orataglib” prefix=”ora”%>
 
在WEB.XML添加如下声明:<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
        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>myTag</shortname> 
    <tag>
        <name>hello</name>
        <tagclass>mytag.HelloWorldTag</tagclass>
        <bodycontent>empty</bodycontent>
   </tag>
</taglib>

三、编写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.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
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调用

<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>
<html>
<body>
<mytag:HelloBodyTag>Hello,BodyTag!</mytag:HelloBodyTag>
</body>
</html>

四、概述

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 类package mytag;
 
import java.net.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
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 类package mytag;
 
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
 
public class HelloParamTag extends TagSupport implements ParamParent {
    private String name;
 
    public void setParam(String name) {
        this.name = name;
    }
 
    public int doStartTag() {
        return EVAL_BODY_INCLUDE;
    }
 
    public int doEndTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try{
     out.print("hello " + this.name );   
     }
catch(IOException e){
         }            
        return EVAL_PAGE;
    }
 
    public void release() {
     name = null;
        super.release();
    }
}
 
3.编写辅助的接口ParamParent
package mytag;
 
public interface ParamParent {
    void setParam(String name);
}
 

三、修改tld文件

    <tag>
        <name>helloMan</name>
        <tagclass>mytag.HelloParamTag</tagclass>
    </tag>
     
    <tag>
        <name>param</name>
        <tagclass>mytag.ParamTag</tagclass>
        <attribute>
            <name>name</name>
            <required>false</required>
        </attribute>
    </tag>

四、编写testtag3.jsp进行测试

<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>
<html>
<body>
<mytag:helloMan><mytag:param name="diego" ></mytag:param></mytag:helloMan>
</body>
</html>

五、设计思路

1.嵌套行为中,一般父Tag实现业务逻辑,子Tag为父Tag提供参数
2.子Tag通过findAncestorWithClass 找到父Tag,为了达到通用化,设计接口ParamParent
3.在父Tag内实现了接口的setParam方法,子Tag通过调用该方法,设置了父Tag的参数
4.父Tag实现业务逻辑。打印Hello
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息