`

JSP自定义标签实现过程

    博客分类:
  • Java
 
阅读更多

本文将通过自定义标签显示日期为例,简单谈谈JSP自定义标签实现过程。包括没有正文的JSP自定义标签实现、没有正文的但带有属性的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. }
  26. }

(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. private String pattern;
  11. @Override
  12. public int doStartTag() throws JspException {
  13. HttpServletRequest request;
  14. // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
  15. request = (HttpServletRequest) pageContext.getRequest();
  16. java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);
  17. String date = formater.format(new Date());
  18. JspWriter out = pageContext.getOut();
  19. try {
  20. out.print(date);
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
  25. return Tag.SKIP_BODY;
  26. }
  27. //必须实现setXX()方法
  28. public void setPattern(String pattern){
  29. this.pattern = pattern;
  30. }
  31. }

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

(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自定义标签iterator遍历list[整理].pdf

    本文主要介绍了在 JSP 中使用自定义标签 Iterator 遍历 List,并对标签的实现过程进行了详细的解释。 标签的概念和作用 在 JSP 中,标签是一种特殊的组件,它可以根据需要执行不同的操作。自定义标签可以满足特定...

    jsp自定义标签中的困扰

    JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。

    JSP自定义标签Taglib实现过程重点总结

    Taglib指令,其实就是定义一个标签库以及自定义标签的前缀。 比如struts中支持的标签库,html标签库、bean标签库、logic标签库。 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难...

    在JSP中使用嵌套的自定义标记 (2002年)

    本文以JSP页面中实现自定义标记的过程为基础,着重分析了标记处理类的处理流程和嵌套的自定义标记形式.提出了通过标记处理类可以解决嵌套的自定义标记中父标记如何完全包含子标记的问题,并以IF-ELSE-THEN形式的...

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案

    7.JSP的自定义标签:JSP的自定义标签的使用和实现 8.Servlet的过滤器:Servlet的过滤器的使用和实现 9.JSP和Servlet的安全机制:JSP和Servlet的安全机制和实现 通过学习本资源,您将掌握JSP和Servlet的基本概念和...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...

    JSP 动态多文件上传标签库

    动态多文件上传(Dynamic Multiple File Upload)标签库v1.5 功能:实现文件的批量上传,可以对文件格式及数量的限制,可以删除不想上传的文件,在操作过程中不会上传所...另一Demo使用相应的自定义标签,使用更加简单。

    JavaWeb-标签库应用方法初探.docx

    标签库可以定义出现在JSP页面中的自定义标签,可以把特定的Java代码与每个标记关联起来。标签库的定义使用使得JSP Web应用程序变得很容易维护,从而减轻开发人员的负担。 在JSP中使用标签库技术可以使网页设计师...

    JSP应用开发-JSP基本语法与常用指令.pptx

    * taglib指令:用于导入自定义标签库。 JSP应用开发 JSP应用开发是指使用JSP技术开发动态网页应用程序的过程。JSP应用开发需要掌握JSP基础知识和实践操作,包括如何编写JSP页面、如何使用JSP隐式对象、如何实现...

    JSP 动态多文件上传标签库v1.5

    动态多文件上传(Dynamic Multiple File Upload)标签库v1.5 功能:实现文件的批量上传,可以对文件格式及数量的限制,可以删除不想上传的文件,在操作过程中不会上传所...另一Demo使用相应的自定义标签,使用更加简单。

    完整版Java web开发教程PPT课件 Java开发进阶教程 第07章 JSP语法及运行过程(共13页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...

    JSP2.0技术手册pdf(带示例源码).zip

    3-4 JSP 的执行过程 3-5 JSP 与 ASP 和 ASP+ 的比较 3-6 JSP 2.0 新功能 第四章 JSP 语法 4-1 Elements 和 Template Data 4-2 批注(Comments) 4-3 Quoting 和 Escape 规则 4-4 Directives Elements 4-5 Scripting ...

    javaEE基础知识整理.pdf

    自定义标签是一种HTML代码结构的重用,是JavaWeb开发过程中必不可少的技术。自定义标签由标签类、标签库描述文件两个部分组成,标签类负责实现功能,标签库描述文件用来声明标签和类之间的关联。在JSP2.0中,我们...

    软件毕设外文翻译.doc

    * 提高灵活性:JSP 技术提供了强大的灵活性,允许开发者自定义标签和函数。 Servlet 技术 Servlet 是一种服务器端组件,用于处理客户端的请求。Servlet 技术提供了一个强大的机制,用于处理 Web 请求和响应。 ...

    低清版 大型门户网站是这样炼成的.pdf

    7.6.2 文本新闻列表分页控制自定义标签类textnewspagetag 502 7.6.3 图片新闻列表自定义标签类picnewstag 505 7.6.4 幻灯片新闻列表自定义标签类slidenewstag 507 7.6.5 struts2与ajax完全结合实现点击数加一 510...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第17章 自定义orm框架(共11页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...

    struts2讲义_吴峻申

    5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...

Global site tag (gtag.js) - Google Analytics