自定义标签

**总结:

  1. 都要使用SimpleTagSupport接口
  2. 熟悉运用IO流
  3. 重写doTag方法
  4. 不支持jsp表达式,但支持EL
  5. rtexprvalue为运行时表达式的值,它支持EL和jsp表达式

**
实例:
1、获取客户端IP地址
2、小写转大写

主页代码:

<%--
  Created by IntelliJ IDEA.
  User: 梦  溪
  Date: 2021/1/23
  Time: 14:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.zidingyi.com/one" prefix="ly"%>
<html>
<head>
    <title>副页</title>
</head>
<body>
    <%
        String name = "xia";
        pageContext.setAttribute("name",name);
    %>
    <ly:Big>${name}</ly:Big><br>
    <ly:Big>abc</ly:Big><br>
    <ly:IP/><br>
    
<%--标签属性--%>
    <%
        boolean gender = true;
        pageContext.setAttribute("gender",gender);
    %>
    <ly:if test="${gender}">男</ly:if>
    <ly:if test="${not gender}">女</ly:if>
</body>
</html>

无标签体:

package ly.net.web.Cl;


import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

/**
 * 功能:获取客户端IP地址
 * */
public class Custom_label extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
//        获取PageContext对象
        PageContext pc =(PageContext) this.getJspContext();
//        获取请求对象
        ServletRequest request = pc.getRequest();
//        获取对象IP
        String clientIP = request.getRemoteAddr();
//        获取标准输出流
        JspWriter out = pc.getOut();
//        将IP写入输出流
        out.print(clientIP);
    }
}

有标签体:

package ly.net.web.Cl;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;

public class lowerToUpperTag extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
//        创建输出流,该流可以通过toString方法获取文本
        StringWriter sw = new StringWriter();
//        获取标签体对象
        JspFragment txt = this.getJspBody();
//        将内容写入输出流
        txt.invoke(sw);
//        以文本形式获取到输出流中的内容
        String content = sw.toString();
//        小写变大写
        content = content.toUpperCase();
//        将转化为的大写内容写入到标准输出流
        this.getJspContext().getOut().print(content);
    }
}

标签属性:

package ly.net.web.Cl;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

public class IfTag extends SimpleTagSupport {
    private boolean test;

    public void setTest(boolean test) {
        this.test = test;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if(test){
//            获取标签体
            JspFragment fi = this.getJspBody();
            fi.invoke(this.getJspContext().getOut());
        }
    }
}

配置文件的代码:

<?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">

    <tlib-version>1.0</tlib-version>
    <short-name>ly</short-name>
    <uri>http://www.zidingyi.com/one</uri>

    <tag>
        <name>IP</name>
        <tag-class>ly.net.web.Cl.Custom_label</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>Big</name>
        <tag-class>ly.net.web.Cl.lowerToUpperTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
    <tag>
        <name>if</name>
        <tag-class>ly.net.web.Cl.IfTag</tag-class>
        <body-content>tagdependent</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
<!--            运行时表达式的值-->
<!--            该属性支持EL与jsp表达式-->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值