JSP的taglib示例
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示例的更多相关文章
- JSP入门 taglib
自定义标签库(taglib),将原本需要写在jsp中的java代码封装起来,成为可复用的组件. taglib的写法和jsp动作(action)很相似,是由taglib前缀,冒号,标签名三者的组合体.其 ...
- Spring Boot gradle 集成servlet/jsp 教程及示例
1.build.gradle 配置 注意,加入了war插件,在依赖中加入了jstl.tomcat-embed-jasper,这样才能运行jsp页面. buildscript { ext { sprin ...
- jsp中<%@ taglib prefix="s" uri="/struts-tags"%>标签意思
@taglib表明引用标签.类似java中的import语句prefix="s" 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx ...
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- [置顶] JSP中使用taglib出错终极解决办法
jsp中 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c ...
- 【JSP】JSTL核心标签库的使用方法和示例
JSTL 核心标签库 JSTL 核心标签库标签共有13个,功能上分为4类: 1. 表达式控制标签:out.set.remove.catch 2. 流程控制标签:if.choose.when.other ...
- JSP指令(page include taglib)
JSP指令指示JSP转换器如何翻译JSP页面到Servlet:JSP指令用来设置整个JSP页面相关的属性,如网页编码方式.脚本语言等 JSP指令的格式: <%@ directive attrib ...
- SSM框架练习之Jsp页面使用taglib标签报错500的问题
最近在练手一个SSM的基于AdminLET框架模板的后台管理系统,使用的环境是tomcat9,使用Maven构建并通过添加Web模板框架的项目,在添加完所有的配置文件后启动tomcat运行,出现了一个 ...
- JSP入门
JSP简介 所谓JSP就是在网页文件中嵌入Java代码或JSP定义的一些标记.JSP是建立在Servlet上的,在执行时JSP容器会先将JSP文件转换成Servlet文件以及class 文件,然后再执 ...
随机推荐
- Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...
- HashMap put方法
HashMap的put方法执行过程可以通过下图来理解,自己有兴趣可以去对比源码更清楚地研究学习. ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容: ②.根据键 ...
- 树状数组 Binary Indexed Tree/Fenwick Tree
2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...
- How To Use Amazon MWS To Download Unshipped Order Reports
文章来源:http://www.samswiches.com/2011/02/how-to-use-amazon-mws-to-download-unshipped-order-reports/ ac ...
- uva10944 状态压缩bfs or DP
又是一道状压搜索,题解有的是状压DP做的目前不会日后补 写好了以后一直蜜汁WA,看别人代码把判断再次回到原点的语句写在了Q.pop()之后而不是for里,对我也是一种启发吧这样写确实有好处比如起点就是 ...
- UVA-12118 Inspector's Dilemma (欧拉回路)
题目大意:一个有v个顶点的完全图,找一条经过m条指定边的最短路径. 题目分析:当每条边仅经过一次时,路径最短.给出的边可能构成若干棵树.在一棵树中,奇点个数总为偶数,若一棵树的奇点个数为0,则这棵树可 ...
- hdu——1873(优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Java中如何读写cookie (二)
Java中删除cookie Cookie[] cookies=request.getCookies(); //cookies不为空,则清除 if(cookies!=null ...
- bzoj 1854 构图 并查集
我们可以把一件装备看成一条边,两个属性看成两个点,那么这就相当于读入了一张图 当读入每一个x,y时,我们找到两个点的祖先节点,fx,fy,我们保证祖先节点在该连通块 中编号(装备属性)最大,用flag ...
- 多线程--Thread.join方法
在Thread类的Api中,Join的作用是让当前线程等待目标线程结束之后才继续执行. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B ...