- 浏览: 821476 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (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 4848import java.io.IOException; i ... -
面试题
2013-02-27 09:04 1681从1加到100(考虑减少循环次数)使用数学公式 首先要知道 ... -
单例延迟实例化
2013-01-23 08:55 12991.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双 ... -
java中重载与重写的区别
2013-01-21 10:03 905首先我们来讲讲:重载(Overloading) ( ... -
自定义标签
2012-12-15 12:58 972package com.fsti.tag; import ... -
JAXB格式化beanToXml
2012-12-14 15:03 1228context = JAXBContext.n ... -
面向对象的特征有哪些方面?
2012-12-13 09:36 979计算机软件系统是现实 ... -
java nio缓冲器
2012-12-05 17:03 3570缓冲器仅仅是一个" 多功能 " 的数组。可 ... -
面向对象三大特性一句话概括
2012-12-04 15:58 1530封装可以隐藏实现细节,使得代码模块化; 继承可以扩 ... -
Java序列化高级认识
2012-12-04 09:13 1033将 Java 对象序列化为二进制文件的 Java 序列化技术是 ... -
面向接口编程——提升系统多态性和可扩展性
2012-12-03 14:10 1239接口的本质 接口,在表面上是由几个没有主体代码的方 ... -
面向对象之多态
2012-11-23 19:22 849多态性(polymorphisn)是允许你将父对象设置成为和一 ... -
我对"秒杀"在技术性上的一些看法
2012-11-22 11:31 985秒杀,是指电子商务 ... -
项目编码
2012-11-16 13:59 1122看两个项目所用的编码是否一样 Java的乱码问题: ... -
SVN错误:Attempted to lock an already-locked dir
2012-11-07 09:08 997出现这个问题后使用“ ... -
面向对象的三个基本特征
2012-11-04 08:31 1062面向对象的三个基本特征是:封装、继承、多态。 封装 封装最 ... -
预编译防sql注入
2012-11-03 20:23 1938prepareStatement会先初始化SQL,先把这个SQ ... -
Java类与对象的初始化
2012-10-19 09:33 869Java类与对象的初始化 面试的时候,经常会遇到这样的笔试题 ... -
commons bean
2012-10-19 09:15 863这是两个javabean对象 package com.bea ... -
java工具DateUtil
2012-10-12 14:42 1015//一年内的周一 public final class Da ...
相关推荐
本文主要介绍了在 JSP 中使用自定义标签 Iterator 遍历 List,并对标签的实现过程进行了详细的解释。 标签的概念和作用 在 JSP 中,标签是一种特殊的组件,它可以根据需要执行不同的操作。自定义标签可以满足特定...
JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。
Taglib指令,其实就是定义一个标签库以及自定义标签的前缀。 比如struts中支持的标签库,html标签库、bean标签库、logic标签库。 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难...
本文以JSP页面中实现自定义标记的过程为基础,着重分析了标记处理类的处理流程和嵌套的自定义标记形式.提出了通过标记处理类可以解决嵌套的自定义标记中父标记如何完全包含子标记的问题,并以IF-ELSE-THEN形式的...
7.JSP的自定义标签:JSP的自定义标签的使用和实现 8.Servlet的过滤器:Servlet的过滤器的使用和实现 9.JSP和Servlet的安全机制:JSP和Servlet的安全机制和实现 通过学习本资源,您将掌握JSP和Servlet的基本概念和...
完整版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使用相应的自定义标签,使用更加简单。
标签库可以定义出现在JSP页面中的自定义标签,可以把特定的Java代码与每个标记关联起来。标签库的定义使用使得JSP Web应用程序变得很容易维护,从而减轻开发人员的负担。 在JSP中使用标签库技术可以使网页设计师...
* taglib指令:用于导入自定义标签库。 JSP应用开发 JSP应用开发是指使用JSP技术开发动态网页应用程序的过程。JSP应用开发需要掌握JSP基础知识和实践操作,包括如何编写JSP页面、如何使用JSP隐式对象、如何实现...
动态多文件上传(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 ...
自定义标签是一种HTML代码结构的重用,是JavaWeb开发过程中必不可少的技术。自定义标签由标签类、标签库描述文件两个部分组成,标签类负责实现功能,标签库描述文件用来声明标签和类之间的关联。在JSP2.0中,我们...
* 提高灵活性:JSP 技术提供了强大的灵活性,允许开发者自定义标签和函数。 Servlet 技术 Servlet 是一种服务器端组件,用于处理客户端的请求。Servlet 技术提供了一个强大的机制,用于处理 Web 请求和响应。 ...
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类型...