开发自定义标记需要有两个组件:
1、一个是描述标记特征的标记库描述文件(TLD文件)
2、另一个是Java类,也称为标记处理器,为了完成标记的行为,JSP容器要执行标记处理器。
自定义标签实现过程:
1、写标签处理器类:TestTag.java。
2、写tld文档:用来指定标签的名字,标签库等。
3、用JSP来测试(指定标签库的位置tld,指定前缀名,使用标签)。
首先编写标签处理器类,标签处理器类需要继承javax.servlet.jsp.tagext.TagSupport或者javax.servlet.jsp.tagext.BodyTagSupport,二者区别暂时不知道,如果有高手知道,请给与指导,谢谢先。一般实现doStartTag和doEndTag方法,例如:
public class ExampleTag extends TagSupport{
public int doStartTag(){
//当处理开始标记的时候调用该方法
}
public int doEndTag(){
//当处理结束标记的时候调用该方法
}
}
doStartTag方法和doEndTag方法的返回值说明:
SKIP_BODY:跳过自定义标签间的代码, 跳过了开始和结束标签之间的代码,一般是在doStartTag中使用;
SKIP_PAGE:跳过在此之后的所有页面内容,忽略剩下的页面,一般是在doEndTag中使用;
EVAL_BODY_INCLUDE:执行自定义标签间内容,处理嵌套的标签,一般是在doStartTag中使用,由负责处理标签正文的tag接口提供 ;
EVAL_BODY_BUFFERED :对包含的内容进行解析 一般是在doStartTag中使用,由负责处理标签正文的bodyTag接口提供,目的是通知jsp容器作好读取正文的工作(创建一个body-content包装正文和获取存放操作结果的out对象,便于以后的操作和输出).
EVAL_BODY_AGAIN:再次执行自定义标签间内容,处理标签正文,嵌套标签的iteratorTag接口的使用 ;
EVAL_PAGE:执行标签后页面内容, 继续执行下面的页, 一般是在doEndTag中使用 ;
常用的返回值为:EVAL_BODY_INCLUDE。
常用的属性有pageContex。
例如:
package com.test;
import java.io.IOException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class TestAttributeTag extends BodyTagSupport {
//自定义标签支持带参数
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int doStartTag(){
try {
pageContext.getOut().print("Hello "+name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return EVAL_BODY_INCLUDE;
}
public int doEndTag(){
return EVAL_BODY_INCLUDE;
}
}
然后讨论一下TLD文档编写,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version> //标签版本
<jsp-version>1.2</jsp-version> //标签依赖jsp的版本
<short-name>zl</short-name> //默认前缀名称
<uri>http://www.test.com</uri> //指定标签库德uri
<tag>
<name>testtag</name> //标签名称
<tag-class>com.test.TestAttributeTag</tag-class> //标签处理器类
<body-content>JSP</body-content> //标签主体内容,一般选择JSP
<attribute> //标签的参数name
<name>name</name>
<required>true</required> //参数是否必须,true表示必须,false反之
<rtexprvalue>true</rtexprvalue> //是否支持EL表达式
<type>java.lang.String</type> //参数类型
<description>用户名称</description> //参数描述
</attribute>
</tag>
</taglib>
最后用jsp页面测试自定义标签,例如:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="zl" uri="http://www.test.com" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ZidingyiTag.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
<zl:testtagname="test"></zl:testtag>
</body>
</html>
例子比较简单,有什么不对地方,欢迎大家批评!
转:http://beautifulsmallsnow.blog.163.com/blog/static/280985012010122111644689/
参考:http://www.iteye.com/topic/157737