一、创建自定义JSP标签
(1) 创建标签的处理类,该类必须扩展以下俩个类之一:
javax.servlet.jsp.tagext.TagSupport
主要方法:
doStartTag 当Servlet容器遇到自定义标签的起始标志时会调用该方法,会返回整数常量,用来决定程序的后续流程,常量有俩个可选值:
- Tag.SKIP_BODY 表示标签之间的内容被忽略
- Tag.EVAL_BODY_INCLUDE表示标签之间的内容被正常执行
doEndTag 当Servlet容器遇到自定义标签的结束标志时会调用该方法,会返回整数常量,用来决定程序的后续流程,常量有俩个可选值:
- Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器
- Tag.EVAL_PAGE表示按正常的流程继续执行JSP网页
setValue(String k,Object,o)在标签处理类中设置key / value
getValue(String k)在标签处理类中根据参数key返回匹配的value
removeValue(String k)在标签处理类中删除key / value
setPageContext(PageContext pc)设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
PageContext代表Web应用中的javax.servlet.jsp.PageContext对象
setParent(Tag t)设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
getParent( )返回嵌套了当前标签的上层标签的处理类
JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext 和 setParent方法,设置pageContext和parent。
因此在doStartTag或doEndTag方法可以通过getParent方法获取上层标签的处理类;
在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext(页面上下文对象)
javax.servlet.jsp.tagext.BodyTagSupport // 父类是TagSupport
(2) 创建标签库描述文件,该文件是一个tld文件。
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <!-- a tag library descriptor --> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>mytaglib</shortname> <uri>/mytaglib</uri> //标签库uri的名字 <tag> <name>hello</name> <tagclass>com.jsp.tag.HelloTag</tagclass> <bodycontent>empty</bodycontent> </tag> <tag> <name>message</name> <tagclass>com.jsp.tag.MessageTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>key</name> <required>true</required> </attribute> </tag> </taglib>
(3) 在JSP文件中引入标签库,然后插入标签。
(4) 自定义标签属性
在标签处理类中应该将这个属性作为成员变量,并且提供GET和SET方法