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. Maven简单的配置Junit测试及使用简单的mock

    1.maven依赖配置如下 <dependency> <groupId>org.mockito</groupId> <artifactId>mockit ...

  2. redis事务和脚本

    事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况. redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间.multi代表事务开 ...

  3. 【Demo】CSS3 动画 加载进度条

    实例结果图: 完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  4. 转载:几种 hive join 类型简介

    作为数据分析中经常进行的join 操作,传统DBMS 数据库已经将各种算法优化到了极致,而对于hadoop 使用的mapreduce 所进行的join 操作,去年开始也是有各种不同的算法论文出现,讨论 ...

  5. 重构 demo篇

    本文背景为学习重构一书中的一些信息的记录. 该篇以一个影片租赁为背景.通过一层层的重构,最终实现相对来说比较完美的代码. 文中经典语句摘要: “如果它没有坏,就不要动它 .” 用来形容我们工作中一些比 ...

  6. 关于apply、call和bind的总结

    基础知识不是你看了一遍书或者两篇文章就能掌握的. 之前看书看文章时,感觉自己看懂了就掌握了.呵呵!too young!too naive! 以前的坑还是要一铲一铲的填上的. 高程上面关于apply和c ...

  7. 判断设备(PC,安Android,iOS)

    //判断是不是PC function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("An ...

  8. BZOJ4644: 经典傻逼题【线段树分治】【线性基】

    Description 这是一道经典傻逼题,对经典题很熟悉的人也不要激动,希望大家不要傻逼. 考虑一张N个点的带权无向图,点的编号为1到N. 对于图中的任意一个点集 (可以为空或者全集),所有恰好有一 ...

  9. Codeforces 990B :Micro-World

    B. Micro-World time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  10. DesignPattern(五)行为型模式(上)

    行为型模式 行为型模式是对在不同对象之间划分责任和算法的抽象化.行为模式不仅仅关于类和对象,还关于它们之间的相互作用.行为型模式又分为类的行为模式和对象的行为模式两种. 类的行为模式——使用继承关系在 ...