zoukankan      html  css  js  c++  java
  • jsp自定义标签

    一、基本概念

    1、标签(Tag)

    标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的。

    2、标签库(Tag library)

    由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。

    3、标签库描述文件(Tag Library Descriptor)

    标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。

    4、标签处理类(Tag Handle Class)

    标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能。

    二、自定义JSP标签的格式

    1、为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:

    <% @ taglib prefix=”someprefix” uri=”/sometaglib” %>

    1)从一个指定的标签库中识别出代表这种自定义行为的标签;
    2)找到实现这些自定义行为的具体类。

    第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入 自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前 缀。  

    uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称。

    2、当web应用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。

    在JSP页面中,我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配。

    三、自定义JSP标签的处理过程

    1、在JSP中引入标签库

    <% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>

    2、在JSP中使用标签库标签

    3、Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值

    4、Web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.Web容器根据元素的值创建相应的tag handle class的实例 10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理。

    四、创建和使用一个Tag Library的基本步骤

    1、创建标签的处理类(Tag Handler Class)

    2、创建标签库描述文件(Tag Library Descrptor File)

    3、在web.xml文件中配置元素 4.在JSP文件中引人标签库

    五、TagSupport类简介

    1、处理标签的类必须扩展javax.servlet.jsp.TagSupport。

    2、TagSupport类的主要属性:

    A.parent属性:代表嵌套了当前标签的上层标签的处理类;

    B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象;

    3、JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量;

    4、在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化。

    #p#

    六、TagSupport处理标签的方法

    1、TagSupport类提供了两个处理标签的方法:

    public int doStartTag() throws JspException
    public int doEndTag() throws JspException

    2、doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。

    doStartTag()方法返回一个整数值,用来决定程序的后续流程。

    A.Tag.SKIP_BODY:表示?>…之间的内容被忽略;

    B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。

    3、doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

    A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。

    B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。

    七、用户自定义的标签属性

    如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。

    八、创建标签处理类的步骤

    1、创建包含JSP网页静态文本的文件(即是要替换自定义JSP标签的文本);
    2、在Web应用启动时装载静态文本;
    3、创建标签处理类。

    九、如何创建包含JSP网页静态文本的文件

    1、使用java.util.Properties类来存放要替换网页中自定义JSP标签的静态文本;

    2、Properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在WEB-INF目录下,例如key=value,在属性列表中这些key/value都是String类型的。

    十、Properties类的常用API

    1、setProperty(String key, String value):调用Hashtable类的put方法添加属性;

    2、getProperty(String key):获取属性列表中key对应的属性值;

    3、load(InputStream in):从输入流对象InputStream中读取属性列表(Properties list);

    4、store(OutputStream out,String coMMent):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用ISO-88590-1编码格式,以行的方式处理输入。属性的 key/value之间以”=、:”配对,以回车、换行分隔key/value配对。

    十一、ServletContext类的常用API

    1、getContext(String uripath):返回服务器中uripath所代表的ServletContext对象;

    2、getInitParameter(String name):返回ServletConfig对象中name参数的值;

    3、getMineType(String file):返回file参数代表的文件的MIME类型;

    4、getRequestDispatcher(String path):返回path代表的RequestDispacher对象;

    5、getResourceAsStream(String path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于Context Root。

    十二、如何使用ServletContxt读取并保存属性文件

    1、创建java.util.Properties类对象;

    2、获取ServletContext对象;

    3、将属性文件以输入流的形式读入到某个输入流对象中;

    4、将输入流对象加载到Properties对象中;

    5、将Properties对象保存到ServletContext对象中。

    十三、如何在Web应用启动时装载静态文本

    1、创建继承了HttpServlet类的子类,在web.xml中配置这Servlet时设置load-on-startup属性:

    someclass
    somepackage.SomeClass1

    2、在这个Servlet的init()方法中创建java.util.Properties类

    3、获取当前Web应用的ServletContext对象

    4、将WEB-INF目录下的属性文件读入到输入流InputStream中:

    InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");

    5、将输入流加载到属性对象中

    ps.load(in);

    6、将属性对象保存到上

    context.setAttribute("attributeName",ps);

    #p#

    十四、如何创建标签处理类

    1、引入必需的资源

    import javax.servlet.jsp.*; 
    import javax.servlet.http.*;
    import java.util.*;
    import java.io.*;

    2、继承TagSupport类并覆盖doStartTag()/doEndTag()方法

    3、从ServletContext对象中获取java.util.Properties对象

    4、从Properties对象中获取key对应的属性值

    5、对获取的属性进行相应的处理并输出结果

    十五、创建标签库描述文件(Tag Library Descriptor)

    1、标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:

    A.标签库元素
    B.标签元素
    C.标签属性元素

    2、标签库元素用来设定标签库的相关信息,它的常用属性有:

    A.shortname:指定Tag Library默认的前缀名(prefix);

    B.uri:设定Tag Library的惟一访问表示符。

    3、标签元素用来定义一个标签,它的常见属性有:

    A.name:设定Tag的名字;

    B.tagclass:设定Tag的处理类;

    C.bodycontent:设定标签的主体(body)内容。

    1)empty:表示标签中没有body;
    2)JSP:表示标签的body中可以加入JSP程序代码;
    3)tagdependent:表示标签中的内容由标签自己去处理。

    4、标签属性元素用来定义标签的属性,它的常见属性有:

    A.name:属性名称;
    B.required:属性是否必需的,默认为false;
    C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式。

    十六、在Web应用中使用标签

    1、如果Web应用中用到了自定义JSP标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库

    /sometaglib
    /WEB-INF/someTLD.tld

    2、设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray;

    3、指定和Tag Library对应的TLD文件的位置;

    4、在JSP文件中需要加入<% @ taglib% >指令来声明对标签库的引用。例如:

    <% @ taglib prefix = “somePrefix” uri = "/someuri" %>

    5、prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的属性保持一致。

    例子:

    DisplayTag类:
    package cn.xs.displaytag;
    
    import java.io.IOException;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.TagSupport;
    
    public class DisplayTag extends TagSupport{
    
        private static final long serialVersionUID = 1L;
        
            @Override
            public int doStartTag() throws JspException {
                System.out.println("doStartTag()");
                return EVAL_BODY_INCLUDE;
            }
    
            @Override
            public int doAfterBody() throws JspException {
                System.out.println("doAfterBody()");
                return SKIP_BODY;
            }
            
            @Override
            public int doEndTag() throws JspException {
                System.out.println("doEndTag()");
                JspWriter out = this.pageContext.getOut();
                try {
                    out.print("<h2>");
                    out.print("hello world!");
                    out.print("</h2>");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return super.doEndTag();
            }
    }

    display.tld

    <?xml version="1.0" encoding="UTF-8"?>
    <!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>bean</shortname>
        <uri>/WEB-INF/tld/display.tld</uri>
        <tag>
            <name>display</name>
            <tagclass>cn.xs.displaytag.DisplayTag</tagclass>
            <bodycontent>JSP</bodycontent>
            <attribute>
                <name></name>
                <required></required>
                <rtexprvalue></rtexprvalue>
            </attribute>
        </tag>
    </taglib>

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
        <%@ taglib uri="/WEB-INF/tld/display.tld" prefix="test" %>
        
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
        <test:display>>>>>>>>>>><br></test:display>
    </body>
    </html>

    工程结构:

     运行:

    部分资料收集来自互联网....

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/xiaoblog/p/4280045.html
Copyright © 2011-2022 走看看