jsp 自定义标签
1、实现Tag接口:
TagSupport类实现了Tag接口,为我们提供了4个重要的方法(见表6-5)。
1.1、 TagSupport类中的常用方法
int doStartTag():
遇到自定义标签开始时调用该方法,
其可选返回值如下。
SKIP_BODY:表示不用处理标签体,
直接调用doEndTag()方法
EVAL_BODY_INCLUDE:正常执行
标签体,但不对标签体做任何处理
int doAfterBody():
重复执行标签体内容的方法,
其可选返回值如下。SKIP_BODY:表示不用处理标签体,直接调用doEndTag()方法EVAL_BODY_AGAIN:重复执行标签体内容
int doEndTag():
遇到自定义标签结束时调用该方法,
其可选返回值如下。
SKIP_PAGE:忽略标签后面的JSP
内容,中止JSP页面执行
EVAL_PAGE:处理标签后,继
续处理JSP后面的内容
void release():
释放获得的所有资源
参考代码:
package com.rhythmk.web.tag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.management.RuntimeErrorException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/*
* 输出当前时间
* */
public class ViewTimeTag extends TagSupport {
@Override
public int doStartTag() throws JspException {
HttpServletRequest request=(HttpServletRequest) this.pageContext.getRequest();
JspWriter out=this.pageContext.getOut();
Date date=new Date();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
out.print(df.format(date));
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
return super.doStartTag();
}
}
2、创建 *.tld文件:
路径:/WebRoot/WEB-INF/rhythmk.tld
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>rhythmk</short-name>
<uri>http://www.rhythmk.com</uri>
<description>rhythmk library</description>
<tag>
<name>ViewTime</name>
<tag-class>com.rhythmk.web.tag.ViewTimeTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3、引入标记到JSP页码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.rhythmk.com" prefix="rhythmk" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP 自定义标签 </title>
</head>
<body>
当前时间为:
<rhythmk:ViewTime/>
</body>
</html>
简单标签体开发:
继承 “SimpleTagSupport” 实现 doTag 方法:
package com.rhythmk.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/*
* 简单标签
* */
public class SimpleTagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf=this.getJspBody();
/* 循环输出标签内容5次 */
for(int i=0;i<5;i++)
{
jf.invoke(null);
}
// 修改标签内容
StringWriter sw=new StringWriter();
// 获取标签内容
jf.invoke(sw);
String content= "<br/><b>"+ sw.toString()+"被修改了<b/>";
// 写入页面
this.getJspContext().getOut().write(content);
}
}
配置如下:
......
<tag>
<name>SimpleTagDemo1</name>
<tag-class>com.rhythmk.web.tag.SimpleTagDemo1</tag-class>
<body-content>scriptless</body-content>
</tag>
......
调用方法:
<%@ taglib uri="http://www.rhythmk.com" prefix="rhythmk" %>
<rhythmk:SimpleTagDemo1>
标签内容
</rhythmk:SimpleTagDemo1>
你们都是有经验的开发人员