- 浏览: 818387 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (363)
- 2010年3月 (3)
- 2010年4月 (3)
- Java (116)
- ExtJs (22)
- EJB3.0 (11)
- JQuery (28)
- SqlServer (5)
- Oracle (17)
- hibernate (21)
- struts2 (14)
- php (10)
- JavaScript (11)
- jbpm (6)
- spring (24)
- lucene (2)
- ibatis (7)
- C# (8)
- mysql (11)
- json (3)
- webservice (3)
- 设计模式 (1)
- jdbc (1)
- servlet (2)
- ice (6)
- 日常软件问题 (2)
- 生活 (2)
- iphone (1)
- rest (3)
- ruby (2)
- linux (13)
- quartz (1)
- poi (1)
- redis (13)
- memcached (4)
- nosql (2)
- tomcat调优 (1)
- 项目管理 (0)
最新评论
-
天使建站:
jquery里和数组相关的操作 附带具体的实例 ...
jquery对象数组 -
Cy0941:
$('#formId').form('submit',...) ...
easyui的form表单提交处理 -
shmily2038:
swifth 写道楼主,,你的命令写错啦,,[root@ser ...
centos直接yum安装nginx -
swifth:
楼主,,你的命令写错啦,,[root@server ~]# y ...
centos直接yum安装nginx -
随遇而安DXX:
...
REST
本文将通过自定义标签显示日期为例,简单谈谈JSP自定义标签实现过程。包括没有正文的JSP自定义标签实现、没有正文的但带有属性的JSP自定义标签标签实现等等内容。
(一) 没有正文的JSP自定义标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.Tag;
- import javax.servlet.jsp.tagext.TagSupport;
- //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag
- public class DateTagNoBody extends TagSupport {
- @Override
- public int doStartTag() throws JspException {
- HttpServletRequest request;
- // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
- request = (HttpServletRequest) pageContext.getRequest();
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd");
- String date = formater.format(new Date());
- JspWriter out = pageContext.getOut();
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
- return Tag.SKIP_BODY;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>displayDate</name>
- <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>
- <bodycontent>empty</bodycontent>
- </tag>
- </taglib>
(3) JSP页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:displayDate/>
- </body>
- </html>
注意:动态引用和静态引用的区别。
为了进行静态引用,首先必须将下面的项加入到web.xml 文件中:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <Web-app>
- <taglib>
- <taglib-uri>myTags</taglib-uri>
- <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location>
- </taglib>
- </Web-app>
然后,将JSP 声明加入到所有需要使用自定义标记库的页面中:
- <%@ taglib uri="myTags" prefix="c" %>
指定的uri 属性与在web.xml 文件中指定的taglib-uri 值相匹配。
在进行标记库的静态引用时,JSP 声明必须查询 web.xml 文件以执行库查询。这意味着如果移动或者重命名了库,或者希望在 web.xml 文件中加入更多的库,就必须停止服务器、更新 web.xml 文件、然后重新启动服务器。动态方法让JSP页直接指向 TLD 位置,因而是在解释JSP页面时进行处理。
(二) 没有正文的但带有属性的JSP自定义标签标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.Tag;
- import javax.servlet.jsp.tagext.TagSupport;
- //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag
- public class DateTagNoBody extends TagSupport {
- private String pattern;
- @Override
- public int doStartTag() throws JspException {
- HttpServletRequest request;
- // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
- request = (HttpServletRequest) pageContext.getRequest();
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);
- String date = formater.format(new Date());
- JspWriter out = pageContext.getOut();
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
- return Tag.SKIP_BODY;
- }
- //必须实现setXX()方法
- public void setPattern(String pattern){
- this.pattern = pattern;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>displayDate</name>
- <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>
- <bodycontent>empty</bodycontent>
- <!-- 定义属性 -->
- <attribute>
- <name>pattern</name> <!-- 属性名字 -->
- <type>String</type> <!-- 属性类型 -->
- <requried>false</requried> <!-- 是否必须 -->
- <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
- </attribute>
- </tag>
- </taglib>
(3)JSP页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:displayDate pattern='yyyy-MM-dd'/>
- </br>
- <c:displayDate pattern='MM/dd HH:mm:ss'/>
- </body>
- </html>
(三) 有正文的且带有属性的JSP自定义标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.BodyContent;
- import javax.servlet.jsp.tagext.BodyTagSupport;
- public class BodyTag extends BodyTagSupport {
- private int count;
- private HttpServletRequest reqeust;
- private JspWriter out;
- public void init() {
- reqeust = (HttpServletRequest) pageContext.getRequest();
- out = pageContext.getOut();
- }
- @Override
- public int doStartTag() throws JspException {
- init();
- return this.EVAL_BODY_INCLUDE;
- }
- //设置当前标签体
- @Override
- public void setBodyContent(BodyContent bodyContent) {
- this.bodyContent = bodyContent;
- System.out.println("setBodyContent...");
- }
- //需要初始化bodyContent
- @Override
- public void doInitBody() throws JspException {
- System.out.println("init.....");
- }
- @Override
- public int doAfterBody() throws JspException {
- if (count >= 1) {
- try {
- out.println(count);
- out.println("<Br>");
- } catch (IOException e) {
- e.printStackTrace();
- }
- count --;
- return this.EVAL_BODY_AGAIN;
- } else {
- return this.SKIP_BODY;
- }
- }
- @Override
- public int doEndTag() throws JspException {
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(
- "yyyy-MM-dd");
- String date = formater.format(new Date());
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return this.EVAL_PAGE;
- }
- // 必须实现setXX()方法
- public void setCount(int count) {
- this.count = count;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>iterator</name>
- <tagclass>cn.com.chenlly.tag.BodyTag</tagclass>
- <bodycontent>jsp</bodycontent>
- <!-- 定义属性 -->
- <attribute>
- <name>count</name> <!-- 属性名字 -->
- <type>int</type> <!-- 属性类型 -->
- <requried>false</requried> <!-- 是否必须 -->
- <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
- </attribute>
- </tag>
- </taglib>
(3) jsp 页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:iterator count="10">HelloWorld!</c:iterator>
- <%
- out.println("Bye Bye");
- %>
- </body>
- </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则不执行此页面的其它代码。
发表评论
-
Jackson2.x通用工具类
2014-11-03 11:38 4836import java.io.IOException; i ... -
面试题
2013-02-27 09:04 1671从1加到100(考虑减少循环次数)使用数学公式 首先要知道 ... -
单例延迟实例化
2013-01-23 08:55 12901.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双 ... -
java中重载与重写的区别
2013-01-21 10:03 893首先我们来讲讲:重载(Overloading) ( ... -
自定义标签
2012-12-15 12:58 960package com.fsti.tag; import ... -
JAXB格式化beanToXml
2012-12-14 15:03 1219context = JAXBContext.n ... -
面向对象的特征有哪些方面?
2012-12-13 09:36 968计算机软件系统是现实 ... -
java nio缓冲器
2012-12-05 17:03 3560缓冲器仅仅是一个" 多功能 " 的数组。可 ... -
面向对象三大特性一句话概括
2012-12-04 15:58 1522封装可以隐藏实现细节,使得代码模块化; 继承可以扩 ... -
Java序列化高级认识
2012-12-04 09:13 1022将 Java 对象序列化为二进制文件的 Java 序列化技术是 ... -
面向接口编程——提升系统多态性和可扩展性
2012-12-03 14:10 1227接口的本质 接口,在表面上是由几个没有主体代码的方 ... -
面向对象之多态
2012-11-23 19:22 836多态性(polymorphisn)是允许你将父对象设置成为和一 ... -
我对"秒杀"在技术性上的一些看法
2012-11-22 11:31 979秒杀,是指电子商务 ... -
项目编码
2012-11-16 13:59 1111看两个项目所用的编码是否一样 Java的乱码问题: ... -
SVN错误:Attempted to lock an already-locked dir
2012-11-07 09:08 986出现这个问题后使用“ ... -
面向对象的三个基本特征
2012-11-04 08:31 1053面向对象的三个基本特征是:封装、继承、多态。 封装 封装最 ... -
预编译防sql注入
2012-11-03 20:23 1925prepareStatement会先初始化SQL,先把这个SQ ... -
Java类与对象的初始化
2012-10-19 09:33 860Java类与对象的初始化 面试的时候,经常会遇到这样的笔试题 ... -
commons bean
2012-10-19 09:15 854这是两个javabean对象 package com.bea ... -
java工具DateUtil
2012-10-12 14:42 1003//一年内的周一 public final class Da ...
相关推荐
JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。
Taglib指令,其实就是定义一个标签库以及自定义标签的前缀。 比如struts中支持的标签库,html标签库、bean标签库、logic标签库。 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难...
本文以JSP页面中实现自定义标记的过程为基础,着重分析了标记处理类的处理流程和嵌套的自定义标记形式.提出了通过标记处理类可以解决嵌套的自定义标记中父标记如何完全包含子标记的问题,并以IF-ELSE-THEN形式的...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
动态多文件上传(Dynamic Multiple File Upload)标签库v1.5 功能:实现文件的批量上传,可以对文件格式及数量的限制,可以删除不想上传的文件,在操作过程中不会上传所...另一Demo使用相应的自定义标签,使用更加简单。
动态多文件上传(Dynamic Multiple File Upload)标签库v1.5 功能:实现文件的批量上传,可以对文件格式及数量的限制,可以删除不想上传的文件,在操作过程中不会上传所...另一Demo使用相应的自定义标签,使用更加简单。
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
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 ...
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开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
右键单击文档标签工具条,弹出菜单中选择“标签选项”,选中“用鼠标中间的按钮关闭”,这里包括鼠标的滚轮。 【8】软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 如果你使用 EditPlus 进行文本...
对于j2EE的简单web开发,其中有各种j2EE web开发过程中会使用到的技巧,如el表达式,jstl自定义标签,过滤器的使用等 通过这些来实现登录 注册 修改 删除 分页 等功能
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...