用途:在进行JSP页面显示处理的时候,有时候JSTL/Struts/Spring提供的标签库并不能知足项目中显示的需求,特别是对一些要求比较高的定制化服务中,能够使用自定义的标签库去处理。html
①:编写标签库对应的tld文件:Tag Library Descrptor Filejava
②:标签库处理类:继承TagSupport类,并用set方法设置标签的属性web
③:web.xml配置自定义的tld文件的urispring
④:JSP直接web.xml中自定义的标签库的uri引入标签库less
short-name: 标签前缀:类比C标签的c:if》cjsp
name:标签后缀名:类比C标签的c:if》ifide
tag-class:页面渲染时处理标签的工做类ui
body-content:主体内容this
attribute:标签的属性,类比input标签的name/value等属性code
<?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引擎是先处理标签体包裹的信息而后在解析处理标签体自己的信息的。