package cn.com.chenlly.tag;
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;
}
}
<?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>
<%@ 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则不执行此页面的其它代码。
分享到:
相关推荐
例如前一篇博客使用简单标签来对标签体内容执行一定的次数,就无法在标签上规定要执行的次数,必须在标签处理器类中修改,很不方便,如果使用带属性的标签就能很好的解决这个问题。 要想使简单标签具有属性,通常...
java web项目一个自定义的分页标签
这个压缩文件包含了多个有关实现分页功能的JSP代码片段,以及如何集成QQ菜单和各种JSP自定义标签库的示例。这些资源对于开发动态网站和网络应用程序的开发者来说非常有用,因为它们提供了一些预构建的功能模块,可以...
自已写的一个jsp自定义分页器zoo-paging-1.0.jar,附带有源码以及例子,希望对大家有用!
书名:JSP 2.0 技术手册(电子书) 格式:PDF 出版:电子工业出版社 作者:林上杰、林康司 本书图文并茂,以丰富的实例为引导,全面介绍了主流的 Java Web 开发技术—— JSP 2.0,重点介绍Java在展示层的两项重要技术...
自定义alert 弹框 弹窗 公用的alert.jsp的页面 引用直接使用 还可根据实际需要做修改,修改系统自带的弹框样式,有alertError 和alertSuccess两种样式
详细讲解了自定义标签的用法附带有案例,有代码案例,自定义标签的类的接口的说明,还有tld文件元素的说明
3)当JSP页面执行自定义标签,遇到结束标签时将调用()方法执行处理。(选择一项) a) doStartTag() b) doEndTag() c) doInitBody() d) doAfterBody() 4) 在J2EE中,test.jsp文件中有如下一行代码...
这个是自己调试并整理过的fckeditor配置,并非网上照搬照抄的垃圾文档。包含有所有需要的包,配置... 1、要想实现上传必须用自定义标签方式引用。 2、SSH结合时上传功能失败,删除xalan.jar(这个包是读xml文件用的)
servlet类向jsp传递带泛型数组。泛型为自定义的bean
使用的技术和指南本网站使用以下技术来正常工作: JSP(带有 JSTL、EL、包含和自定义标签) JSP <c> 标签转义字符并防止 XSS(跨站点脚本) JDBC 和准备好的语句以防止 SQL 注入攻击小服务程序JavaBean (User.class)...
基于JSP邮件发送的实例,本人亲测,163邮箱中互发成功,其他的没时间测试。有兴趣的同志们可以试一下、、、 <br>环境:XP + JDK +TOMCAT6 <br>需要用到两个JAR包:mail.jar 和 activation.jar <br>这两个...
自定义商品属性,自定义商品简介魔板,自由增加一级页面数量,自由更换页面样式, 自由设定管理员权限,自由设定页面局部类型商品,在线调查,在线留言,团体购物, 自由设定友情链接和页面的关联,自由设定信息和...
支持HTTP协议,带有异步同步交互接口,可以和后台程序轻松交互; 支持XML: 通过XML和后台数据库进行绑定,设定打印属性、样式等; 内嵌支持脚本语言开发: 使开发更灵活方便; 普通报表,套打报表,...
③ “文件-新建-text”,就可以建立一个空的文本文件,保存时,这个文件自动带有扩展名".txt",也就避免了令人头疼的确认 ④ 模板设置文件名称为“template.ini”,如果和主程序同一路径,可以使用相对路径 罗嗦了...
11.4.1 展示层jsp 2+struts 2标签库实现 711 11.4.2 控制层struts 2实现 720 11.4.3 持久层hibernate 3实现 728 11.4.4 spring 2接管业务逻辑层 730 11.5 小结 733 第12章 站务必备—系统用户管理与流量统计 ...
五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 其次,创建了一个实体类 public class ...
带有网格图的 RTS 游戏的路径查找算法的 C++ 实现。 如何使用 此代码用于我的类似 RTS 的游戏中,带有自定义内部引擎。我照原样复制它,没有实现许多类,如 vec2、Array、MemoryManager 等。所以如果有人想使用它,...
Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP .1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的...
1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来...