通过Tag接口实现自定义标签

一、java代码,实现类

package com.want.mytag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import java.io.IOException;

/**
 * Created by want on 2016/12/9.
 */
public class MyTag implements Tag {

    private PageContext pc = null;

    private String name;
    private String value;


    public String getName() {
        System.out.println("【getName()】");
        return name;
    }

    public String getValue() {
        System.out.println("【getValue()】");
        return value;
    }


    public void setName(String name) {
        System.out.println("【setName()】name = " + name);
        this.name = name;
    }

    public void setValue(String value) {
        System.out.println("【setValue()】value = " + value);
        this.value = value;
    }

    /**
     * JSP引擎实例化标签处理器后,
     * 将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,
     * 标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
     *
     * @param pageContext
     */
    @Override
    public void setPageContext(PageContext pageContext) {
        System.out.println("【setPageContext()】pageContext = " + pageContext);
        this.pc = pageContext;
    }

    /**
     * setPageContext方法执行完后,
     * WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,
     * 如果当前标签没有父标签,
     * 则传递给setParent方法的参数值为null。
     *
     * @param tag
     */
    @Override
    public void setParent(Tag tag) {
        System.out.println("【setParent()】");
        System.out.println("【setParent()】tag = " + tag);
    }

    @Override
    public Tag getParent() {
        System.out.println("【getParent()】");
        return null;
    }

    /**
     * doStartTag(),
     * 调用了setPageContext方法和setParent方法之后,
     * WEB容器执行到自定义标签的开始标记时,
     * 就会调用标签处理器的doStartTag方法。
     *
     * @return
     * @throws JspException
     */
    @Override
    public int doStartTag() throws JspException {
        System.out.println("【doStartTag()】");
        try {
            String ip = this.pc.getRequest().getRemoteAddr();

            //向页面输出
            this.pc.getOut().write("<h4>当前IP:" + ip + "</h4>");

        } catch (IOException e) {
            e.printStackTrace();
        }

        //Eval_Body_Include -- 开始标签之后的标签体需要执行
        //Skip_Body -- 开始标签之后的标签体不需要执行

        return 5;
    }

    /**
     * WEB容器执行完自定义标签的标签体后,
     * 就会接着去执行自定义标签的结束标记,
     * 此时,WEB容器会去调用标签处理器的doEndTag方法。
     *
     * @return
     * @throws JspException
     */
    @Override
    public int doEndTag() throws JspException {
        System.out.println("【doEndTag()】");
        //EVAL_PAGE -- 结束标签之后的剩余页面需要去执行
        //SKIP_PAGE -- 结束标签之后的剩余页面不要去执行
//        int SKIP_BODY = 0;
//        int EVAL_BODY_INCLUDE = 1;
//        int SKIP_PAGE = 5;
//        int EVAL_PAGE = 6;
        String value = this.getValue();
        if (value == null) {
            throw new RuntimeException("无效的value值");
        }
        try {
            this.pc.getOut().write("<ul>");
            switch (value) {
                case "1":
                    this.pc.getOut().write("<li>" + this.getName() + "</li>");
                    break;
                case "2":
                    this.pc.getOut().write("<li>" + this.getName() + "</li>");
                    break;
                case "3":
                    this.pc.getOut().write("<li>" + this.getName() + "</li>");
                    break;
                default:
                    this.pc.getOut().write("<li>不在范围中的值</li>");
            }
            this.pc.getOut().write("</ul>");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return 6;
    }

    /**
     * 通常WEB容器执行完自定义标签后,
     * 标签处理器会驻留在内存中,
     * 为其它请求服务器,
     * 直至停止web应用时,
     * web容器才会调用release方法。
     */
    @Override
    public void release() {
        System.out.println("【release()】");
    }
}


二、.tld文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.1 U (http://www.xmlspy.com) by À¼ÌØ (LanTe) -->
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- template test -->

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>want</short-name>
    <tag>
        <name>mtag</name>
        <tag-class>com.want.mytag.MyTag</tag-class>

        <!--empty:空标记,即起始标记和结束标记之间没有内容。-->
        <body-content>empty</body-content>

        <!--JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。-->
        <!--<body-content>JSP</body-content> -->

        <!--tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,-->
        <!-- <body-content>tagdependent</body-content>-->

        <!--scriptless:接受文本、EL和JSP动作-->
        <!-- <body-content>scriptless</body-content>-->
        <attribute>
            <name>name</name>
            <required>true</required>
        </attribute>
        <attribute>
            <name>value</name>
            <required>false</required>
        </attribute>
    </tag>
</taglib>


三、jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="w" uri="/WEB-INF/mytag.tld" %>
<html>
<head>
    <title>自定义标签</title>
</head>
<body>
标签:
<w:mtag name="值为1" value="1"/><br>
<w:mtag name="值为2" value="2"/><br>
<w:mtag name="值为3" value="3"/><br>
<w:mtag name="值为4" value="4"/><br>
<%--<w:mtag name="没有value属性"/><br>--%>
</body>
</html>


四、显示效果




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值