一、JSP标签技术API

1.继承关系

2.API接口简介

JspTag接口

  JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法。JspTag接口有Tag和SimpleTag两个直接子接口,JSP2.0以前的版本中只有Tag接口,所以把实现Tag接口的自定义标签也叫做传统标签,把实现SimpleTag接口的自定义标签叫做简单标签

Tag接口

  Tag接口是所有传统标签的父接口,其中定义了两个重要方法(doStartTag、doEndTag)方法和四个常量(EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_PAGE、SKIP_PAGE),这两个方法和四个常量的作用如下:

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

  (2)WEB容器解释执行到自定义标签的结束标记时,就会调用标签处理器的doEndTag方法,doEndTag方法执行完后可以向WEB容器返回常量EVAL_PAGE或SKIP_PAGE。如果doEndTag方法返回常量EVAL_PAGE,WEB容器就会接着执行JSP页面中位于结束标记后面的JSP代码;如果doEndTag方法返回SKIP_PAGE,WEB容器就会忽略JSP页面中位于结束标记后面的所有内容。

  从doStartTag和doEndTag方法的作用和返回值的作用可以看出,开发自定义标签时可以在doStartTag方法和doEndTag方法体内编写合适的Java程序代码来实现具体的功能,通过控制doStartTag方法和doEndTag方法的返回值,还可以告诉WEB容器是否执行自定义标签中的标签体内容和JSP页面中位于自定义标签的结束标记后面的内容。

IterationTag接口

  IterationTag接口继承了Tag接口,并在Tag接口的基础上增加了一个doAfterBody方法和一个EVAL_BODY_AGAIN常量。实现IterationTag接口的标签除了可以完成Tag接口所能完成的功能外,还能够通知WEB容器是否重复执行标签体内容。对于实现了IterationTag接口的自定义标签,WEB容器在执行完自定义标签的标签体后,将调用标签处理器的doAfterBody方法,doAfterBody方法可以向WEB容器返回常量EVAL_BODY_AGAIN或SKIP_BODY。如果doAfterBody方法返回EVAL_BODY_AGAIN,WEB容器就会把标签体内容再重复执行一次,执行完后接着再调用doAfterBody方法,如此往复,直到doAfterBody方法返回常量SKIP_BODY,WEB容器才会开始处理标签的结束标记和调用doEndTag方法。

  可见,开发自定义标签时,可以通过控制doAfterBody方法的返回值来告诉WEB容器是否重复执行标签体内容,从而达到循环处理标签体内容的效果。例如,可以通过一个实现IterationTag接口的标签来迭代输出一个集合中的所有元素,在标签体部分指定元素的输出格式。

  在JSP API中也提供了IterationTag接口的默认实现类TagSupport,我们在编写自定义标签的标签处理器类时,可以继承和扩展TagSupport类,这相比实现IterationTag接口将简化开发工作。

BodyTag接口

  BodyTag接口继承了IterationTag接口,并在IterationTag接口的基础上增加了两个方法(setBodyContent、doInitBody)和一个EVAL_BODY_BUFFERED常量。实现BodyTag接口的标签除了可以完成IterationTag接口所能完成的功能,还可以对标签体内容进行修改。对于实现了BodyTag接口的自定义标签,标签处理器的doStartTag方法不仅可以返回前面讲解的常量EVAL_BODY_INCLUDE或SKIP_BODY,还可以返回常量EVAL_BODY_BUFFERED。如果doStartTag方法返回EVAL_BODY_BUFFERED,WEB容器就会创建一个专用于捕获标签体运行结果的BodyContent对象,然后调用标签处理器的setBodyContent方法将BodyContent对象的引用传递给标签处理器,WEB容器接着将标签体的执行结果写入到BodyContent对象中。在标签处理器的后续事件方法中,可以通过先前保存的BodyContent对象的引用来获取标签体的执行结果,然后调用BodyContent对象特有的方法对BodyContent对象中的内容(即标签体的执行结果)进行修改和控制其输出。

  在JSP API中也提供了BodyTag接口的实现类BodyTagSupport,我们在编写能够修改标签体内容的自定义标签的标签处理器类时,可以继承和扩展BodyTagSupport类,这相比实现BodyTag接口将简化开发工作。

SimpleTag接口

  SimpleTag接口是JSP2.0中新增的一个标签接口。由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广,因此,SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口。SimpleTag接口与传统标签接口最大的区别在于,SimpleTag接口只定义了一个用于处理标签逻辑的doTag方法,该方法在WEB容器执行自定义标签时调用,并且只被调用一次。那些使用传统标签接口所完成的功能,例如是否执行标签体、迭代标签体、对标签体内容进行修改等功能都可以在doTag方法中完成。

  在JSP API中也提供了SimpleTag接口的实现类SimpleTagSupport,我们在编写简单标签时,可以继承和扩展SimpleTagSupport类,这相比实现SimpleTag接口将简化开发工作。

3.接口返回值说明

二、JSP标签页面逻辑

1.控制JSP部分内容是否执行

Tag类

package com.hanxin;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
/*** @author hanxin* TagSupport类实现了Tag接口,TagDemo1继承TagSupport类* */
public class TagDemo01 extends TagSupport {/** 重写doStartTag方法,控制标签体是否执行* @see javax.servlet.jsp.tagext.TagSupport#doStartTag()*/@Overridepublic int doStartTag() throws JspException {//如果这个方法返回EVAL_BODY_INCLUDE,则执行标签体,如果返回SKIP_BODY,则不执行标签体//return Tag.EVAL_BODY_INCLUDE;return Tag.SKIP_BODY;}}

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用来添加对taglib(标签库)的描述 --><description>传统标签库</description><!--taglib(标签库)的版本号 --><tlib-version>1.0</tlib-version><short-name>TagLib</short-name><!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,在Jsp页面中引用标签库时,需要通过uri找到标签库在Jsp页面中就要这样引入标签库:<%@taglib uri="/TagLib" prefix="m"%>--><uri>/myTagLib</uri><!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  --><!-- 一个tag标记对应一个自定义标签 --><tag><description>TagDemo01</description><name>TagDemo01</name><!-- 标签对应的处理器类--><tag-class>com.hanxin.TagDemo01</tag-class><!--demo1标签有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content></tag>
</taglib>

jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/myTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en"><!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"><title>控制标签体是否执行</title>
</head><body><!--  带标签体的标签 --><m:TagDemo01>好好学习,天天向上</m:TagDemo01>
</body>
</html>

2.控制整个JSP页面是否执行

Tag类

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
/*** @author hanxin* TagSupport类实现了Tag接口,TagDemo2继承TagSupport类* */
public class TagDemo02 extends TagSupport {/** 重写doEndTag方法,控制jsp页面是否执行* @see javax.servlet.jsp.tagext.TagSupport#doEndTag()*/@Overridepublic int doEndTag() throws JspException {//如果这个方法返回EVAL_PAGE,则执行标签余下的jsp页面,如果返回SKIP_PAGE,则不执行余下的jspreturn Tag.SKIP_PAGE;//return Tag.EVAL_PAGE;}}

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用来添加对taglib(标签库)的描述 --><description>传统标签库</description><!--taglib(标签库)的版本号 --><tlib-version>1.0</tlib-version><short-name>TagLib</short-name><!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,在Jsp页面中引用标签库时,需要通过uri找到标签库在Jsp页面中就要这样引入标签库:<%@taglib uri="/TagLib" prefix="m"%>--><uri>/myTagLib</uri><!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  --><!-- 一个tag标记对应一个自定义标签 --><tag><description>TagDemo02</description><name>TagDemo02</name><!-- 标签对应的处理器类--><tag-class>com.hanxin.TagDemo02</tag-class><!--demo2没有标签体,所以这里的body-content设置为empty--><body-content>empty</body-content></tag>
</taglib>

JSP文件

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/myTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en"><!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"><title>控制jsp页面是否执行</title>
</head><body><h1>开始</h1><!--  不带标签体的标签 --><m:TagDemo02/><h1>结束</h1>
</body>
</html>

3.控制JSP页面重复

Tag类

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
/*** @author hanxin* 编写一个类实现Iterationtag接口,控制doAfterBody()方法的返回值,*如果这个方法返回EVAL_BODY_AGAIN, 则web服务器又执行一次标签体,依次类推,*一直执行到doAfterBody方法返回SKIP_BODY,则标签体才不会重复执行。* TagSupport类实现了Iterationtag接口,TagDemo3继承TagSupport类* */
public class TagDemo03 extends TagSupport {int i=0;/** 控制doAfterBody()方法的返回值,* 如果这个方法返回EVAL_BODY_AGAIN, 则web服务器又执行一次标签体,* 依次类推,一直执行到doAfterBody方法返回SKIP_BODY,则标签体才不会重复执行。* @see javax.servlet.jsp.tagext.TagSupport#doStartTag()*/@Overridepublic int doAfterBody() throws JspException {i++;System.out.println(i);if(i<10){return IterationTag.EVAL_BODY_AGAIN;}else{return IterationTag.SKIP_BODY;}}@Overridepublic int doStartTag() throws JspException {return Tag.EVAL_BODY_INCLUDE;}}

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用来添加对taglib(标签库)的描述 --><description>传统标签库</description><!--taglib(标签库)的版本号 --><tlib-version>1.0</tlib-version><short-name>TagLib</short-name><!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,在Jsp页面中引用标签库时,需要通过uri找到标签库在Jsp页面中就要这样引入标签库:<%@taglib uri="/TagLib" prefix="m"%>--><uri>/myTagLib</uri><!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  --><!-- 一个tag标记对应一个自定义标签 --><tag><description>TagDemo03</description><name>TagDemo03</name><!-- 标签对应的处理器类--><tag-class>com.hanxin.TagDemo03</tag-class><!--demo3带有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content></tag>
</taglib>

jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/myTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en"><!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"><title>控制页面内容重复执行</title>
</head><body><!--带标签体的标签 --><m:TagDemo03><h3>控制页面内容重复执行</h3></m:TagDemo03>
</body>
</html>

4.修改JSP页面输出内容

Tag类

import java.io.IOException;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;
/***BodyTagSupport类实现了BodyTag接口接口,TagDemo4继承 BodyTagSupport类* */
public class TagDemo04 extends BodyTagSupport {@Overridepublic int doEndTag() throws JspException {//this.getBodyContent()得到代表标签体的bodyContent对象BodyContent bodycontent = getBodyContent();//拿到标签体String content = bodycontent.getString();//修改标签体里面的内容String result = content.substring(content.length()/2);try {//输出修改后的内容this.pageContext.getOut().write(result);} catch (IOException e) {e.printStackTrace();}return Tag.EVAL_PAGE;}/** 控制doStartTag()方法返回EVAL_BODY_BUFFERED* @see javax.servlet.jsp.tagext.BodyTagSupport#doStartTag()*/@Overridepublic int doStartTag() throws JspException {return BodyTag.EVAL_BODY_BUFFERED;}}

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用来添加对taglib(标签库)的描述 --><description>传统标签库</description><!--taglib(标签库)的版本号 --><tlib-version>1.0</tlib-version><short-name>TagLib</short-name><!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,在Jsp页面中引用标签库时,需要通过uri找到标签库在Jsp页面中就要这样引入标签库:<%@taglib uri="/TagLib" prefix="m"%>--><uri>/myTagLib</uri><!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  --><!-- 一个tag标记对应一个自定义标签 --><tag><description>TagDemo04</description><name>TagDemo04</name><!-- 标签对应的处理器类--><tag-class>com.hanxin.TagDemo04</tag-class><!--demo3带有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content></tag>
</taglib>

jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/myTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en"><!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"><title>修改jsp页面内容输出</title>
</head><body><!--带标签体的标签 --><m:TagDemo04><h3>修改jsp页面内容输出</h3></m:TagDemo04>
</body>
</html>

JavaWeb学习心得之自定义传统标签相关推荐

  1. Javaweb学习笔记(JSP标准标签库)

    Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...

  2. JavaWeb学习心得总结

    JavaWeb(JSP+Servlet)新手学习心得总结 说明: 由于篇幅的原因,本文只是对于JavaWeb项目的大致数据流程做一个介绍,同时引出一些JavaWeb开发中很基础的知识点,且不会精确到具 ...

  3. javaweb学习心得-01(西部开源-秦疆随堂笔记)

    maven maven 创建一个maven项目的过程 1.在maven官网下载安装包 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzwwfNnx-163583458 ...

  4. JavaWeb学习心得之JSP内置对象

    一.内置对象(九个) request.response.session.application.config已有详细介绍,这里重点介绍pageContext.out.page对象. 二.page对象 ...

  5. javaweb学习总结(十九)——JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  6. 【JavaWeb学习】HTML的基础标签

    (1)html语言是解释型语言,不是编译型,浏览器是容错的 (2)html页面中由一对标签组成: <html></html> <html> 称之为 开始标签< ...

  7. javaweb学习6——自定义标签

    声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...

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

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

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

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

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

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

最新文章

  1. 板子armv7_32怎么挂载windows文件夹?
  2. 手把手教你从Core Data迁移到Realm
  3. Spring IOC容器-Bean管理——基于XML方式
  4. python中迭代器和可迭代对象的区别_Python 可迭代对象迭代器生成器的区别
  5. 运维前线:一线运维专家的运维方法、技巧与实践3.1 数据中心搬迁准备
  6. 网络工程 IP地址与子网掩码
  7. 赛车游戏代码大全html,赛车游戏代码
  8. IDEA快捷生成方法
  9. 银行合规程序KYC、CDD、AML和TM
  10. 软件测试人员常用的sql语句(四)
  11. 方寸微 T620 存储安全芯片 安全存储 USB3.0 U盘/移动硬盘
  12. 一个10年符号主义学者的深度讨论:如何理性看待ChatGPT?
  13. vim编辑器删除键失效问题
  14. 数据库类型为BLOB图片,前台显示问题。
  15. 智慧医疗BI助你释放医疗大数据潜力
  16. 蘑菇街后台开发实习二面(视频面)
  17. 修改设置 打造安全的个人电脑(转)
  18. 《KVM虚拟化技术实战和原理解析》读书笔记(三)
  19. Python GDAL工具使用及使用VRT格式数据处理
  20. eem二级c语言题库哪种比较好,c语言小知识,供初学者参考

热门文章

  1. matlab 2014
  2. 2022-2028全球浴室地漏行业调研及趋势分析报告
  3. java教程配置通达信,通达信公式转换JAVA,通达信20个经典公式
  4. DXL之通过程序修改Domino的设计
  5. 03.【Axure 10 】win系统软件汉化
  6. 关于WIN10显示“未安装任何音频输出设备” 英特尔(R)智音系统OED启动错误(代号10)解决办法
  7. C++与Python混合编程
  8. setuna截图怎么放大缩小_实用的高清截图系列小窍门详解,一章带你“真正学会”截图!...
  9. 最详细的Java入门到精通完整学习教程,学Java先收藏了!!
  10. c语言怎么编程判断关键字,C语言关键字