在自定义标签中主要有如下几种典型的标签类型:
1.不带属性和标签的简单标签
<myprefix:SomeTag/>
2.带有属性没有标签体的标签
<myprefix:SomeTag myAttribute ="test"/>
3.带有属性的标签体的标签
<myprefix:SomeTag myAttribute ="test"/>myBody</myprefix:SomeTag>
开发使用一个自定义标签需要三部
1.开发标签处理类
由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。
SimpleTag方法介绍
1.1 setJspContext方法
用于把JSP页面的pageContext对象传递给标签处理器对象
1.2 setParent方法
用于把父标签处理器对象传递给当前标签处理器对象
1.3 getParent方法
用于获得当前标签的父标签处理器对象
1.4 setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象
1.5 doTag方法
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。SimpleTagSupport类实现了SimpleTag接口
package com.sgf.Test;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo extends SimpleTagSupport{
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
2.定义标签的描述文件
描述文件是一个后缀为tld的xml文档
<?xml version="1.0" encoding="UTF-8"?>
<taglib 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-jsptaglibrary_2_0.xsd"
version="2.0">
<!--description -->
<description>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.0</tlib-version>
<tag>
<name>hello</name>
<tag-class>com.sgf.Test.SimpleTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
一个tag标记对应一个自定义标签
tld文件中有四种标签体类型 :empty JSP scriptless tagdepentend
3.在JSP页面中引用自定义标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/mytag.tld" prefix="sgf" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<sgf:hello>1</sgf:hello>
</body>
</html>
uri属性:指定标签描述文件的位置
prefix属性:指定标签的前缀