`
哈达f
  • 浏览: 114827 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

TagLib调用过程分析

    博客分类:
  • jsp
阅读更多

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");
	}

}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics