(一) 没有正文的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自定义标签实现过程相关推荐

  1. css中字体下划线样式,css下划线 浅谈css自定义下划线

    使用css样式对一段文字或一段文字中其中几个文字设置虚线效果的下划线如何实现?我们知道css字体下划线使用text-decoration样式实现,而虚线下划线则不能使用此css样式属性.要实现通过下边 ...

  2. jsp自定义标签学习

    简单的说明: 1,说明---jsp自定义标签: HelloWorld:jsp自定义标签的使用流程: QueryTag:带属性标签的定义以及连接数据库使用: IteratorTag:带标签体的标签定义以 ...

  3. 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

  4. JSP自定义标签学习笔记

    http://blog.csdn.net/liangbinny/article/details/6309893 本文是本人学习<JavaWeb学习>书籍所记下的学习笔记 一.概述 JSP ...

  5. JSP自定义标签详解(1)

    JSP自定义标签 自定义JSP标签概述 自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似的 ...

  6. 浅谈eform自定义表单工具和协同办公系统

    浅谈eform自定义表单工具和协同办公系统 提起"协同办公",随便在百度或者Google搜索一下,就能让你看到眼花缭乱的信息,国内的各大协同办公软件厂商都在鼓吹着自己对协同的理解和 ...

  7. serverlet 区别_浅谈JSP serverlet的区别与联系

    jsp是html包含java servlet是java包含html jsp请求到tomcat---tomcat封装了jsp到servlet实现. 所以jsp请求时候,会自动创建session 而不用在 ...

  8. 如何使用jsp自定义标签 JspTag 使用入门

    java开发中,sturts标签和c标签就是我们常用的两种标签,本文主要教大家如何定义自己的标签,已达到代码整合,公共化的目的.通过jsp自定义标签,可以将一个元素,或者一个表格,一个div甚至整个页 ...

  9. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

最新文章

  1. cad怎么画坐标系箭头_CAD绘图中箭头太大(小)怎么调整?
  2. 通过xml 生成html页面,使用xmldom在服务器端生成静态html页面
  3. 【Linux】【服务器】 CentOS7下关机和重启命令
  4. 呃... 写满数据的硬盘是否比空硬盘重?
  5. CSS之创建等高列布局之一
  6. 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
  7. mac osx vi 设置tab 四个空格
  8. 对null值的小知识
  9. 中国超级计算机城市,“霾没”全国104个城市 华北华东多地爆表
  10. 环路供电和继电保护的含义
  11. 使用hashcat破解Windows账户密码
  12. 音频文件压缩大小如何操作?分享一个音频压缩的小技巧
  13. 国际直拨电话号码格式
  14. 微信公众号支付——预支付订单
  15. 在键盘上输入两个int型数据,比较其大小,并输出其中较小的数
  16. Java 第十五次作业
  17. r相机采集的图片转化为halcon识别的图像源码_直播系统开发:关于直播源码中美颜SDK的作用...
  18. 摸个鱼的功夫,搞懂双亲委派机制
  19. android模拟器华为账号,夜神模拟器怎么玩华为账号游戏
  20. 特斯拉 开源_开源与癌症作斗争,特斯拉采用Coreboot,Uber和Lyft发行开源机器学习...

热门文章

  1. 真实临在--摘自{《信仰在我家》}
  2. 基于QEMU的NVRAM仿真
  3. 操作系统之文件管理:1、初识文件管理
  4. linux pthread
  5. libjpeg(2)
  6. 读取pdf文件信息(pdfinfo)
  7. Python获取同目录下json文件内容
  8. 安全测试chicklist
  9. [ 转载 ] Java基础14--创建线程的两个方法
  10. hadoop运行wordcount实例,hdfs简单操作