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

本文链接:https://www.cnblogs.com/xdp-gacl/p/3916946.html

        https://www.cnblogs.com/xdp-gacl/p/3916968.html

       https://www.cnblogs.com/xdp-gacl/p/3917714.html

传统标签接口中的各个方法可以返回的返回值说明:

  下图列举了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它们分别可以返回的返回值的说明。

  

在JSP API中也提供了IterationTag接口的默认实现类TagSupport、IterationTag接口的默认实现类TagSupportBodyTag接口的实现类BodyTagSupport,我们在编写自定义标签的标签处理器类时,可以继承和扩展TagSupport类、IterationSupport类和BodyTagSupport类。

开发简单标签实现页面逻辑

  1.控制jsp页面某一部分内容是否执行

    编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面是否调用jspFrament.invoke方法来控制标签是否执行。

  1. package me.gacl.web.simpletag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.PageContext;
  7. import javax.servlet.jsp.tagext.JspFragment;
  8. import javax.servlet.jsp.tagext.SimpleTagSupport;
  9.  
  10. /**
  11. * @author gacl
  12. * SimpleTagSupport类实现了SimpleTag接口,
  13. * SampleTagDemo1类继承SimpleTagSupport
  14. */
  15. public class SimpleTagDemo1 extends SimpleTagSupport {
  16.  
  17. /* 简单标签使用这个方法就可以完成所有的业务逻辑
  18. * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
  19. * 重写doTag方法,控制标签体是否执行
  20. */
  21. @Override
  22. public void doTag() throws JspException, IOException {
  23. //得到代表jsp标签体的JspFragment
  24. JspFragment jspFragment = this.getJspBody();
  25.  
  26. //得到jsp页面的的PageContext对象
  27. //PageContext pageContext = (PageContext) jspFragment.getJspContext();
  28. //调用JspWriter将标签体的内容输出到浏览器
  29. //jspFragment.invoke(pageContext.getOut());
  30.  
  31. //将标签体的内容输出到浏览器
  32. jspFragment.invoke(null);
  33.  
  34. }
  35. }

  2.控制jsp页面内容重复执行

    编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面重复调用jspFrament.invoke方法即可。

  1. package me.gacl.web.simpletag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.tagext.JspFragment;
  7. import javax.servlet.jsp.tagext.SimpleTagSupport;
  8.  
  9. /**
  10. * @author gacl
  11. * SimpleTagSupport类实现了SimpleTag接口,
  12. * SampleTagDemo2类继承SimpleTagSupport
  13. */
  14. public class SimpleTagDemo2 extends SimpleTagSupport {
  15.  
  16. /* 简单标签使用这个方法就可以完成所有的业务逻辑
  17. * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
  18. * 重写doTag方法,控制标签执行5次
  19. */
  20. @Override
  21. public void doTag() throws JspException, IOException {
  22. // 得到代表jsp标签体的JspFragment
  23. JspFragment jspFragment = this.getJspBody();
  24. for (int i = 0; i < 5; i++) {
  25. // 将标签体的内容输出到浏览器
  26. jspFragment.invoke(null);
  27. }
  28. }
  29. }

  3.修改jsp页面内容输出

    编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法调用jspFrament.invoke方法时,让执行结果写一个自定义的缓冲中即可,然后开发人员可以取出缓冲的数据修改输出。

  1. package me.gacl.web.simpletag;
  2.  
  3. import java.io.IOException;
  4. import java.io.StringWriter;
  5.  
  6. import javax.servlet.jsp.JspException;
  7. import javax.servlet.jsp.PageContext;
  8. import javax.servlet.jsp.tagext.JspFragment;
  9. import javax.servlet.jsp.tagext.SimpleTagSupport;
  10.  
  11. /**
  12. * @author gacl
  13. * SimpleTagSupport类实现了SimpleTag接口,
  14. * SampleTagDemo3类继承SimpleTagSupport
  15. */
  16. public class SimpleTagDemo3 extends SimpleTagSupport {
  17.  
  18. /* 简单标签使用这个方法就可以完成所有的业务逻辑
  19. * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
  20. * 重写doTag方法,修改标签体里面的内容,将标签体的内容转换成大写
  21. */
  22. @Override
  23. public void doTag() throws JspException, IOException {
  24. // 得到代表jsp标签体的JspFragment
  25. JspFragment jspFragment = this.getJspBody();
  26. StringWriter sw = new StringWriter();
  27. //将标签体的内容写入到sw流中
  28. jspFragment.invoke(sw);
  29. //获取sw流缓冲区的内容
  30. String content = sw.getBuffer().toString();
  31. content = content.toUpperCase();
  32. PageContext pageContext = (PageContext) this.getJspContext();
  33. //将修改后的content输出到浏览器中
  34. pageContext.getOut().write(content);
  35. }
  36. }

  4.控制整个jsp页面是否执行

    编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法抛出SkipPageException异常即可,jsp收到这个异常,将忽略标签余下jsp页面的执行。

示例代码如下:

  1. package me.gacl.web.simpletag;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.jsp.JspException;
  5. import javax.servlet.jsp.SkipPageException;
  6. import javax.servlet.jsp.tagext.SimpleTagSupport;
  7.  
  8. /**
  9. * @author gacl
  10. * SimpleTagSupport类实现了SimpleTag接口,
  11. * SampleTagDemo4类继承SimpleTagSupport
  12. */
  13. public class SimpleTagDemo4 extends SimpleTagSupport {
  14.  
  15. /* 简单标签使用这个方法就可以完成所有的业务逻辑
  16. * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
  17. * 重写doTag方法,控制标签余下的Jsp不执行
  18. */
  19. @Override
  20. public void doTag() throws JspException, IOException {
  21. //抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行
  22. throw new SkipPageException();
  23. }
  24. }

tld文件中标签体类型设置细节

  1. <tag>
  2. <!-- 标签名 -->
  3. <name>demo2</name>
  4. <!-- 标签处理器类-->
  5. <tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class>
  6. <!-- 标签体允许的内容 ,scriptless表示标签体的内容不允许是java脚本代码-->
  7. <body-content>scriptless</body-content>
  8. </tag>

  开发好一个标签后,在tld文件中使用<tag>来描述一个标签,描述的内容包括标签名(name),标签处理器类(tag-class),标签体的内容(body-content)。

  tld文件中有四种标签体(body-content)类型 :empty、scriptless、JSP、tagdependent

  empty表示该标签没有标签体

  scriptless:表示该标签是有标签体的,但是标签体的内容不能是java代码

  JSP:表示该标签是有标签体的,并且标签体的内容可以是任意的,包括java代码

  tagdependent:表示标签体里面的内容是给标签处理器类使用的(tagdependent用得比较少,了解一下即可)

简单标签标签体的细节注意问题:

   在简单标签(SampleTag)中标签体body-content的值只允许是empty、scriptless、tagdependent,不允许设置成JSP,如果设置成JSP就会出现异常:

  1. The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag

tld文件中用于描述标签属性的<attribute>元素说明

  <tag>元素的<attribute>子元素用于描述自定义标签的一个属性,自定义标签所具有的每个属性都要对应一个<attribute>元素

java类:

  1. package me.gacl.web.tag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.tagext.JspFragment;
  7. import javax.servlet.jsp.tagext.SimpleTagSupport;
  8.  
  9. public class SimpleTagDemo2 extends SimpleTagSupport{
  10.  
  11. private int count;
  12.  
  13. public void setCount(int count){
  14. this.count = count;
  15. }
  16.  
  17. @Override
  18. public void doTag() throws JspException, IOException {
  19. JspFragment jspFragment = this.getJspBody();
  20. for (int i = 1; i <= count; i++){
  21. jspFragment.invoke(null);
  22. }
  23. }
  24. }

tld代码

  1. <tag>
  2. <!-- 标签名 -->
  3. <name>demo5</name>
  4. <!-- 标签处理器类-->
  5. <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class>
  6. <!-- 标签体允许的内容-->
  7. <body-content>scriptless</body-content>
  8.  
  9. <!-- 标签的属性描述 -->
  10. <attribute>
  11. <description>描述标签的count属性</description>
  12. <!-- 标签的count属性 -->
  13. <name>count</name>
  14. <required>true</required>
  15. <!-- rtexprvalue用来指示标签的属性值是否可以是一个表达式,
  16. 一般设置为true,true就表示允许标签的属性值可以是一个表达式-->
  17. <rtexprvalue>true</rtexprvalue>
  18. </attribute>
  19. </tag>

<attribute>元素的子元素说明:

  

javaweb学习6——自定义标签的更多相关文章

  1. Web学习之自定义标签

    1.编写一个实现Tag接口的Java类(标签处理器类) package me.gacl.web.tag; import java.io.IOException; import javax.servle ...

  2. JavaWeb基础—JSP自定义标签入门

    自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器 ...

  3. Spring 源码学习(1) —— 自定义标签

    Spring 工作流程是先加载解析xml配置文件:配置文件中存在默认的标签,也可以自定义标签.解析默认标签调用: private void parseDefaultElement(Element el ...

  4. Angular 学习笔记——自定义标签

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  5. javaweb回顾第八篇如何创建自定义标签

    前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...

  6. JSP自定义标签——传统标签

    同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...

  7. JSP自定义标签就是如此简单

    tags: JSP 为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并 ...

  8. Jsp2.0自定义标签(第二天)——自定义循环标签

    今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType=&q ...

  9. Jsp2.0自定义标签(第一天)——一个简单的例子

    今天是学习自定义标签的第一天 Jsp2.0以来,自定义标签的实现比传统标签的实现容易了很多,一般只要extends类SimpleSupport重写doTag()方法即可. 先看最简单的例子,输出一个H ...

随机推荐

  1. spring-springmvc-hibernate项目小结

    1. web.xml中别忘记加入spring监听器 <listener> <listener-class>org.springframework.web.context.Con ...

  2. 【转载】MySQl 数据库插入加锁分析

    http://yeshaoting.cn/article/database/mysql%20insert%E9%94%81%E6%9C%BA%E5%88%B6/

  3. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

  4. python第七课——循环结构 while

    while循环: 2.1.有四要素组成: ①.初始化条件(执行一次)一个起始数据/起点,一般使用变量来进行存储 ②.循环条件(可能执行多次)循环合适结束全靠它,执行结果为True,那么循环继续,反之, ...

  5. 【转】[置顶] 在Android中显示GIF动画

    gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

  6. openstack镜像制作思路、指导及问题总结

    一.思路就4步:1.创建镜像文件2.用nova-compute自带的kvm,启动.iso文件,用vncviewer完成OS的安装过程3.OS安装完毕,停止虚拟机,kvm重启镜像,安装必要的软件4.后续 ...

  7. java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰

    1.abstract与static what abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用. static:用来声明静态方法,静态方 ...

  8. Python的编码注释【转】

    格式有多种,但必须有coding:[编码]或者coding=[编码],如: # -*- coding:utf-8 -*- #  coding:utf-8 # coding=utf-8 转自:https ...

  9. [NOIp2009] $Hankson$の趣味题

    \(23333\)这是最近第二份在时间上吊打\(yjk\)的代码--啊哈哈哈哈哈哈哈 嗯,其实遇到这种单纯的\(gcd \ \ or \ \ lcm\)的题,我们都可以用一种比较简单的方法分析:唯一分 ...

  10. CentOS 7中为Yum设置代理

    公司给的Linux机器,默认没给联网,然后安装Docker时流程走不下去,找IT半天没人回,然后我就自己折腾,各种配置系统代理,结果并没有成功,最后发现yum可以单独为yum设置代理,方式如下: YU ...