自定义JSP标签:简单的(simple)自定义标签和传统的(classic)自定义标签
开发自定义标签需要使用javax.servlet.jsp.tagext包中的接口和类,和javax.servlet.jsp包中定义的两个异常类:JspException和JspTagException
-
JspTag接口是自定义标签跟接口,起到接口标识和类型安全的作用
-
SimpleTag接口是JspTag接口的子接口,实现简单的自定义标签
-
SimpleTagSupport类是SimpleTag接口的实现类
自定义标签的开发步骤
-
创建标签处理类:实现某个标签接口或继承某个标签类的实现类,实现SimpleTag接口
-
创建标签库描述文件,是XML格式的文件,拓展名一般为.tld一般放在WEB-INF目录或其子目录下;
TLD文件的根元素是,子元素定义标签的URI;元素定义一个标签,包含标签名,标签处理类的完整名称,标签体类型 -
在JSP页面中使用标签
通过taglib指令声明自定义标签的前缀和标签库的URI:
<% @ taglib (标签的前缀)prefix="" uri="" %>
SimpleTag接口定义了五个方法
public void setJspContext(JspContext pc)
: 该方法由容器调用,用来设置JspContext对象,使其在标签处理类中可用,
容器为该方法传递了一个JspContext类的实例,称为JSP上下文对象,可将对象保存到一个实例变量中
javax.servlet.jsp.JasContext类定义了允许标签处理类访问JSP页面作用域中的属性的方法,例如setAttribute(),getAttribute(),removeAttribute(),findAttribute()等,还提供getOut()返回JspWriter对象向JSP输出信息public void setParent(JspTag parent)
: 由容器调用,设置父标签对象 标签可以相互嵌套,外层为父标签,内层为子标签。若标签为嵌套的,容器调用setParent()设置标签的父标签对象
setParent()返回一个JspTag对象,返回的父标签实现SimpleTag,Tag,IteraTag或BodyTag等接口的对象public void setJspBody(JspFragment jspBody);
若标签带标签体,容器调用该方法将标签体内容放到JspFragment中,设置标签体public JspTag getParent()
返回当前标签的父标签public void doTag() throws JspException,IOException
简单标签的核心方法,由容器调用完成简单标签的操作
SimpleTagSupport是SimpleTag接口的实现类,提供了三个方法
protected JspContext getJspContext()
返回标签中要处理的JspContext对象protected JspFragment getJspBody()
返回JSPFrame对象,存放了标签体的内容public static final JspTag findAncestorWithClass(JspTag from,Class klass)
根据给定的实例和类型查找最接近的实例
TLD文件
<uri>
元素
<uri>
元素指定在JSP页面中使用taglib指令是uri属性的值。例如
<uri>http://www.mydomain.com/sample</uri>
则在JSP页面中taglib指令如下
<% @ taglib prefix="demo" uri="http://www.mydomain.com/sample" %>
在DD文件中定义URI
在JSP2.0之前必须在DD文件(web.xml)中为URI指定其TLE文件的位置,容器会查找web.xml文件的<taglib>元素,建立URI与TLD之间的映射
<jsp-config>
<taglib>
<taglib-uri>http://www.mydomain.com/sample</taglib-uri>
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</jsp-config>
<body-content>
元素
三个值
- empty标识标签不带标签体,不可指定标签体,起始标签和结束标签之间的空格和换行都认为是指定了标签体
- scriptless表示标签体中不能包含JSP脚本元素(JSP声明<%!>,表达式<%=>,小教本<%>
- tagdependent表示容器不会执行标签体,是在请求是传递给标签处理类,由标签处理类根据需要决定处理标签体