自定义标签开发

一、概述

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

二、标签库

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

   

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

  1. 控制页面内容(标签体)是否输出
  2. 用标签控制整个jsp是否输出
  3. 控制标签体重复执行
  4. 用标签修改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>

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

   传统标签:

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

  首先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>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 23:28:12

自定义标签开发的相关文章

JSP自定义标签开发入门《转》

JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 目标1:自定义一个用表格显示用户信息的简单标签 效果图: 在jsp页面使用此自定义标签: 假设我们有一个UserInfo的javabean,那

javaweb学习总结(二十三)——jsp自定义标签开发入门

一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import

javaweb学习总结(二十三)——jsp自定义标签开发入门【转】

原文地址:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletReques

javaweb(二十三)——jsp自定义标签开发入门

一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import

javaweb学习总结(十一)——自定义标签开发库

一.自定义标签开发库简介: Tag接口的方法:   二.自定义标签入门:输出客户机ip 1.编写一个实现tag接口的java类 ViewIPTag.java 1 package com.web.tag; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.js

JSP自定义标签开发入门

一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 目标1:自定义一个用表格显示用户信息的简单标签 效果图: 在jsp页面使用此自定义标签: 假设我们有一个UserInfo的javabean,那么在JSP页面使用此标签只

深入分析JavaWeb Item25 -- 自定义标签开发案例和打包自定义标签库

一.开发标签库案例 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java package me.gacl.web.simpletag; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import jav

JSP自定义标签开发

一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 一, 自定义标签  :实现了特定接口的java类,封装了java代码编写的预定义行为.  * 在运行时,标签被替换成相应的预定义java代码. * JSP 自定义标记提

【自定义标签开发】09-标签案例-开发foreach标签

我们接下来开发一个迭代集合的标签.我们知道struts中有一个<s:iterator>标签用来迭代集合,我们接下来模仿它写一个自定义标签. 前台的效果如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="/example" prefix="z" %>