`

浅谈JSP自定义标签实现过程

 
阅读更多

(一) 没有正文的JSP自定义标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.  @Override  
  11.  public int doStartTag() throws JspException {  
  12.   HttpServletRequest request;  
  13.   // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象  
  14.   request = (HttpServletRequest) pageContext.getRequest();  
  15.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd");  
  16.   String date = formater.format(new Date());  
  17.   JspWriter out = pageContext.getOut();  
  18.   try {  
  19.    out.print(date);  
  20.   } catch (IOException e) {  
  21.    e.printStackTrace();  
  22.   }  
  23.   // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。  
  24.   return Tag.SKIP_BODY;  
  25.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>displayDate</name> 
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass> 
  8.     <bodycontent>empty</bodycontent> 
  9.   </tag>           
  10. </taglib> 

(3) JSP页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate/> 
  9.   </body> 
  10. </html> 

注意:动态引用和静态引用的区别。

为了进行静态引用,首先必须将下面的项加入到web.xml 文件中:

  1. <?xml version="1.0" encoding="ISO-8859-1" ?> 
  2. <Web-app>         
  3.    <taglib> 
  4.       <taglib-uri>myTags</taglib-uri> 
  5.       <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location> 
  6.    </taglib>                 
  7. </Web-app> 

然后,将JSP 声明加入到所有需要使用自定义标记库的页面中:

  1. <%@ taglib uri="myTags" prefix="c" %> 

指定的uri 属性与在web.xml 文件中指定的taglib-uri 值相匹配。

在进行标记库的静态引用时,JSP 声明必须查询 web.xml 文件以执行库查询。这意味着如果移动或者重命名了库,或者希望在 web.xml 文件中加入更多的库,就必须停止服务器、更新 web.xml 文件、然后重新启动服务器。动态方法让JSP页直接指向 TLD 位置,因而是在解释JSP页面时进行处理。

(二)  没有正文的但带有属性的JSP自定义标签标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.    
  11.  private String pattern;  
  12.  @Override  
  13.  public int doStartTag() throws JspException {  
  14.   HttpServletRequest request;  
  15.   // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象  
  16.   request = (HttpServletRequest) pageContext.getRequest();  
  17.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);  
  18.   String date = formater.format(new Date());  
  19.   JspWriter out = pageContext.getOut();  
  20.   try {  
  21.    out.print(date);  
  22.   } catch (IOException e) {  
  23.    e.printStackTrace();  
  24.   }  
  25.   // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。  
  26.   return Tag.SKIP_BODY;  
  27.  }  
  28.    
  29.  //必须实现setXX()方法  
  30.  public void setPattern(String pattern){  
  31.   this.pattern = pattern;  
  32.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib>  
  3.    <tlibversion>1.0</tlibversion>  
  4.    <jspversion>1.1</jspversion>  
  5.   <tag>  
  6.     <name>displayDate</name>  
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>  
  8.     <bodycontent>empty</bodycontent>  
  9.     <!-- 定义属性 -->  
  10.     <attribute>  
  11.        <name>pattern</name> <!-- 属性名字 -->  
  12.        <type>String</type>  <!-- 属性类型 -->  
  13.        <requried>false</requried> <!-- 是否必须 -->  
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  -->  
  15.   </attribute>  
  16.   </tag>  
  17. </taglib> 

(3)JSP页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate pattern='yyyy-MM-dd'/> 
  9.    </br> 
  10.    <c:displayDate pattern='MM/dd HH:mm:ss'/> 
  11.   </body> 
  12. </html> 

(三) 有正文的且带有属性的JSP自定义标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.BodyContent;  
  7. import javax.servlet.jsp.tagext.BodyTagSupport;  
  8.  
  9. public class BodyTag extends BodyTagSupport {  
  10.    
  11.  private int count;  
  12.  
  13.  private HttpServletRequest reqeust;  
  14.  
  15.  private JspWriter out;  
  16.  
  17.    
  18.  public void init() {  
  19.   reqeust = (HttpServletRequest) pageContext.getRequest();  
  20.   out = pageContext.getOut();  
  21.  }  
  22.  
  23.  @Override  
  24.  public int doStartTag() throws JspException {  
  25.   init();  
  26.   return this.EVAL_BODY_INCLUDE;  
  27.  }  
  28.    
  29.  //设置当前标签体  
  30.  @Override  
  31.  public void setBodyContent(BodyContent bodyContent) {  
  32.   this.bodyContent = bodyContent;  
  33.   System.out.println("setBodyContent...");   
  34.  }  
  35.    
  36.  
  37. //需要初始化bodyContent  
  38.  @Override  
  39.  public void doInitBody() throws JspException {  
  40.   System.out.println("init.....");  
  41.  }   
  42.  
  43.  
  44.  @Override  
  45.  public int doAfterBody() throws JspException {  
  46.   if (count >= 1) {  
  47.    try {  
  48.     out.println(count);  
  49.     out.println("<Br>");  
  50.    } catch (IOException e) {  
  51.     e.printStackTrace();  
  52.    }  
  53.    count --;  
  54.    return this.EVAL_BODY_AGAIN;  
  55.   } else {  
  56.    return this.SKIP_BODY;  
  57.   }  
  58.  }  
  59.  
  60.  @Override  
  61.  public int doEndTag() throws JspException {  
  62.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(  
  63.     "yyyy-MM-dd");  
  64.   String date = formater.format(new Date());  
  65.   try {  
  66.    out.print(date);  
  67.   } catch (IOException e) {  
  68.    e.printStackTrace();  
  69.   }  
  70.   return this.EVAL_PAGE;  
  71.  }  
  72.  
  73.  // 必须实现setXX()方法  
  74.  public void setCount(int count) {  
  75.   this.count = count;  
  76.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>iterator</name> 
  7.     <tagclass>cn.com.chenlly.tag.BodyTag</tagclass> 
  8.     <bodycontent>jsp</bodycontent> 
  9.     <!-- 定义属性 --> 
  10.     <attribute> 
  11.        <name>count</name> <!-- 属性名字 --> 
  12.        <type>int</type>  <!-- 属性类型 --> 
  13.        <requried>false</requried> <!-- 是否必须 --> 
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  --> 
  15.   </attribute> 
  16.   </tag> 
  17. </taglib> 

(3) jsp 页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:iterator count="10">HelloWorld!</c:iterator> 
  9.    <%  
  10.     out.println("Bye Bye");  
  11.     %> 
  12.   </body> 
  13. </html> 

效果图:

执行顺序

doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()

如果doStartTag()返回的是EVAL_BODY_INCLUDE执行doAfterTag()方法,

如果它返回SKIP_BODY就执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在计算BodyContent时需要进行一些初始化工作,

则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法

在doAfterTag()方法中返回EVAL_BODY_AGAIN来重复执行doAfterTag()方法

返回SKIP_BODY值则执行doEndTag()方法。

在doEndTag()方法中返回EVAL_PAGE值,则执行此标签的后的其它代码,

返回SKIP_PAGE则不执行此页面的其它代码。

分享到:
评论

相关推荐

    jsp 自定义标签实例

    2. **实现标签处理类**:创建一个Java类来实现自定义标签的行为。这个类需要继承`javax.servlet.jsp.tagext.TagSupport`或实现`javax.servlet.jsp.tagext.Tag`接口。在`doStartTag()`和`doEndTag()`方法中编写处理...

    jsp权限控制,jsp自定义标签实现

    使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...

    jsp自定义标签库实现数据列表显示

    首先,`UserListTag.java` 是自定义标签的核心类,它继承了`javax.servlet.jsp.tagext.TagSupport` 或 `javax.servlet.jsp.tagext.SimpleTagSupport` 类,实现了自定义标签的功能。在这个类中,你需要定义处理标签...

    jsp 自定义标签的使用

    2. **实现标签处理类(Tag Handler)**:每个自定义标签对应一个Java类,该类需要实现`javax.servlet.jsp.tagext.Tag`或其子接口,如`SimpleTag`。在这个类中,我们可以编写处理标签逻辑的代码。 3. **在JSP页面中...

    JSP自定义标签学习笔记

    自定义标签是JSP的一种扩展,它允许开发者定义自己的标签库,实现特定的功能,这些标签可以在多个JSP页面中重复使用,提高代码复用率。 2.2 标签相关概念 自定义标签通常由三部分组成:标签处理类、TLD(Tag ...

    jsp自定义标签 jsp自定义标签

    jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签

    jsp自定义标签例子,能在Tomcat下直接运行

    2. **实现标签处理类** 标签处理类是Java类,它实现了`javax.servlet.jsp.tagext.Tag`或`javax.servlet.jsp.tagext.SimpleTag`接口。当JSP页面解析到自定义标签时,会调用这些类中的方法来执行相应的逻辑。 3. **...

    使用JSP自定义标签实现EMP分页

    在这个场景中,"使用JSP自定义标签实现EMP分页"是一个具体的应用实例,旨在提升代码的可读性和可维护性,对比传统的Servlet方法,自定义标签能让分页处理更加简洁。 首先,我们要了解JSP自定义标签的基本结构和工作...

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

    本文将深入讲解JSP自定义标签的相关概念、格式、处理过程以及创建和使用自定义标签库的基本步骤。 1. 基本概念: - **标签**:JSP标签是XML元素,用于简化JSP页面,使其更易读且支持多语言版本。标签名和属性区分...

    jsp自定义标签报错的问题

    总的来说,理解和解决`Java.lang.NoClassDefFoundError: JspException`异常需要对JSP自定义标签的工作原理、项目结构以及打包过程有深入的了解。遵循正确的项目配置和打包步骤,能够有效地避免这类问题,保证自定义...

    JSP自定义标签之自动完成框

    本篇文章将深入探讨如何在JSP中实现自定义标签,特别是创建一个自动完成框的功能。这个功能常见于许多网站的搜索栏,能根据用户输入的内容提供实时的建议。 首先,我们要理解JSP自定义标签的概念。自定义标签是JSP...

    JSP自定义标签实例与详细讲解

    在JavaServer Pages (JSP) 技术中,自定义标签是实现页面逻辑和视图分离的一种重要方式,它允许开发者创建可重用的组件,提高代码的可维护性和复用性。本教程将深入探讨JSP自定义标签的实例与详细讲解。 一、JSP...

    jsp2.0 自定义标签和自定标签函数

    它可能涵盖了从创建TLD文件,编写标签处理类,到在JSP页面上实际使用自定义标签的全过程。同时,这个文档可能会提供一些实际的例子,帮助读者理解自定义标签的工作原理。 而"test1.tld"文件则是对一个自定义标签库...

    JSP自定义标签之日期显示

    自定义标签是JSP的一种扩展,它不是Java内置的标签,而是由开发者自己定义并实现的。它们通常由三部分组成:标签库描述符(TLD)、标签处理类(Tag Handler)和标签库文档(Tag Library Documentation)。TLD是XML...

    jsp自定义标签编写的分页

    编写自定义标签时,我们需要创建一个Java类,继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,并实现必要的方法。例如,`doStartTag()`可以用来初始化分页所需的数据,...

    jsp自定义分页标签

    在JavaServer Pages (JSP) 开发中,为了提高代码的可维护性和重用性,开发者经常使用自定义标签库。本主题将深入探讨“jsp自定义分页标签”,这是一种在网页展示大量数据时非常实用的功能,它可以有效地帮助用户浏览...

    jsp自定义标签-比较强大的

    jsp、jstl自定义标签实现的分页,实现的还是比较好的,没有在request、session等范围保存过数据,在pageContext范围内保存过集合的数据, 实现的方法还是比较简单的,适用性还是比较广的,我是实在是没分了,平时也...

    jsp自定义标签大全.rar

    在JavaServer Pages (JSP) 技术中,自定义标签是实现页面逻辑和视图分离的一种重要方式,它允许开发者创建可重用的、封装的组件,提高代码的可维护性和可读性。本资源“jsp自定义标签大全.rar”提供了一套全面的JSP...

    jsp自定义标签库注意事项

    【jsp自定义标签库注意事项】 在Java服务器页面(JSP)开发中,自定义标签库是一种强大的工具,它能够帮助开发者创建可重用的代码片段,提高代码的可读性和可维护性。以下是对JSP自定义标签库的详细解释和使用注意...

    掌握jsp自定义标签chm版

    学习自定义标签的过程中,会涉及到如何创建处理程序类、编写TLD文件、在JSP页面中使用自定义标签等多个步骤。通过实际项目练习,可以更好地掌握这些技能。 9. **与其他技术的结合** 自定义标签可以与Servlet、...

Global site tag (gtag.js) - Google Analytics