自定义标签的作用:替换JSP页面的java代码
步骤:1.标签处理类(标签是一个对象,那也就需要先有类)
2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器看到
核心配置 <tag>
<name>myTag</name>
<tag-class>com.jiangbei.tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
【注意tag-class里面的对应的类记得改!】
3.使用<%@taglib%>指定tld文件路径
例如:
标签处理类:
public class MyTag implements SimpleTag{ private PageContext pageContext; private JspFragment body; @Override public void doTag() throws JspException, IOException { // 想要向页面输出,需要out,pageContext一个顶九个,可以得到out pageContext.getOut().print("Hello World"); } @Override public JspTag getParent() { // TODO Auto-generated method stub return null; } @Override public void setJspBody(JspFragment jspBody) { this.body = jspBody; } @Override public void setJspContext(JspContext pc) { //服务器传过来给他保存起来 this.pageContext = (PageContext) pc; } @Override public void setParent(JspTag parent) { // TODO Auto-generated method stub } }
在此目录下建立tld文件
文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>itcast</short-name> <uri>http://www.itcast.cn/tags/1.0</uri> <tag> <name>myTag</name> <tag-class>com.jiangbei.tag.MyTag</tag-class> <body-content>empty</body-content> </tag> <tag> <name>myTag2</name> <tag-class>com.jiangbei.tag.MyTag2</tag-class> <body-content>empty</body-content> </tag> <tag> <name>myTag3</name> <tag-class>com.jiangbei.tag.MyTag3</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>myTag4</name> <tag-class>com.jiangbei.tag.MyTag4</tag-class> <body-content>scriptless</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
直接继承类而避免直接实现接口:
public class MyTag3 extends SimpleTagSupport{ @Override public void doTag() throws JspException, IOException { //获取流,为了执行的参数输出 Writer out = this.getJspContext().getOut(); out.write("********************<br/>"); //执行标签体内容,写到指定的流中(页面上) this.getJspBody().invoke(out); out.write("<br/>********************"); } }
标签处理类(JspFragment jsp片段,就是内容)
实现simpleTag接口:5个方法(当然不会你自己调用,tomcat帮你调用)
doTag()每次执行标签时都会调用这个方法,会在其它方法之后被tomcat调用
set/getParent 操作父标签的方法,其中get为非声明周期方法
setJspBody(JspFragment jspBody)
void setJspContext(JspContext pc)
当然,有时候实现接口是非常不方便的,于是就有了一个类给我们继承
SimpleTagSupport,已经帮我们把东西都存好了,并且提供了get方法
供子类调用
标签体内容支持的类型
empty
JSP:已经不支持!(标签体内容可以是JAVA脚本、EL表达式等)
scriptless 是EL表达式(当然普通字符串也是可以得)
第四种无用!
可以使用在标签处理类doTag()方法中throw new SkipPageException,
tomcat认识这个标签,它会进行捕获。后面的不会再执行
work目录下看真身可以看到实现究竟
可以给标签添加属性:
给标签处理类添加属性
在tld文件中对属性进行配置(都见WEB-INF下的tlds的itcast_tld)
rtexprvalue:运行时表达式值,就是可不可以是EL表达式值