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接口实现简化了工作。

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

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

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

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  2. javaweb(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  3. jsp jsp传统标签开发

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. jsp简单标签开发(一)

    孤傲苍狼 @Override22 public void doTag() throws JspException, IOException {23 //得到代表jsp标签体的JspFragment24 ...

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

    一.认识标签 1,说明:传统标签编程在开发中基本用不到,学习标签编程主要还是为了完善知识体系. 2,标签的主要作用:移除或减少jsp中的java代码 3,标签的主要组成部分及运行原理 4,简单标签示例 ...

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

    JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...

  7. JSP简单标签开发

    一.继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法 1.setJspContext方法 用于把JSP页面的PageContext对象传递给标签处理器对象 2.setPare ...

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

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  9. jsp 简单标签开发

    实现simpleTag接口的标签通常称为是简单标签,简单标签一共定义了5个方法 setJspContext方法 setParent方法 getParent方法 setJspBody方法 doTag方法 ...

随机推荐

  1. Tomcat5通过cardadm.xml启动项目

    配置tomcat5\conf\Catalina\localhost下的   cardadm.xml  ,然后在MyEclipse中,直接启动Tomcat5,不需要部署项目

  2. Java--剑指offer(5)

    21.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对 ...

  3. mysql 根据某些字段之和排序

    在自己项目中记录了比赛球队获得金银铜牌的具体奖牌数,遇到需求是按照奖牌个数排序 select a.RANK_ID,a.COUNTRY,a.GOLD,a.SILVER,a.BRONZE,a.ICON,a ...

  4. 【凯子哥带你学Framework】Activity界面显示全解析

    前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...

  5. 强制重启N种方法

    强制重启N种方法 2015-12-24 17:19 146人阅读 评论(0) 收藏 举报 本文章已收录于:   分类: 驱动开发学习(458) 作者同类文章X 1. 无意中看到一种通过控制92H端口b ...

  6. ASP.NET MVC 4 异步加载控制器

    ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个 ...

  7. 76.Android之EventBus源码解析

    转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Andro ...

  8. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  9. 【BZOJ-3555】企鹅QQ 字符串Hash

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1545  Solved: 593[Submit][Statu ...

  10. bzoj3514Codechef MARCH14 GERALD07加强版

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...