上一篇文章记录了怎么编写定制标记库,如果认真看的,并且动手去实现了的,想必一定会觉的很容易。同时也会有一些疑问,什么疑问呢? 我见JSP中的标记啊,EL的标记啊有的可以设定属性值,但是我们编写的这个没有属性值。别急,在这里我讲记录一下怎么编写可以自己设定属性的标记。
1.学习目标:通过这个实例,了解如何为自己编写的定制标记添加属性。
2. 首先编写标记处理类
/**
* 按照设定的日期时间格式,格式化给定的日期后输出,
* 如果没有给定日 期 时间
* 就输出当前的日期时间,如果没有给定日期时间的输出格式
* 按照yyyy-MM-dd hh:mm:ss格式输出
*/
public class DateTimeTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String pattern = "yyyy-MM-dd hh:mm:ss";
private Date date;
public void setDate(Date date){
this.date = date;
}
public void setPattern(String pattern){
this.pattern = pattern;
}
public int doEndTag() throws JspTagException{
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
if(date == null){
date = new Date();
}
JspWriter out = pageContext.getOut();
try {
out.println(sdf.format(date));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return EVAL_PAGE;
}
}
DateTimeTag类与上个实例的TimerTag类相比较,只重写了doEndTag()方法。如果标记不包含内容或者不显示标记所包含内容,就可以不用重写doStartTag() 方法。(ps:个人感觉这边可能应用了适配器模式,我没有看源代码,所以也不十分确定)。但是这里新增加了两个setter方法,分别为date和pattern两个实例赋值,这两个变量的值是通过定制标记的属性传递到类中的。
3.编写配置文件
<?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/javaeeweb-jsptablibrary_2_1.xsd"
version ="2.1" >
<tlib-version>1.0</tlib-version>
<short-name>util</short-name>
<uri>http://crazy.com/taglib/util</uri>
<display-name>utilitytags</display-name>
<description>custom web utility tags</description>
<tag>
<name>Timer</name>
<tag-class>practice.TimerTag</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>dateTime</name>
<tag-class>practice.DateTimeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>date</name>
<requried>false</requried>
<rtexprvalue>true</rtexprvalue>
<description>input date</description>
</attribute>
<attribute>
<name>pattern</name>
<requried>false</requried>
<rtexprvalue>false</rtexprvalue>
<description>date time format pattern</description>
</attribute>
</tag>
</taglib>
<body-content> empty<body-content>的值为empty,表示<util:dateTime>标记不包含内容。<required>设定这个属性是否为可选属性,false为可选,true为必选,默认值为false。<rtexprvalue>设定属性值是否接受JSP表达式的计算结果,默认为false。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="util" uri="http://crazy.com/taglib/util"%>
<html>
<head></head>
<body>
<util:Timer>
<%
for(int i =0;i<1000000;i++);
%>
</util:Timer>
<br/>
<util:dateTime/>
<br/>
<util:dateTime pattern= "yyyy年MM月 HH:mm:ss" />
<br/>
</html>
部署一下。运行即可。