jsp 自定义标签

自定义标签
1.自定义标签技术出现的原因:虽然有第三方组织提供了很多标签,但是这些都是一些通用标签,开发中常常需要根据业务需求使用jsp页面,这个时候通用的标签就不够用了,我们需要自己去开发标签库。
2.标签处理类生命周期
2.1传统标签处理类的生命周期:传统标签处理类在标签被第一次使用时创建实例,从此驻留内存为后续请求提供服务,其中每次标签执行都会依次执行setPageContext(PageContext pc) 、setParent(Tag t) 、doStartTag() 、doEndTag() 、~在服务器停止之前调用release() 
2.2简单标签的声明周期:setJspContext(JspContext pc) 、setParent(JspTag parent) 如果没有父标签就不调用、如果有属性就调用对应的setXXX方法如果有el表达式,则计算结果后传入、如果有标签体调用setJspBody(JspFragment jspBody)  、doTag() 执行标签体处理.每次访问该标签时都创建简单标签实例,每次使用后销毁该实例。




3.传统标签的继承结构:
JspTag
(1)传统标签
Tag接口-----定义了一个标签处理类应具有的最基本的方法和属性(EVAL_BODY_INCLUDE dostart方法返回表示执行标签体,SKIP_BODY dostart方法用,跳过标签体。EVAL_PAGE 
用在doendtag里通知后续页面继续执行,SKIP_PAGE doendtag里通知后续页面不再执行)
|
|----IterationTag接口 (提供了doAfterBody() 在标签体执行过后立即执行,并提供EVAL_BODY_AGAIN 供doafterbody方法返回表示要重新执行标签体)
|
|----TagSupport类(提供了对pageContext的引用)
|
|--BodyTag接口(EVAL_BODY_BUFFERED 在doStartTag方法中返回通知标签处理器去缓存标签体bodyContent)
|
|----BodyTagSupprot类 (getBodyContent() 获取缓存对象bodyContent)


(2)简单标签(简单标签的标签体不能包含脚本内容,所以tld文件中配置body-content时不能配置为JSP)
SimpleTag接口
|
|---SimpleTagSupport实现类(getJspContext() 获取代表jsp页面的pageContext,getJspBody() 代表标签体内容的JspFragment对象)

JspFragment:invoke(Writer out) 此方法一经调用会将标签体输出到对应的流中。如果你直接给一个null默认输出到pageContext.getOut()中
如果doTag()方法抛出SkipPageException异常,标签后的jsp页面就不再执行。


(3)自定义标签声明属性:在标签处理类中提供setXXX方法,并在tld文件中通过<attribute>标签声明属性的特性即可。


4.自定义标签应该具有的最基本的功能
实验1:控制jsp页面某一部分内容是否执行。<c:if>
实验2:控制整个jsp页面是否执行。
实验3:控制jsp页面内容重复执行。<c:forEach>
实验4:修改jsp页面内容输出。<c:out> HTML转义
实验5:获取属性
5.tld文件配置自定义标签
<tag>
<name>demo10</name>-----定义标签的名字
<tag-class>cn.itheima.simple.Demo10</tag-class>----标签处理类
<body-content>scriptless</body-content>----标签体内容JSP表示任意jsp内容,empty代表只能为空、scriptless带表不能包含脚本内容、tagdependent代表其中的内容是用来给服务器用的,不是输出到浏览器的内容
<attribute>
<name>times</name>---属性的名字(名字必须有)
<required>true</required>---是否是一个必须的属性
<rtexprvalue>true</rtexprvalue>---是否支持el表达式
<type>int</type>---属性的类型
</attribute>
</tag>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值