1.tld文件配置taglib:
<?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>对应着有很多标签<tag>每个标签都有自己的标签名name和标签对应的JavaBean类
在这个javabean类中去处理我们要用的数据,这也就解决了jsp中不能写代码的问题,把jsp中的java代码
分离到一个个的java类中,每个标签<tag>对应一个java类,在jsp页面中用标签的形式去调用java类
<前缀:name>这样就实现了把java代码分离出来了,这个过程,让我们来好好想想,既然是把java代码从jsp中
分离出来,那么标签对应的java类怎么和jsp之间进行数据的通讯呢?我们可以想到一个很重要的类,那就是pageContext
这个类中持有了jsp页面中九大隐藏对象的引用,用了这个对象,我们就可以获取jsp页面的隐藏对象,所以我们的java类中
必须有这样的一个对象,是jsp页面传递过来的,看一看我们的java类,这个java类要实现标签类的功能,就必须实现
Tag(老的方法)这个接口,然后实现其中的方法,通过实验,我们可以看到
调用:setPageContext
调用:setParent
调用:doStartTag
调用:doEndTag
这就是标签类的调用方法的次序,而setPageContext方法首先被调用,印证了我们的想法,那么我们就要设置一个成员变量
用于存下由jsp页面传递出来的pageContext对象,这样我们就可以在其他的方法中去调用我们的pageContext对象了,
比如pageContext.getOut()获得JspWriter对象,用于向我们的jsp页面输出。
-->
<taglib>
<tlib-version>7.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Time</short-name>
<tag>
<name>time</name>
<tag-class>cn.dhcool.tlb.TimeTag</tag-class>
</tag>
</taglib>
2.web.xml配置taglib:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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-app_2_5.xsd">
<display-name></display-name>
<jsp-config>
<taglib>
<taglib-uri>http://www.dhcool.cn</taglib-uri>
<taglib-location>/WEB-INF/First.tld</taglib-location>
</taglib>
</jsp-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3.tag标签类实现:
package cn.dhcool.tlb;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class TimeTag implements Tag {
private PageContext pageContext;
public void setPageContext(PageContext pc) {
this.pageContext = pc;
System.out.println("调用:setPageContext");
}
public void setParent(Tag t) {
System.out.println("调用:setParent");
}
public Tag getParent() {
System.out.println("调用:getParent");
return null;
}
@SuppressWarnings("deprecation")
public int doStartTag() throws JspException {
JspWriter out = this.pageContext.getOut();
try {
out.println(new Date().toLocaleString());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("调用:doStartTag");
return 0;
}
public int doEndTag() throws JspException {
try {
this.pageContext.getOut().println("OK!");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("调用:doEndTag");
return 0;
}
public void release() {
System.out.println("调用:release");
}
}