一、新建class,用以处理tag对应的功能。该类需要继承TagSupport类。
TagSupport类简介:
1.处理标签的类必须扩展javax.servlet.jsp.TagSupport.
2.TagSupport类的主要属性:
A.parent属性:代表嵌套了当前标签的上层标签的处理类
B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象
3.JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类
中可以直接访问pageContext变量
4.在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用
setPageContext方法对pageContext进行初始化
TagSupport处理标签的方法:
1.TagSupport类提供了两个处理标签的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2.doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。一般重写该方法就行了。
A.Tag.SKIP_BODY:表示prefix:someTag…/prefix:someTag之间的内容被忽略不会显示在页面,TagSupport中就是返回该值
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行
3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag
()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被
忽。略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页
如:
public class MyTag extends TagSupport {
private String src;
public void setSrc(String src) {
this.src = src;
}
@Override
public int doStartTag() throws JspException {
try {
this.pageContext.getOut().print(src.trim()); //将值输出到页面中
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_BODY_INCLUDE;
}
}
二、创建标签库描述文件(Tag Library Descriptor):
1.标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:
A.taglib:标签库元素
B.tag:标签元素
C.attribute:标签属性元素
2.标签库元素taglib用来设定标签库的相关信息,它的常用属性有:
A.shortname: 指定Tag Library默认的前缀名(prefix)
B.uri: 设定Tag Library的惟一访问表示符
3.标签元素用来定义一个标签,它的常见属性有:
A.name:设定Tag的名字
B.tagclass:设定Tag的处理类
C.bodycontent:设定标签的主体(body)内容
1).empty:表示标签中没有body
2).JSP:表示标签的body中可以加入JSP程序代码
3).tagdependent:表示标签中的内容由标签自己去处理
4.标签属性元素attribute用来定义标签的属性,它的常见属性有:
A.name:属性名称
B.required:属性是否必需的,默认为false
C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于的表达式
如下,我设置的路径为/WEB-INF/tld/mytag.tld:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>mytag</short-name>
<tag>
<name>trim</name>
<tag-class>taglib.MyTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
</tag>
</taglib>
注意:如果<body-content>元素body为empty,则页面中标签元素中不能有body文本,否则会出现如下异常:
org.apache.jasper.JasperException: /index.jsp(52,8) According to TLD, tag mytag:trim must be empty, but is not
另如果它不为empty,要输出页面中的body内容,在类doStartTag() 方法中必须返回Tag.EVAL_BODY_INCLUDE,
dodoEndTag() 为Tag_EVAL_PAGE
三、配置web.xml
因为自定义的标签,最好在web.xml中配置下
如:
<jsp-config>
<taglib>
<taglib-uri>/mytag</taglib-uri>
<taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>
</taglib>
</jsp-config>
taglib-uri:设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray
taglib-location:指定和Tag Library对应的TLD文件的位置
四、页面使用自定义标签
1.加入% @ taglib% 指令来声明对标签库的引用。
<%@ taglib prefix="mytag" uri="/WEB-INF/tld/mytag.tld"%>
prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的taglib-uri属性保持一致
2.使用标签
desc:<mytag:trim src=" trim ">sadf</mytag:trim>
页面将输出desc:trimsadf
若toStartTag()方法返回Tag.SKIP_BODY,则sadf不会打印