首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

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

2013-07-11 
浅谈JSP自定义标签实现过程(一) 没有正文的JSP自定义标签实现(1):定义JSP自定义标签处理类import?java.io.

浅谈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. ? ?
  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. ?} ?
  33. }?

(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. ?} ?
  77. }?

(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>?

效果图:

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

执行顺序

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则不执行此页面的其它代码。

热点排行