zoukankan      html  css  js  c++  java
  • Taglib笔记摘自http://tech.acnow.net/Html/Program/Java/200204/10/092611588.shtml

    读完《jsp设计》后深深为大师的功力折服。这篇笔记就当是个总结。

      所有代码在win2000 + tomcat 4.1.17 下通过。

      我刚开始使用java,有不当之处,请高手多指教。 

    第一章:怎样使用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

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

  • 相关阅读:
    SpringMVC处理MYSQL BLOB字段的上传
    Linux中MySQL数据库max_allowed_packet的调整
    错误The request sent by the client was syntactically incorrect ()的解决
    爪哇国新游记之三十一----日期时间与字符串间的转化
    单片机c51头文件的解释
    51单片机数据传送指令
    周立功:写给学单片机的年轻人
    Java设计模式之单例设计模式
    Java主函数解释、java/javac命令解释、classpath解释
    利用HTML5,前端js实现图片压缩
  • 原文地址:https://www.cnblogs.com/kentyshang/p/800275.html
Copyright © 2011-2022 走看看