`
小嘴冰凉
  • 浏览: 455934 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TagSupport

    博客分类:
  • jsp
阅读更多
定义最简单的标签 
自定义标签采用Default Adapter模式(缺省适配模式) 
Java代码 
//最简单的标签   
public class LangHuaTag extends TagSupport {   
    private long startTime;   
    private long endTime;   
       
    public int doStartTag() throws JspException {   
        startTime = System.currentTimeMillis();   
        //表示定制标记里面有所包括的JSP页面   
        return TagSupport.EVAL_BODY_INCLUDE;   
    }   
    public int doEndTag() throws JspException {   
        endTime = System.currentTimeMillis();   
        long elapsed = endTime - startTime;        
        try {   
            JspWriter out = pageContext.getOut();   
            out.println("runtime is "+ elapsed);   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
        //表示JSP页面继续运行   
        return TagSupport.EVAL_PAGE;   
    }   
       
}   
//代属性的标签   
public class DateTag extends TagSupport {   
    private String pattern = "yyyy-MM-dd hh:mm:ss";   
    private Date date;   
    //必须要有Set方法,因为是属性可以设值   
    public void setPattern(String pattern) {   
        this.pattern = pattern;   
    }   
       
    public void setDate(Date date) {   
        this.date = date;   
    }   
  
    public int doEndTag() throws JspException {   
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);   
        //如果没有就是当前时间   
        if(date==null){   
            date = new Date();   
        }          
        JspWriter out = pageContext.getOut();   
        try {   
            out.print(sdf.format(date));   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
        return TagSupport.EVAL_PAGE;   
    }   
}   
  
/**  
 * 循环输出  
 * @author Administrator  
 *  
 */  
public class LoopTag extends TagSupport {   
    private int times =0;   
    //Set方法设值   
    public void setTimes(int times) {   
        this.times = times;   
    }   
       
    public int doStartTag() throws JspException {   
        //表示定制标记里面有所包括的JSP页面   
        return TagSupport.EVAL_BODY_INCLUDE;   
    }   
       
    public int doAfterBody() throws JspException {   
        if(times>0){   
            times--;   
            //表示双从标签开始输入   
            return TagSupport.EVAL_BODY_AGAIN;   
        }      
        //表示结束,忽略标签内部的内容   
        return TagSupport.SKIP_BODY;   
    }   
       
}  

//最简单的标签
public class LangHuaTag extends TagSupport {
	private long startTime;
	private long endTime;
	
	public int doStartTag() throws JspException {
		startTime = System.currentTimeMillis();
		//表示定制标记里面有所包括的JSP页面
		return TagSupport.EVAL_BODY_INCLUDE;
	}
	public int doEndTag() throws JspException {
		endTime = System.currentTimeMillis();
		long elapsed = endTime - startTime;		
		try {
			JspWriter out = pageContext.getOut();
			out.println("runtime is "+ elapsed);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//表示JSP页面继续运行
		return TagSupport.EVAL_PAGE;
	}
	
}
//代属性的标签
public class DateTag extends TagSupport {
	private String pattern = "yyyy-MM-dd hh:mm:ss";
	private Date date;
	//必须要有Set方法,因为是属性可以设值
	public void setPattern(String pattern) {
		this.pattern = pattern;
	}
	
	public void setDate(Date date) {
		this.date = date;
	}

	public int doEndTag() throws JspException {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		//如果没有就是当前时间
		if(date==null){
			date = new Date();
		}		
		JspWriter out = pageContext.getOut();
		try {
			out.print(sdf.format(date));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return TagSupport.EVAL_PAGE;
	}
}

/**
 * 循环输出
 * @author Administrator
 *
 */
public class LoopTag extends TagSupport {
	private int times =0;
	//Set方法设值
	public void setTimes(int times) {
		this.times = times;
	}
	
	public int doStartTag() throws JspException {
		//表示定制标记里面有所包括的JSP页面
		return TagSupport.EVAL_BODY_INCLUDE;
	}
	
	public int doAfterBody() throws JspException {
		if(times>0){
			times--;
			//表示双从标签开始输入
			return TagSupport.EVAL_BODY_AGAIN;
		}	
		//表示结束,忽略标签内部的内容
		return TagSupport.SKIP_BODY;
	}
	
}




配置文件 
Xml代码 
<?xml version="1.0" encoding="UTF-8" ?>  
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"  
    version="2.0">  
    <tlib-version>1.0</tlib-version>  
    <short-name>util</short-name>  
    <uri>http://langhua.com/taglib/util</uri>  
    <tag>  
        <name>timer</name>  
        <tag-class>com.langhua.tagsupport.LangHuaTag</tag-class>  
        <body-content>JSP</body-content>  
        <!-- JSP,empty表示能能包函内容的,scriptless,tagdependent -->  
    </tag>  
       
    <tag>  
        <name>date</name>  
        <tag-class>com.langhua.tagsupport.DateTag</tag-class>  
        <body-content>empty</body-content>         
        <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->  
        <attribute>  
            <!-- 标签名 -->  
            <name>time</name>  
            <!-- 是否为可选属性 -->  
            <required>false</required>  
            <!-- 是否接受JSP表达示计算结果 -->  
            <rtexprvalue>true</rtexprvalue>  
        </attribute>  
        <attribute>  
            <name>pattern</name>  
            <required>true</required>  
            <rtexprvalue>false</rtexprvalue>  
        </attribute>  
    </tag>  
       
    <tag>  
        <name>loop</name>  
        <tag-class>com.langhua.tagsupport.LoopTag</tag-class>  
        <body-content>JSP</body-content>           
        <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->  
        <attribute>  
            <!-- 标签名 -->  
            <name>times</name>  
            <!-- 是否为可选属性 -->  
            <required>true</required>  
            <!-- 是否接受JSP表达示计算结果 -->  
            <rtexprvalue>true</rtexprvalue>  
        </attribute>         
    </tag>  
</taglib>  

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>util</short-name>
    <uri>http://langhua.com/taglib/util</uri>
    <tag>
        <name>timer</name>
		<tag-class>com.langhua.tagsupport.LangHuaTag</tag-class>
		<body-content>JSP</body-content>
		<!-- JSP,empty表示能能包函内容的,scriptless,tagdependent -->
    </tag>
    
    <tag>
        <name>date</name>
		<tag-class>com.langhua.tagsupport.DateTag</tag-class>
		<body-content>empty</body-content>		
		<!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->
		<attribute>
			<!-- 标签名 -->
			<name>time</name>
			<!-- 是否为可选属性 -->
			<required>false</required>
			<!-- 是否接受JSP表达示计算结果 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>pattern</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
    </tag>
    
    <tag>
        <name>loop</name>
		<tag-class>com.langhua.tagsupport.LoopTag</tag-class>
		<body-content>JSP</body-content>		
		<!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->
		<attribute>
			<!-- 标签名 -->
			<name>times</name>
			<!-- 是否为可选属性 -->
			<required>true</required>
			<!-- 是否接受JSP表达示计算结果 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>		
    </tag>
</taglib>


JSP页面 
Html代码 
<%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>  
  
<util:timer></util:timer>  
<util:loop times="3">  
    <util:date pattern="yyyy-MM-dd" /><br/>  
</util:loop>  

<%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>

<util:timer></util:timer>
<util:loop times="3">
  	<util:date pattern="yyyy-MM-dd" /><br/>
</util:loop>

TagSupport的流程图 
 
EVAL_BODY_INCLUDE 处理标记内容,并把这些内容写到输出流中doStartTag() 
SKIP_BODY 不处理标记内容doStartTag(),doAfterBody() 
EVAL_BODY_AGAIN 又重头处理doAfterBody() 
EVAL_PAGE 继续执行JSP里面的代码 doEndTag() 
SKIP_PAGE 不继续执行JSP里面的代码 doEndTag() 

[img]http://langhua9527.iteye.com/upload/attachment/77593/2ce5c561-a5ea-36d1-9082-25e62273dcb2.jpg[/img]
  • 大小: 17.5 KB
分享到:
评论
1 楼 赤道螞蟻 2010-03-05  
不在web.xml中配,你這是不是還有什麽應該注意點什麽? 要不會報:org.apache.jasper.JasperException: The absolute uri: http://langhua.com/taglib/util cannot be resolved in either web.xml or the jar files deployed with this application
  這是怎麼回事呢?

相关推荐

    JSP自定义分页标签 extends TagSupport

    JSP自定义分页标签 extends TagSupport 多种分页风格无需额外资源,使用简单易懂:WebRoot/WEB-INF/tms-tags.tld 文件路径

    利用TagSupport创建自定义标签实现网页左侧菜单

    TagSupport类是Java Servlet JSP API提供的一种基础框架,用于帮助开发者构建自定义JSP标签。本文将详细讲解如何利用TagSupport创建自定义标签来实现网页左侧菜单的功能。 1. **理解TagSupport**: TagSupport是...

    javax.servlet.jsp.tagext源码

    本篇将深入探讨`TagSupport`和`SimpleTagSupport`这两个关键类,以及它们在`javax.servlet.jsp.tagext`包中的作用。 `TagSupport`是JSP标准标签库(JSTL)的一部分,它是所有自定义标签的基础类。这个类提供了一组...

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    - `javax.servlet.jsp.tagext.TagSupport`: 标签库中的自定义标签的基础类,提供了与JSP页面交互的方法。 - `javax.servlet.jsp.HttpJspPage`: 扩展了JspPage接口,添加了对HTTP特性的支持。 4. **如何引入javax....

    jsp-api-2.1 jar 和 jsp-api-2.0 jar

    import javax.servlet.jsp.tagext.TagSupport; 所导致的无包报错解决jar包 注意导入jar包时应注意Servlet的版本,如果是Servlet 2.4 对应的应该是JSP 2.0 的jar包,如果是Servlet 2.5对应的则是JSP 2.1的jar包

    Jsp 自定义标签 分页TagSuport

    本篇文章将深入探讨JSP自定义标签的实现机制,以及`TagSupport`类在其中的作用。 ### 1. JSP自定义标签概述 JSP自定义标签提供了与HTML标签类似的语法结构,但其内部逻辑由Java代码控制。通过自定义标签,开发者...

    JSP自定义标签详解

    4. 标签处理类(Tag Handle Class):处理类是Java类,通常继承自TagSupport或实现了SimpleTag接口,负责实现自定义标签的功能。 二、自定义JSP标签的格式: 1. 使用自定义标签需要指定标签库的前缀(Prefix),前缀...

    由浅到深详细讲解JSP自定义标签

    - **扩展TagSupport**:处理标签的类需要继承`javax.servlet.jsp.TagSupport`。 - **主要属性**: - `parent`属性:表示当前标签的父标签处理类。 - `pageContext`属性:提供对PageContext对象的访问,可以...

    自定义JSP标签实用.pdf

    1. **扩展TagSupport**:处理标签的类需要继承`javax.servlet.jsp.TagSupport`,以获得对`pageContext`等资源的访问权限。 2. **主要属性**:`parent`属性存储父标签的处理类,`pageContext`属性提供对`PageContext`...

    12.taglib.doc

    `12.taglib.doc`讨论的主题是关于如何实现和使用JSP自定义标签库,特别是通过`TagSupport`类进行客户化标签的开发。\n\n### JSP标签库的作用\n\nJSP标签库允许开发者定义一套自定义的行为,这些行为可以被多个JSP...

    JSP自定义标签

    4. **标签处理类(Tag Handle Class)**:处理类是Java类,继承自`TagSupport`或实现了`SimpleTag`接口,负责实现自定义标签的具体业务逻辑。 **二、自定义JSP标签的格式** - 自定义标签的使用需要两个条件:指定...

    学习jsp自定义标签

    4. **标签处理类(Tag Handle Class)**:标签处理类是实现了自定义JSP标签功能的Java类,通常继承自`TagSupport`或实现`SimpleTag`接口。 **二、自定义JSP标签的格式** 1. **标签库指令的前缀**:前缀用于标识...

    JSP程序设计考试试题与答案-(1).docx

    知识点:Dostart 方法是 TagSupport 标签的生命周期方法之一,决定了 TagSupport 标签的可见性。EVAL_BODY_INCLUDE 是 Dostart 方法的返回值之一,表示 TagSupport 标签是可见的。 3. JavaBean 是一种特殊的 Java ...

    jsp自定义标签技术(实现原理与代码以及平台搭建步骤).docx

    1. **接口实现**:自定义标签通常需要实现`javax.servlet.jsp.tagext.Tag`接口或继承`javax.servlet.jsp.tagext.TagSupport`类。`TagSupport`是`Tag`接口的一个默认实现,提供了一些基本的功能。例如,在上面的例子...

    jsp中自定义Taglib详解

    自定义标签类是实现自定义功能的核心,它们通常需要继承`javax.servlet.jsp.tagext.SimpleTagSupport`或`TagSupport`基类。`SimpleTagSupport`适用于不关心标签生命周期的简单标签,而`TagSupport`则适用于需要处理...

    Jsp中的自定义标签由浅到深详细讲解

    4. **标签处理类(Tag Handler Class)**:标签处理类是一个Java类,继承自`javax.servlet.jsp.tagext.TagSupport`或者`javax.servlet.jsp.tagext.SimpleTag`等基类,通过实现特定的方法来定义JSP标签的行为。...

    实现一个简单的自定义标签(复习一下自定义标签的步骤)

    首先,我们需要创建一个继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`的Java类。如果你的标签只需要在开始和结束标签之间执行一次操作,那么继承`TagSupport`;如果只...

    jsp自定义标签Tag封装接口和实现方法

    为了简化开发,JSP提供了一个基类 `javax.servlet.jsp.tagext.TagSupport`,它实现了Tag接口并提供了一些默认实现。开发者通常会继承这个类来创建自定义标签,这样就不必从头实现所有Tag接口的方法。 ### 四、...

    jsp 自定义标签

    处理类通常需要继承`javax.servlet.jsp.TagSupport`或`javax.servlet.jsp.BodyTagSupport`类,并实现`doStartTag()`和`doEndTag()`等方法,以响应标签的开始和结束事件。 2. **创建标签库描述文件(TLD)**:TLD...

Global site tag (gtag.js) - Google Analytics