用途:在进行JSP页面显示处理的时候,有时候JSTL/Struts/Spring提供的标签库并不能满足项目中显示的需求,特别是对一些要求比较高的定制化服务中,可以使用自定义的标签库去处理。
JSP自定义标签的步骤
①:编写标签库对应的tld文件:Tag Library Descrptor File
②:标签库处理类:继承TagSupport类,并用set方法设置标签的属性
③:web.xml配置自定义的tld文件的uri
④:JSP直接web.xml中自定义的标签库的uri引入标签库
tld文件:
-
short-name: 标签前缀:类比C标签的c:if》c
-
name:标签后缀名:类比C标签的c:if》if
-
tag-class:页面渲染时处理标签的工作类
-
body-content:主体内容
- jsp:接收所有的jsp语法的内容
- empty:开始和结束中间没有内容
- scriptless:接收文本、el和jsp脚本
- tagDependent:标签体内容直接写入bodyContext由自定义标签类进行处理
-
attribute:标签的属性,类比input标签的name/value等属性
- name:属性名(与标签处理类的属性(set)必须保持一致)
- required:属性的必要性
- rtexprvalue:是否支持特殊表达式:EL表达式等
<?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>
<short-name>test</short-name>
<tag>
<name>out</name>
<tag-class>com.zhiwei.tag.TagHandler</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
标签处理类:
package com.zhiwei.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/**
* jsp自定义标签处理类
* @author Yang ZhiWei
*/
public class TagHandler extends TagSupport{
private static final long serialVersionUID = 1L;
/**
* 自定义标签的属性名
*/
private String name;
/**
* set方法是必须的,用来注入jsp传过来的属性值:类似spring的注入
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* doStartTag:jsp容器在扫面到"<"时启用
*/
@Override
public int doStartTag() throws JspException {
StringBuffer results = new StringBuffer("");
System.err.println("------->doStartTag");
try {
//父类的pageContext:表示当前jsp上下文
pageContext.getOut().write(results.toString());
} catch (Exception e) {
throw new JspException("错误");
}
/**
* SKIP_BODY:跳过开始和结束之间的代码
* EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行,将body之间的信息输出到存在的输出流中
*/
return EVAL_BODY_INCLUDE;
}
/**
* doEndTag在标签在标签结尾时启用
*/
@Override
public int doEndTag() throws JspException{
System.err.println("------->doEndTag");
try {
JspWriter out = pageContext.getOut();
out.print("Hello " + name+" !");
} catch (Exception e) {
throw new JspException("错误");
}
/**
* SKIP_PAGE:忽略剩下的页面
* EVAL_PAGE:表示按照正常的流程继续执行JSP网页
*/
return EVAL_PAGE;
}
}
web.xml文件配置:
<jsp-config>
<taglib>
<taglib-uri>/tld/test</taglib-uri>
<taglib-location>
/WEB-INF/tlds/test.tld
</taglib-location>
</taglib>
</jsp-config>
自定义标签库JSP文件中应用:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="/tld/test" prefix="test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TagHandler</title>
</head>
<body>
Test Tag: <test:out name="TEST"/><br>
Test Tag: <test:out name="TEST"> AAAAAAA</test:out>
</body>
</html>
效果呈现:
分析:JSP页面正确渲染出我们的自定义标签库,值得注意的是第2个自定义标签里面包含内容:
Test Tag: <test:out name="TEST"> AAAAAAA</test:out>
JSP页面渲染的内容是Test Tag: AAAAAAAHello TEST !,这表明JSP引擎是先处理标签体包裹的信息然后在解析处理标签体本身的信息的。