一、自定义标签入门
1. 为什么引入标签
jsp页面作为显示的模板,应尽量使用页面标签来实现,避免写java代码
如果在jsp页面写java代码,首先会令jsp页面难以阅读,不利于页面排版,其次,作为页面美化人员有可能会看不懂java代码,如果将java代码替换成标签,那么只要是懂html标签的人都能看得懂
2. 如何实现自定义标签
移除jsp页面中的java代码其实很简单,只需要写一个java类实现Tag接口,在java类中实现jsp页面的代码,在tld标签描述文件中针对标签和java类进行映射。
案例: 实现标签显示来访者的ip
实现步骤:
1) 写一个类 IpTag 实现 Tag 接口
2) 在 WEB-INF 目录下 新建tld文件, 对标签进行描述
3)在 jsp 页面进行调用
二、传统标签
1. Tag接口
执行流程:
1)创建对象 初始化
2)调用setPageContext方法传入表示jsp页面的pageContext
3)如果有父标签调用 setParent 方法传入父标签
4)调用 setter 方法为属性赋值
5)调用 doStartTag 方法
6)执行标签体 可选
7)调用 doEndTag 方法
8)调用release方法释放资源
2. 方法的返回值
Tag.EVAL_BODY_INCLUDE 执行标签体
Tag.SKIP_BODY 跳过标签体
Tag.EVAL_PAGE 执行剩余页面
Tag.SKIP_PAGE 跳过剩余页面
3. Tag接口的子类
1) IterationTag 接口
增加doAfterBody()方法,在方法体执行完毕时被调用
增加返回值EVAL_BODY_AGAIN 用于执行再次执行标签体
实现此接口可以实现循环执行标签体
一般通过继承默认实现类TagSupport来实现该标签
2) BodyTag 接口
增加setBodyContent(BodyContent b)方法传入标签体
我们可以通过该方法获得标签体 从而对标签体进行操作
增加了常量(返回值) EVAL_BODY_BUFFERED 将标签体缓存
tag –> IterationTag --> BodyTag
4.tld文件
tld 是 taglib description 的缩写 为标签库描述文件
通过 tag元素描述一个标签
<tag>
<description>Outputs Hello, World</description>
<name>helloWorld</name>
<tag-class>cn.itcast.tag.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
其中 name用于指定标签的名称
tag-class用于指定标签对应的java类
body-content用于指定标签对之间可以输入的内容类型
empty表示空标签,即不能有标签体
JSP 标签体不为空,可以写jsp脚本
scriptless 不能写jsp脚本,但可以写表达式和el
tagdependent 将原始内容提交 忽略el表达式等运算
5.标签的属性
需要在页面标签中使用属性需完成以下步骤:
1) 在标签类中定义一个属性
2) 为属性添加 setter 方法
3) 在tld文件中对属性进行描述
实现:
<tag>元素的<attribute>子元素用于描述自定义
标签的一个属性,自定义标签所具有的每个属性
都要对应一个<attribute>元素 。
<attribute>
<description>description</description>
<name>aaaa</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>ObjectType</type>
</attribute>
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类型。 |
6. 案例
实现将标签体循环执行指定次数的标签 Loop
三、简单标签
1. 简单标签SimpleTag
由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能
我们可以通过继承 SimpleTagSupport 类来实现该接口
方法详解:
setJspContext方法
用于把JSP页面的pageContext对象传递给标签处理器对象
setParent方法
用于把父标签处理器对象传递给当前标签处理器对象
getParent方法
用于获得当前标签的父标签处理器对象
setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象
doTag方法
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。
方法的调用顺序?
2. 开发案例
开发<c:if>标签
开发<c:if><c:else>标签
choose when otherwise
开发迭代标签
foreach
开发html转义标签
打包标签库