web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <jsp-config>
<taglib>
<taglib-uri>/WEB-INF</taglib-uri>
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>

mytag.tld

 <?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion> <tag>
<name>displayDate</name>
<tagclass>gys.DateTagNoBody</tagclass>
<bodycontent>empty</bodycontent> <!-- 标签体之间的内容要为空 -->
</tag>
<tag>
<name>displayDateTwo</name>
<tagclass>gys.DateTagAttribute</tagclass>
<bodycontent>empty</bodycontent> <!-- 标签体之间的内容要为空 -->
<!-- 定义属性 -->
<attribute>
<name>pattern</name> <!-- 属性名字 -->
<type>String</type> <!-- 属性类型 -->
<requried>false</requried> <!-- 是否必须 -->
<rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
</attribute>
</tag> <tag>
<name>iterator</name>
<tagclass>gys.BodyTag</tagclass>
<bodycontent>jsp</bodycontent>
<!-- 定义属性 -->
<attribute>
<name>count</name> <!-- 属性名字 -->
<type>int</type> <!-- 属性类型 -->
<requried>false</requried> <!-- 是否必须 -->
<rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
</attribute>
</tag> </taglib>

BodyTag.java

 package gys;

 import java.io.IOException;
import java.text.SimpleDateFormat;
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 { // 执行顺序
//
// 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则不执行此页面的其它代码。 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;//执行doAterTag()方法
} // 设置当前标签体
@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;//在doAfterBody中返回,会重复执行doAfterBody方法
} else {
return this.SKIP_BODY;//执行doEndTag
}
} @Override
public int doEndTag() throws JspException {
SimpleDateFormat formater = new 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) {
System.out.println("count........");
this.count = count;
}
}

DateTagAttributr.java

 package gys;

 import java.io.IOException;
import java.text.SimpleDateFormat;
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; public class DateTagAttribute extends TagSupport { private String pattern; @Override
public int doStartTag() throws JspException {
HttpServletRequest request;
// 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
request = (HttpServletRequest) pageContext.getRequest();
SimpleDateFormat formater = new 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;
}
}

DateTagNoBody.java

 package gys;

 import java.io.IOException;
import java.text.SimpleDateFormat;
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; public class DateTagNoBody extends TagSupport { @Override
public int doStartTag() throws JspException {
HttpServletRequest request=(HttpServletRequest)pageContext.getRequest();
SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");
String date=formater.format(new Date());
JspWriter out=pageContext.getOut();
try{
out.print(date);
}
catch(IOException e){
e.printStackTrace();
}
return Tag.SKIP_BODY;
} }

运行结果:

JSP的taglib示例的更多相关文章

  1. JSP入门 taglib

    自定义标签库(taglib),将原本需要写在jsp中的java代码封装起来,成为可复用的组件. taglib的写法和jsp动作(action)很相似,是由taglib前缀,冒号,标签名三者的组合体.其 ...

  2. Spring Boot gradle 集成servlet/jsp 教程及示例

    1.build.gradle 配置 注意,加入了war插件,在依赖中加入了jstl.tomcat-embed-jasper,这样才能运行jsp页面. buildscript { ext { sprin ...

  3. jsp中<%@ taglib prefix="s" uri="/struts-tags"%>标签意思

    @taglib表明引用标签.类似java中的import语句prefix="s" 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx ...

  4. [JSP]自定义标签库taglib

    自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...

  5. [置顶] JSP中使用taglib出错终极解决办法

    jsp中 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c ...

  6. 【JSP】JSTL核心标签库的使用方法和示例

    JSTL 核心标签库 JSTL 核心标签库标签共有13个,功能上分为4类: 1. 表达式控制标签:out.set.remove.catch 2. 流程控制标签:if.choose.when.other ...

  7. JSP指令(page include taglib)

    JSP指令指示JSP转换器如何翻译JSP页面到Servlet:JSP指令用来设置整个JSP页面相关的属性,如网页编码方式.脚本语言等 JSP指令的格式: <%@ directive attrib ...

  8. SSM框架练习之Jsp页面使用taglib标签报错500的问题

    最近在练手一个SSM的基于AdminLET框架模板的后台管理系统,使用的环境是tomcat9,使用Maven构建并通过添加Web模板框架的项目,在添加完所有的配置文件后启动tomcat运行,出现了一个 ...

  9. JSP入门

    JSP简介 所谓JSP就是在网页文件中嵌入Java代码或JSP定义的一些标记.JSP是建立在Servlet上的,在执行时JSP容器会先将JSP文件转换成Servlet文件以及class 文件,然后再执 ...

随机推荐

  1. ubuntu 14.04 (desktop amd 64) 查看配置参数

    硬盘型号 sudo hdparm -i /dev/sda |grep "Model"   硬盘数量大小 sudo fdisk -l |grep "Disk /dev/sd ...

  2. [osg][原创]osg多屏幕显示,会出现透明需要设置的问题

    同事由于新加了一个屏幕,本来用 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->s ...

  3. 如何借助 OVN 来提高 OVS 在云计算环境中的性能

    众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...

  4. nodejs使用multiparty模块实现文件上传(另附express.bodyParser()的说明)

    最近师弟师妹们在用formidable做文件上传的时候会出现form.parse()不会触发的问题,在stackoverflow也没有找到答案,反而是几个答案推荐使用multiparty来代替,因为那 ...

  5. CentOS 6.5安装和配置ngix

    一.安装配置ngix 这里用wget直接拉取并安装资源文件 首先安装必要的库(nginx 中gzip模块需要 zlib 库,rewrite模块需要 pcre 库,ssl 功能需要openssl库). ...

  6. 如果从码云上git clone项目

    1.本地找个文件夹右击选择 git base 2.输入地址 弹出一个窗口 需要输入用户名.密码(就是码云的登录名.密码) 3.完成

  7. 转:XML 中的空白字符须知:xml:space

    了解 XML 空白字符的概念并掌握如何避免与之相关的问题的技巧. 2006 年 4 月发布 很多时候,您可能都没注意到,在 XML 中所做的更改影响着您访问 XML 文档中数据的方式.例如: < ...

  8. Kafka术语解释

    前一篇文章介绍了如何使用kafka收发消息,但是对于kafka的核心概念并没有详细介绍,这里将会对包括kafka基本架构以及消费者.生产者API涉及的术语进行说明.了解这些术语有助于更深入理解kafk ...

  9. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

  10. vue-cl发布vue

    npm run dev是开发环境, npm run build是生产环境, 在开发环境完成代码和测试, 之后用生产环境生成代码, npm run build的时候, 一开始就会提示Built file ...