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 文件,然后再执 ...
随机推荐
- BZOJ 2806 【CTSC2012】 Cheat
题目链接:Cheat 话说这道题很久以前某人就给我们考过,直到现在,我终于把这个坑填上了…… 这道题要我们把一个串\(S\)划分成若干块,每块长度不小于\(L_0\),使得能够在文章库中完全匹配的块的 ...
- Phpstorm Alt+Enter 自动导入类
很方便!!!能够自动提示哪些类没有自动加载!!!然后Alt+Enter进行安装!!!
- data模块
这个模块原本应该存放Excel文件,提供utils目录下的config模块调用: 这里公司内部无法使用Excel读取数据,顾使用了ddt,其实里面就是.xslx文件
- CentOS7 64位下MySQL5.7安装与配置
安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...
- LeetCode 47
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) ...
- 数论练习(5)——青蛙的约会(扩gcd)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 122502 Accepted: 26015 Descript ...
- iOS笔记之AutoresizingMask
在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. enum { UIViewAutoresi ...
- 201621123006 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- haskell 常用 函数
在学习haskell 记录以下常用的函数 随时更新! span span :: (a -> Bool) -> [a] -> ([a], [a]) span, applied to ...
- django2 xadmin pip list
diff-match-patch 20121119Django 2.0.5django-crispy-forms 1.7.2django-formtools 2.1django-import-expo ...