jsp 自定义标签库

自定义标签的作用

*** 自定义标签的主要用于移除jsp页面中java代码 ***

JSP页面中使用自定义的标签

使用jsp指令<% @taglib uri="标签库的uri" prefix="标签使用的前缀" %> 指令要引入使用的标签库。

自定义标签的执行流程

jsp引擎遇到自定义标签时,首先创建标签处理类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。
public void setPageContext(pageContext pc) JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面
的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
public void setParent(Tag t),setPageContext 方法执行完成后,WEB容器接着调用setParent方法将当前标签的父标签
传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null
public int doStartTag(),调用setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag 方法。
public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
public void release() 通常WEB容器执行完自定义的标签后,标签处理器会驻留在内存中,为其他请求服务,直至停止web应用,web容器才会调用release方法。

开发步骤

实现tag接口的JAVA类
     
package business.tagdemo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
​
public class DemoTag implements Tag {
​
    /** 接受传递进来的pageContext */
    private PageContext pageContext;
    
    /**WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法*/
    @Override
    public int doEndTag() throws JspException {
        System.out.println("调用doEndTag()方法");
        return 0;
    }
​
    /**调用setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag 方法*/
    @Override
    public int doStartTag() throws JspException {
        System.out.println("调用doStartTag()方法");
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
        JspWriter jw = pageContext.getOut();
        String ip = request.getRemoteAddr();
        try {
            jw.write(ip);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
​
    @Override
    public Tag getParent() {
        return null;
    }
​
    @Override
    public void release() {
        System.out.println("调用release()方法");
    }
​
    /**
     * JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信
     */
    @Override
    public void setPageContext(PageContext arg0) {
        this.pageContext=arg0;
    }
​
    @Override
    public void setParent(Tag arg0) {
        
    }
​
}

创建tld文件

elipse中的创建方法
New ----> XML ----> XML File ----> 输入xx.tld
----> Create XML file from a DTD file ----> Select XML Catalog entry
----> -//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN 
 
<?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>
<!-- taglib标签库版本号 -->
  <tlib-version>gs-1.0</tlib-version>
  <jsp-version>jsp-version</jsp-version>
  <short-name>gs</short-name>
  <!-- 
    为自定义标签库设置一个uri,uri以/开头,后面的内容可以随便写,如这里写/gs.
    在JSP页面中引用标签库的时候,需要通过uri找到标签库
    在JSP页面中就要这样引入标签库<%@ taglib uri="/gs" prefix="/gs"%>
   -->
  <uri>/gs</uri>
  <!-- 
    一个taglib中可以包含多个自定义标签,每一个标签使用一个tag标记来描述
    一个tag标记对应一个自定义标签
   -->
  <tag>
    <!-- 
        为标签类配置一个标签名,在JSP页面中使用标签时是通过标签名来找到要调用的标签处理类的
        通过aouo就能找到business.tagdemo.DemoTag类
     -->
    <name>aouo</name>
    <!-- 标签处理类 -->
    <tag-class>business.tagdemo.DemoTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

JSP中使用自定义标签库

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 使用taglib 指令引入gs标签库,标签库的前缀(prefix)可以随意设置,如这里设置成 prefix=ssgao-->
<%@ taglib uri="/gs" prefix="ssgao"%>
<!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>
    你的IP地址(使用JAVA代码输出):
    <% 
        //JSP页面中使用java代码输出IP地址
        String ip=request.getRemoteAddr();
        out.write(ip);
    %>
    <br />
    你的ip地址(使用自定义标签库输出):
    <!-- 使用是自定义标签gs -->
    <ssgao:aouo/>   
</body>
</html>
原文地址:https://www.cnblogs.com/ssgao/p/8867004.html