欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSP中使用简单标签自定义标签

程序员文章站 2022-06-09 09:50:02
...

目录

简介

  让标签处理器类继承于SimpleTagSupport类实现自定义标签功能。
  以下案例的标签描述默认声明在 example.tld 中,如:
example.tld

<?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">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>WM103-Example</short-name>
    <uri>/example</uri>

</taglib>

  简单标签中继承SimpleTagSupport类的doTag方法为空方法,默认不执行标签体。

使用标签控制页面逻辑的案例

开发防盗链标签

RerfererTag.java

package com.wm103.web.example;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

public class RefererTag extends SimpleTagSupport {
    private String site; // 允许访问的站点
    private String page; // 盗链时的跳转页面

    public void setSite(String site) {
        this.site = site;
    }

    public void setPage(String page) {
        this.page = page;
    }

    @Override
    public void doTag() throws JspException, IOException {
        PageContext pageContext = (PageContext) this.getJspContext();
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();

        String referer = request.getHeader("referer");
        if(referer == null || !referer.startsWith(this.site)) {
            String contextPath = request.getContextPath();
            HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
            if(this.page.startsWith(contextPath)) {
                response.sendRedirect(this.page);
            } else if(this.page.startsWith("/")) {
                response.sendRedirect(contextPath + this.page);
            } else {
                response.sendRedirect(contextPath + "/" + this.page);
            }
        }
    }
}

example.tld

<tag>
    <name>referer</name>
    <tag-class>com.wm103.web.example.RefererTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <name>site</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>page</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/example" prefix="e"%>
<e:referer site="http://localhost" page="/index.jsp"/>
<html>
<head>
    <title>使用简单标签实现防盗链</title>
</head>
<body>
    <p>我是防盗的内容!!!</p>
</body>
</html>

开发<c:if>标签

IfTag.java

package com.wm103.web.example;

import javax.servlet.jsp.JspException;
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) {
            this.getJspBody().invoke(null);
        }
    }
}

example.tld

<tag>
    <name>if</name>
    <tag-class>com.wm103.web.example.IfTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/example" prefix="e"%>
<html>
<head>
    <title>使用简单标签实现if标签</title>
</head>
<body>
    <%
        session.setAttribute("user", "DreamBoy");
    %>

    <e:if test="${user == null}">
        <p>用户未登录!</p>
    </e:if>

    <e:if test="${user != null}">
        <p>用户已登录!</p>
    </e:if>

</body>
</html>

开发<c:if><c:else>标签

3.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/example" prefix="e"%>
<html>
<head>
    <title>使用简单标签实现if else标签</title>
</head>
<body>
    <%
        session.setAttribute("user", "DreamBoy");
    %>

    <e:choose>
        <e:when test="${user == null}">
            <p>用户未登录!</p>
        </e:when>
        <e:otherwise>
            <p>用户已登录!</p>
        </e:otherwise>
    </e:choose>
</body>
</html>

ChooseTag.java

package com.wm103.web.example;

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

public class ChooseTag extends SimpleTagSupport {
    private boolean isDo;

    public boolean isDo() {
        return isDo;
    }

    public void setDo(boolean aDo) {
        isDo = aDo;
    }

    @Override
    public void doTag() throws JspException, IOException {
        this.getJspBody().invoke(null);
    }
}

WhenTag.java

package com.wm103.web.example;

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

public class WhenTag extends SimpleTagSupport {
    private boolean test;

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

    @Override
    public void doTag() throws JspException, IOException {
        ChooseTag parent = (ChooseTag) this.getParent();
        if(test && !parent.isDo()) {
            this.getJspBody().invoke(null);
            parent.setDo(true);
        }
    }
}

OtherwiseTag.java

package com.wm103.web.example;

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

public class OtherwiseTag extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        ChooseTag parent = (ChooseTag) this.getParent();
        if(!parent.isDo()) {
            this.getJspBody().invoke(null);
            parent.setDo(true);
        }
    }
}

example.tld

<tag>
    <name>choose</name>
    <tag-class>com.wm103.web.example.ChooseTag</tag-class>
    <body-content>scriptless</body-content>
</tag>
<tag>
    <name>when</name>
    <tag-class>com.wm103.web.example.WhenTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>
<tag>
    <name>otherwise</name>
    <tag-class>com.wm103.web.example.OtherwiseTag</tag-class>
    <body-content>scriptless</body-content>
</tag>

开发<c:forEach>标签

ForEachTag.java

package com.wm103.web.example;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

public class ForEachTag extends SimpleTagSupport {
    Object items;
    String var;

    public void setVar(String var) {
        this.var = var;
    }

    /*public void setItems(Object items) {
        this.items = items;
    }*/

    /*@Override
    public void doTag() throws JspException, IOException {
        List list = (List) items;
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object value = it.next();
            this.getJspContext().setAttribute(this.var, value);
            this.getJspBody().invoke(null);
        }
    }*/

    private Collection collection;

    public void setItems(Object items) {
        this.items = items;
        this.collection = new ArrayList<>();
        if(items instanceof Collection) {
            this.collection = (Collection) items;
        } else if(items instanceof Map) {
            Map map = (Map) items;
            this.collection = map.entrySet();
        } else if(items.getClass().isArray()) {
            int length = Array.getLength(items);
            for(int i = 0; i < length; i++) {
                this.collection.add(Array.get(items, i));
            }
        }
    }

    @Override
    public void doTag() throws JspException, IOException {
        Iterator it = this.collection.iterator();
        while (it.hasNext()) {
            Object value = it.next();
            this.getJspContext().setAttribute(this.var, value);
            this.getJspBody().invoke(null);
        }
    }
}

example.tld

<tag>
    <name>forEach</name>
    <tag-class>com.wm103.web.example.ForEachTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

4.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<%@ taglib uri="/example" prefix="e"%>
<html>
<head>
    <title>使用简单标签实现forEach标签</title>
</head>
<body>
    <%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        request.setAttribute("list", list);
    %>

    <e:forEach var="value" items="${list}">
        <p>${value}</p>
    </e:forEach>

    <%
        Map map = new HashMap();
        map.put("aaa", "a1");
        map.put("bbb", "b1");
        map.put("ccc", "c1");
        map.put("ddd", "d1");
        request.setAttribute("map", map);
    %>

    <e:forEach var="entry" items="${map}">
        <p>${entry.key} -- ${entry.value}</p>
    </e:forEach>

    <%
        int[] array = {1, 2, 3, 4};
        request.setAttribute("array", array);
    %>

    <e:forEach var="value" items="${array}">
        <p>${value}</p>
    </e:forEach>
</body>
</html>

使用简单标签实现html转移标签

HtmlFilter.java

package com.wm103.web.example;

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 HtmlFilterTag extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        StringWriter writer = new StringWriter();
        JspFragment jf = this.getJspBody();
        jf.invoke(writer);
        String content = writer.getBuffer().toString();
        content = filter(content); // 进行转义
        this.getJspContext().getOut().write(content);
    }

    public String filter(String message) {

        if (message == null)
            return (null);

        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuilder result = new StringBuilder(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
                case '<':
                    result.append("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '"':
                    result.append("&quot;");
                    break;
                default:
                    result.append(content[i]);
            }
        }
        return (result.toString());

    }
}

example.tld

<tag>
    <name>htmlFilter</name>
    <tag-class>com.wm103.web.example.HtmlFilterTag</tag-class>
    <body-content>scriptless</body-content>
</tag>

5.jsp

<e:htmlFilter>
    <a href="">点击链接</a>
</e:htmlFilter>

打包标签库

  • 创建Java工程,并把标签处理类复制到工程中;
  • 在Java工程中创建META-INF目录,并将标签库描述文件放置在该目录下;
  • 将Java工程导出为jar包;
  • 在Java Web工程中引入该jar包即可使用jar包中定义的标签。