<span style="font-size:14px;">用过jstl和el表达式的人都觉得这个用起来很方便,今天我要说的不是怎么用它,而是怎么自定义一个jstl标签!写一个jstl标签其实很简单,它的底层都是通过java写一个方法实现相应的功能,然后将其封装成一个jar包,需要时调用即可。</span>
我以输出格式化后的时间作为自定义jstl标签的案例来讲解具体的步骤,首先要在WEB-INF目录下建一个xxx.tld文件,我的是yctaglibs.tld文件。按照官方给出的c.tld文件写。先上代码,然后再进行讲解。
<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>yc standard tag lib</description>
<display-name>yc tag lib</display-name>
<tlib-version>1.0</tlib-version>
<short-name>yc</short-name>
<uri>http://www.hyycinfo.com/taglib/yc</uri>
<tag>
<name>time</name>
<tag-class>com.yc.web.taglibs.TimeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<!-- 属性名 -->
<name>format</name>
<!-- 是否是必填字段 -->
<required>false</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib></span>
上述代码中 第一行声明以及taglib中的参数都必须按照 官方给出的c.tld文件写,最好是复制粘提,避免出错。
description 描述
diaplay-name 展示名字
tlib-version 版本号
short-name 简名
uri 标签文件的访问路径 (重要)在jsp页面中访问时需要这个地址
<tag></tag>之间
tag-class:自定义的标签类的全称
body-content:自定义标签是否有标签体内容 (empty:没有 JSP:有)
attribute:标签的属性
接着写自定义标签的类TimeTage.java
<span style="font-size:14px;">package com.yc.web.taglibs;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class TimeTag extends TagSupport {
private String format="";
@Override
public int doStartTag() throws JspException {
Date d=new Date();
//在页面输出 (用流)
//PrintWriter out=null;
JspWriter out=null;
try {
//得到 响应对象 取出流
//out = super.pageContext.getResponse().getWriter();
//jsp标准流,按照http协议输出
out=super.pageContext.getOut();
if(format!=null && !"".equals(format)){
SimpleDateFormat sdf=new SimpleDateFormat(format);
out.write(sdf.format(d));
out.flush();
}else{
out.write(d+"");
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
//out.close();
return super.SKIP_BODY;
}
public void setFormat(String format) {
this.format = format;
}
}
</span>
在这个类中要输出就必须获取流,获取流有两种方式:第一种就是通过响应对象获得流,第二种是jsp标准流。前者在页面输出时,html标签无效,如换行不会有;而后者则不会出现这种情况,因为后是遵循http协议输出。我个人的理解就是,用前者输出时,先输出,然后才会读取其他html标签元素。这个在jsp编译成xxx.java文件中可以很容易看出,而后者在编译后的java文件中不会出现这种情况。
最后一步就是index.jsp页面了,在声明语句之后,引用自定义标签的类
<span style="font-size:14px;"><%@ taglib prefix="yc" uri="http://www.hyycinfo.com/taglib/yc"%>
</span>
第一个引用的是自定义的标签,uri就是在yctaglibs.tld定义的地址
<span style="font-size:14px;"><span style="white-space:pre"> </span><!-- 输出当前时间 -->
<yc:time />
<hr />
<yc:time format="yyyy年MM月dd日" />
<hr /></span>
写到这里,自定标签已经写完了,具体结果如下:
相信看到这里, 大家对自定义标签有了一定的了解,那么赶紧行动起来,自己写一个自定义标签!