简单标签简介

由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。简单标签共定义了5个方法:

  1. setJspContext方法
  2. setParent
  3. getParent方法
  4. setJspBody方法
  5. doTag方法

SimpleTag方法介绍

  • setJspContext方法

    • 用于把JSP页面的pageContext对象传递给标签处理器对象
  • setParent方法
    • 用于把父标签处理器对象传递给当前标签处理器对象
  • getParent方法
    • 用于获得当前标签的父标签处理器对象
  • setJspBody方法
    • 用于把代表标签体的JspFragment对象传递给标签处理器对象
  • doTag方法
    • 用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。

SimpleTag接口方法的执行顺序

当web容器开始执行标签时,会调用如下方法完成标签的初始化

WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。

WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。

如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。

如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。

执行标签时:

容器调用标签处理器的doTag()方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。

JspFragment类

  • javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。
  • WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
  • getJspContext方法用于返回代表调用页面的JspContext对象.
  • public abstract void invoke(java.io.Writer out)用于执行JspFragment对象所代表的JSP代码片段
  • 参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)

invoke方法详解

JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:

在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;

在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;

若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。

import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class SimpleTag extends SimpleTagSupport{@Overridepublic void doTag() throws JspException, IOException {JspFragment jf = this.getJspBody();jf.invoke(jf.getJspContext().getOut());}}

开发带属性的标签

自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。

要想让一个自定义标签具有属性,通常需要完成两个任务:

在标签处理器中编写每个属性对应的setter方法

在TLD文件中描术标签的属性

为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收JSP页面调用自定义标签时传递进来的属性值。 例如属性url,在标签处理器类中就要定义相应的setUrl(String url)方法。

在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。

在TLD中描述标签属性 attribute

元素名

是否必须指定

描      述

description

用于指定属性的描述信息。

name

用于指定属性的名称。属性名称是大小写敏感的,并且不能以jsp、_jsp、java和sun开头。

required

用于指定在JSP页面中调用自定义标签时是否必须设置这个属性。其取值包括true和false,默认值为false,true表示必须设置,否则可以设置也可以不设置该属性。

rtexprvalue

rtexprvalue是runtime expression value(运行时表达式)的英文简写,用于指定属性值是一个静态值或动态值。其取值包括true和false,默认值为false,false表示只能为该属性指定静态文本值,例如"123";true表示可以为该属性指定一个JSP动态元素,动态元素的结果作为属性值,例如JSP表达式<%=value %>。

type

用于指定属性值的Java类型。

<tag>元素的<attribute>子元素用于描述自定义

标签的一个属性,自定义标签所具有的每个属性

都要对应一个<attribute>元素 。

<attribute><description>description</description><name>aaaa</name><required>true</required><rtexprvalue>true</rtexprvalue><type>ObjectType</type></attribute>

简单标签_侯子腾的个人总结(第十二次课)相关推荐

  1. HttpServletResponse应用_侯子腾的个人总结(第四次课)

    HttpServletResponse应用 一.简介: Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. req ...

  2. mybatis sql标签_这谁顶得住?Mybatis 十八连环问

    来自:开源中国,作者:祖大俊 链接:https://my.oschina.net/zudajun/blog/747682 1.#{}和${}的区别是什么? 答:${}是Properties文件中的变量 ...

  3. maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)

    最近在整理文档时发现我收藏了一篇关于MAYA应用技巧的文章,突然有兴趣看了看,结果发现老版本MAYA中的某些内容很多已经无法应用于新版本.我又上网查了一下,结果发现网上好多帖子和我收藏的这篇内容基本一 ...

  4. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格...

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  6. 简述sd卡2.0协议_【正点原子FPGA连载】第十二章SD卡读写TXT文本实验-领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  7. 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第十二章官方SDK移植试验

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第十二章官方SDK移植试验 在上一章中, ...

  8. 统计学怎么求加权指数_暨南大学《统计学》中文习题 第十二章 统计指数

    第十二章 统计指数 (一)判断题 1. 狭义指数是指反映社会经济现象变动与差异程度的相对数.( ) 是: 否: 2. 广义上说,任何两个不同时间的同类指标的对比都可称为指数.( ) 是: 否: 3. ...

  9. Mysql——子查询(非常重要)(十二)

    文章目录 一.子查询概念 二.子查询分类 selec后面的子查询 from后面的子查询 where和having后面的子查询 exists后面(也叫做相关子查询) 三.NULL的大坑 本篇非常重要. ...

最新文章

  1. 中农王金锋组诚聘微生物组学方向博士后
  2. 理解Kubernetes(2): 应用的各种访问方式
  3. BindingException异常第一种解决办法
  4. window.event
  5. win命令安装 安装cmake_win10下VSCode+CMake+Clang+GCC环境搭建教程图解
  6. MongoDB自动备份全过程实录
  7. 面向对象基础回顾(二)
  8. int数组初始化_Java中到底有没有多维数组
  9. React学习:生命周期、过滤器、event、axios-学习笔记
  10. Qt的quit(),exit()以及close()事件捕获
  11. 蓝桥杯 省赛 python_第十一届蓝桥杯软件省级大赛第二场python3,类省赛,Python3
  12. Nginx/LVS/HAProxy负载均衡软件的优缺点详解
  13. pytorch GPU加速运算
  14. qt文件怎么设置全局变量_QT编程之——使用全局变量
  15. OmegaXYZ知识图谱应用Github仓库(长期更新)
  16. Linkedin葵花宝典
  17. 自己整理的几个免费的李炎恢php实战开发教程
  18. png为啥在html显示不出来,网页无法显示PNG图片的解决方法
  19. win7-去掉快捷方式小箭头.bat
  20. 三菱FX3U——红绿灯

热门文章

  1. IEC104 模拟器使用教程
  2. 解决Angular HttpClient设置headers后,Body体格式问题
  3. Matlab中imadjust函数的使用方法
  4. 中提琴的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. Vue项目MQTT客户端详细配置
  6. 银行总行相较分行有什么不同?
  7. 生成树协议STP PVST
  8. Ymodem传输详解
  9. 华为云服务之网络服务
  10. js 年月日时分秒 格式转换成年月日格式