JSP传统标签开发

1、标签技术的API类继承关系

1)、JspTag接口是所有自定义标签的父接口

该接口中没有任何属性和方法,只有两个直接子接口,Tag接口和SimpleTag接口,把实现Tag接口的自定义标签叫做传统标签,把实现SimpleTag接口的自定义标签叫做简单标签

2)、Tag接口,所有传统标签的父接口,两个重要方法(doStartTag、doEndTag)和四个常量(EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_PAGE、SKIP_PAGE)

  WEB容器在解释执行JSP页面过程中,遇到自定义标签的开始标记就会去调用标签处理器的doStartTag方法,该方法可以返回常量SKIP_BODY和EVAL_BODY_INCLUDE。如果返回SKIP_BODY,WEB容器就会忽略自定义标签的标签体,直接执行自定义标签的结束标记;如果返回EVAL_BODY_INCLUDE,WEB容器就会执行自定义标签标签体。

  WEB容器在解释执行JSP页面过程中,遇到自定义标签的结束标记就会去调用标签处理器的doEndTag方法,该方法可以返回常量SKIP_PAGE和EVAL_PAGE。如果返回SKIP_PAGE,WEB容器就会忽略自定义标签结束标记后面所有内容;如果返回EVAL_PAGE,WEB容器就会接着执行自定义标签结束标记后面的代码

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

/**
 * Created by JiaPeng on 2016/8/19.
 */
public class TagDemo implements Tag {
    @Override
    public void setPageContext(PageContext pageContext) {

    }

    @Override
    public void setParent(Tag tag) {

    }

    @Override
    public Tag getParent() {
        return null;
    }

    @Override
    public int doStartTag() throws JspException {
        return Tag.EVAL_BODY_INCLUDE;//输出标签体
//        return Tag.SKIP_BODY;//跳过标签体直接解释执行结束标识符
    }

    @Override
    public int doEndTag() throws JspException {
//        return Tag.EVAL_PAGE;//执行完标签体后继续执行后面代码
        return Tag.SKIP_PAGE;//执行完标签体后,忽略后面所有内容
    }

    @Override
    public void release() {

    }
}

Tag接口实现类

<?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>自定义标签</description>

    <tlib-version>1.0</tlib-version>

    <short-name>SDT</short-name>

    <uri>/sefDefineTag</uri>
    <tag>
        <name>tagDemo</name>
        <tag-class>TagDemo.TagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
</taglib>

tld文件代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
    <title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6>
<sdt:tagDemo>标签体</sdt:tagDemo>
<h6>---------------------------------------------</h6>
<div>
    <h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSP测试代码

3)、IterationTag接口,继承自Tag接口,并新增一个方法doAfterBody和一个常量EVAL_BODY_AGAIN。因此实现了IterationTag接口的自定义标签除了可以完成Tag接口所有功能外,还能够通知WEB容器是否重复执行标签体内容。

  对于实现了IterationTag接口的自定义标签,WEB容器执行完自定义标签的标签体后,将调用标签处理器的doAfterBody方法,该方法可以返回SKIP_BODY和EVAL_BODY_AGAIN。如果返回EVAL_BODY_AGAIN,WEB容器就会把标签体的内容重复执行一次,执行完后再调用doAfterBody方法,如此往复,直到doAfterBody方法返回SKIP_BODY,然后WEB容器才会执行标签结束标记和调用doEndTag方法。

  TagSupport是IterationTag接口的默认实现类,我们在开发中可以继承和扩展TagSupport类,这相比实现IterationTag接口简化了工作。

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * Created by JiaPeng on 2016/8/18.
 */
public class IterationTagDemo extends TagSupport {

    int x = 5;

    @Override
    public int doStartTag() throws JspException {
        x=5;
        return Tag.EVAL_BODY_INCLUDE;//输出标签体内容
    }

    @Override
    public int doAfterBody() throws JspException {
        x--;
        if (x > 0) {
            return IterationTag.EVAL_BODY_AGAIN;//循环标签体
        } else {
            return IterationTag.SKIP_BODY;//结束循环
        }
    }

//    @Override
//    public int doEndTag() throws JspException {
//        return Tag.EVAL_PAGE;
//    }
}

TagSupport子类代码,doStartTag方法返回EVAL_BODY_INCLUDE

<?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>自定义标签</description>

    <tlib-version>1.0</tlib-version>

    <short-name>SDT</short-name>

    <uri>/sefDefineTag</uri>
    <tag>
        <name>tagDemo</name>
        <tag-class>TagDemo.TagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
    <tag>
        <description>测试循环</description>
        <name>iteration</name>
        <tag-class>TagDemo.IterationTagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
</taglib>

tld文件代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
    <title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6>

<sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<h6>---------------------------------------------</h6>
<div>
    <h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSP测试代码

4)、BodyTag接口,继承自IterationTag接口,并新增两个方法setBodyContent、doInitBody和一个常量EVAL_BODY_BUFFERED。因此实现了BodyTag接口的自定义标签除了可以完成IterationTag接口定义的功能外,还可以对标签体内容进行修改。

  对于实现了BodyTag接口的自定义标签,标签处理器的doStartTag方法不仅可以返回常量SKIP_BODY和EVAL_BODY_INCLUDE,还可以返回常量EVAL_BODY_BUFFERED,如果返回常量EVAL_BODY_BUFFERED,WEB容器就会创建一个捕获标签体运行结果的BodyContent对象,调用标签处理器的setBodyContent方法,将对象引用传递给标签处理器,然后WEB容器将标签体的处理结果写入BodyContent对象中,这样在后续事件方法中,就可以通过调用BodyContent对象中方法对标签体内容进行修改和控制输出。

  BodyTagSupport是BodyTag接口默认实现类,开发中可以集成或扩展BodyTagSupport类,这相比实现BodyTag接口简化了工作。

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;
import java.io.IOException;

/**
 * Created by JiaPeng on 2016/8/18.
 */
public class BodyTagDemo extends BodyTagSupport {
    @Override
    public int doStartTag() throws JspException {
        return BodyTag.EVAL_BODY_BUFFERED;
    }

    @Override
    public int doEndTag() throws JspException {
        BodyContent content = this.getBodyContent();
        String str = content.getString();
        String result = str.toUpperCase();
        try {
            this.pageContext.getOut().write(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Tag.EVAL_PAGE;
    }

    @Override
    public void doInitBody() throws JspException {
        System.out.println("doInitBody");
        super.doInitBody();
    }
}

BodyTagSupport子类代码,doStartTag方法返回EVAL_BODY_BUFFERED

<?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>自定义标签</description>

    <tlib-version>1.0</tlib-version>

    <short-name>SDT</short-name>

    <uri>/sefDefineTag</uri>
    <tag>
        <name>tagDemo</name>
        <tag-class>TagDemo.TagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
    <tag>
        <description>测试循环</description>
        <name>iteration</name>
        <tag-class>TagDemo.IterationTagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
    <tag>
        <description>测试修改标签体内容</description>
        <name>bodytag</name>
        <tag-class>TagDemo.BodyTagDemo</tag-class>
        <body-content>JSP</body-content>
    </tag>
</taglib>

tld文件代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
    <title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6>

<sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<h6>---------------------------------------------</h6>
<div>
    <h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSP测试代码,小写转大写

5)、SimpleTag接口,直接继承自JspTag接口,由于传统标签接口实现功能繁琐,不利于技术推广,SUN公司为了降低技术学校难度,在JSP2.0中定义了更为简单的SimpleTag接口,接口中之定义了处理标签逻辑的doTag方法,该方法在WEB容器执行自定义标签时候被调用,且只被调用一次,可完成传统标签所定义的功能,如是否执行标签体、迭代标签体、对标签体内容进行修改等。

  SimpleTagSupport是SimpleTag接口默认实现类,开发中可以集成或扩展SimpleTagSupport类,相比SimpleTag接口实现简化了工作。

自定义标签中常用方法及其返回值说明,如下图

时间: 2024-10-02 02:05:18

JSP传统标签开发的相关文章

javaweb学习总结(二十四)——jsp传统标签开发

一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法.JspTag接口有Tag和SimpleTag两个直接子接口,JSP2.0以前的版本中只有Tag接口,所以把实现Tag接口的自定义标签也叫做传统标签,把实现SimpleTag接口的自定义标签叫做简单标签. 2.2.Tag接口 Tag接口是所有传统标签的父接口,其中定义了两个重要方法(doSt

javaweb学习总结(二十四)——jsp传统标签开发【转】

原文地址:http://www.cnblogs.com/xdp-gacl/p/3916946.html 一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法.JspTag接口有Tag和SimpleTag两个直接子接口,JSP2.0以前的版本中只有Tag接口,所以把实现Tag接口的自定义标签也叫做传统标签,把实现SimpleTag接口的自定义标

08.十分钟学会JSP传统标签编程

一.认识标签 1,说明:传统标签编程在开发中基本用不到,学习标签编程主要还是为了完善知识体系. 2,标签的主要作用:移除或减少jsp中的java代码 3,标签的主要组成部分及运行原理 4,简单标签示例:继承javax.servlet.jsp.tagext.TagSupport 标签开发步骤 4.1编写一个继承TagSupport(或实现Tag接口)的类 package com.chen.ying; import java.io.IOException; import javax.servlet.

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

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

JSP简单标签开发

一.继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法 1.setJspContext方法 用于把JSP页面的PageContext对象传递给标签处理器对象 2.setParent方法 把父标签处理器对象传递给当前处理器对象 3.getParent方法 用于获取当前标签的父标签处理器对象 4.setJspBody方法 用于把代表标签体的JspFragment对象传递给标签处理器对象 5.doTag方法 用于完成所有标签逻辑,如输出.迭代.修改标签内容等.在方法中可以通过抛

javaweb学习总结(二十五)——jsp简单标签开发(一)

一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用的SimpleTag接口来实现标签的功能. 实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法(非常重要),简单标签使用这个方法就可以完成所有的业务

JSP简单标签开发(1)

一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用的SimpleTag接口来实现标签的功能. 实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法(非常重要),简单标签使用这个方法就可以完成所有的业务

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

JSP自定义标签开发入门

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