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

    一、概述

      JSP中的标签库技术可以让我们定制自己的标签,自定义标签实际上是一个实现了特定接口的Java类,封装了一些常用的功能,运行时标签被相应的代码所代替。本文将对自定义标签的开发进行简单的介绍和总结。

    二、标签库

      开发自定义标签库,核心就是要编写标签处理器类,所有的标签处理器类都要实现JspTag接口。标签又分传统标签和简单标签。下图为标签库中主要的接口及类的继承实现关系。

       

      使用标签大致可以实现以下四种基本功能:

    1. 控制页面内容(标签体)是否输出
    2. 用标签控制整个jsp是否输出
    3. 控制标签体重复执行
    4. 用标签修改jsp页面内容

      下面分别针对这两种标签实现上述功能的方法进行介绍:

       传统标签:

    • 控制页面内容(标签体)是否输出

      首先jsp代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="/com.cn" prefix="com"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
            <title>在此处插入标题</title>
        </head>
        
        <body>
            <com:demo2>  <!--此处为自定义标签 -->
                aaaa
            </com:demo2>
        </body>
    </html>

      想要控制标签体内的内容(aaaa)是否输出,则要编写相应的标签处理类:

    public class Demo2 extends TagSupport
    {
        public int doStartTag() throws JspException
        {
            /*
                 返回EVAL_BODY_INCLUDE,表示标签体要被执行
                 返回SKIP_BODY,表示忽略标签体
            */
            return EVAL_BODY_INCLUDE ;   
        }
    }
    • 用标签控制整个jsp是否输出

      对应的jsp代码为:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="/com.cn" prefix="com"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <com:demo3/> <!-- 自定义标签,标签体为空 -->
    <html>
        <head>
            <title>在此处插入标题</title>
        </head>
        
        <body>
            aaaa
        </body>
    </html>

      要控制整个jsp页面是否输出,对应的标签处理器类如下:

    public class Demo3 extends BodyTagSupport
    {
    
        
        public int doEndTag() throws JspException
        {
            /*
                 返回值为EVAL_PAGE,表示JSP页面的余下部分将继续执行
                 返回值为SKIP_PAGE,表示忽略JSP页面的余下部分
             */
            return SKIP_PAGE;
        }
    }
    • 控制标签体重复执行

      这个标签处理器类要实现IterationTag接口,它增加一个方法和一个用作返回值得常量,用于控制对标签体的重复处理。

      对应的标签处理器类代码如下:

    public class Demo4 extends TagSupport
    {
        private int i;
        @Override
        public int doStartTag() throws JspException
        {
             i=0;
            return EVAL_BODY_INCLUDE;
        }
        public int doAfterBody() throws JspException
        {
                i++;
                if(i<5)
                    return EVAL_BODY_AGAIN;  //请求重复执行标签体
                else
                    return SKIP_BODY;         //不在执行标签体
        }
    }

      上述处理器类将控制执行标签体内容5遍。

    • 用标签修改JSP页面内容(将标签体修改为大写输出)

      此标签处理器类要实现BodyTag接口,它增加一个方法和一个用作返回值得常量,用于控制对标签体的重复处理。

    public class Demo5 extends BodyTagSupport
    {
            public int doEndTag() throws JspException
            {
                BodyContent bc=this.getBodyContent();
                String content=bc.getString();
                content=content.toUpperCase();
                try
                {
                    this.pageContext.getOut().write(content);
                } 
                catch (IOException e)
                {
                    throw new RuntimeException(e);
                }
                return EVAL_PAGE;
            }
    }

       简单标签:

      简单标签要实现的接口是SimpleTag,其标签处理器类的生命周期为:

      

      PS:简单标签的标签处理实例不会被缓存而重复使用,每当遇到标签时,容器就会创建一个新的标签处理器实例。

      为了实现前面提到的四个功能,见下面的示例代码:

    public class Demo1 extends SimpleTagSupport  
    {
        @Override
        public void doTag() throws JspException, IOException
        {
            JspFragment    jf=this.getJspBody();
            StringWriter sw=new StringWriter();
            
            jf.invoke(sw);
            
            String content = sw.toString();
            content=content.toUpperCase();
            
            this.getJspContext().getOut().write(content);
        }
    }

     三、标签库描述符

      编写好标签处理器类后,还需要在标签库描述文件中配置标签的相关信息。标签库描述符是一个XML文档,包含标签名字‘标签处理器类和标签的属性信息。其文件扩展名为tld,文件存放位置为META-INf目录下。

      一个tld文件的示例代码如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
        <description>A tag library exercising SimpleTag handlers.</description>
        <tlib-version>1.0</tlib-version>
        <short-name>test</short-name>
        <uri>/test.cn</uri>
        <tag>
             <name>demo1</name>
            <tag-class>com.test.simple.tag.Demo1</tag-class>
            <body-content>scriptless</body-content>
        </tag>
         <tag>
             <name>demo2</name>
            <tag-class>com.test.simple.tag.Demo2</tag-class>
            <body-content>scriptless</body-content>
            <attribute>
                <name>name</name>
                <required>true</required>
            </attribute>
        </tag>
      </taglib> 
  • 相关阅读:
    《一线架构师实践指南》第三编Refined Architecture阶段读后感
    大数据技术与应用课堂测试2-数据初级分析分类2
    大数据技术与应用课堂测试2-数据初级分析分类
    对Datax的理解
    2020春季学期第三周总结
    可测试性战术总结
    2020春季学期第一周总结
    以《淘宝网》为例,描述质量属性的六个常见属性场景
    软件架构师如何工作
    MapReduce+HIVE 课堂练习
  • 原文地址:https://www.cnblogs.com/xujian2014/p/4602781.html
Copyright © 2011-2022 走看看