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

2023-05-16

目录

  • 目录
  • 简介
  • 使用标签控制页面逻辑的案例
    • 开发防盗链标签
    • 开发cif标签
    • 开发cifcelse标签
    • 开发cforEach标签
    • 使用简单标签实现html转移标签
  • 打包标签库

简介

  让标签处理器类继承于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包中定义的标签。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP中使用简单标签自定义标签 的相关文章

  • 发送&查询字符串

    从first jsp 我将一些参数发送到result jsp 如下所示 a href Show Items a 这里 item itemName 可以有类似的值 食品和文具 当项目名称包含 时 我无法在结果页面上获取整个值 仅打印它 foo
  • JSP编译时'tmpFile.renameTo(classFile) failed'的原因

    最近 我开始在 JBOss 4 0 5 JSP 应用程序中遇到奇怪的行为 JSP 编译在第一次 第二次 第三次 尝试时失败 但出现异常 17 24 29 909 ERROR jsp Servlet service for servlet j
  • 如何在JSP中打印当前日期?

    我想做这样的事情 但随后在一个 jsp文件 一切教程 http www kodejava org examples 21 html我看到需要在某处建立一个类 我们正在运行 appFuse 和 Tapestry 当然 其中之一 如果不是 Ja
  • 来自 jsp:include 的 JSF 1.2 自定义组件

    在开始回答我的问题之前 我先说一下我的不幸的局限性 我使用的是 JSF 1 2 而不是 2 所以没有复合组件 我使用 JSP 代替 Facelets 进行渲染 所以这些复合组件也没有 我不允许使用任何第三方标签库 richFaces ice
  • 如何重定向到WEB-INF文件夹中的JSP

    我有一个带有 NAV 的 jsp 其中还包含 UL 和以下元素 如下面的代码所示
  • 我们可以在displaytag中使用rowspan和colspan吗?

    我必须创建一个表 其结构是这样的 col1 col2 col3 col4 col3 1 col3 2 是否可以使用显示标签创建这样的数据网格 查看装饰器示例 http displaytag sourceforge net 1 2 tut d
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 在 JSP 中从 JavaScript/jQuery 调用后端 Java 方法

    我有一个 JSP 其中有一个select包含实体种类名称的列表 当我选择一个实体类型时 我需要填充另一个实体类型select包含所选实体类型的字段名称的列表 为此 我调用了一个 JavaScript 函数onchange event 在 J
  • java中import和class.forName的区别

    import 和 class forName 都会加载类文件 当我在jsp文件中做一个导入mysql数据的例子时 需要通过class forName导入驱动类 当我通过import语句导入jdbc驱动程序时 它无法从tomcat服务器中的m
  • JSP中如何在两个变量之间插入空格? [复制]

    这个问题在这里已经有答案了 我在 JSP 页面上的表单中有一行 html 如下所示
  • 如何在 JSP 编辑器中激活 javascript 的语法着色 - Eclipse

    在某些情况下 javascript 确实必须位于 JSP 页面中 而不是位于单独的文件中 有些框架还使用Javascript做一些事情 以便用户将其包含到JSP标签中 这样JS就不会出现在
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • Web 服务器和 servlet 容器之间的区别

    Web 服务器 和 Servlet 容器 有什么区别 一般来说 所有 Web 服务器也是 Servlet Web 容器 反之亦然吗 我一直在使用 Apache Tomcat for JSP 和 Apache for PHP 但无法弄清楚这两
  • 使用 Servlet 3.0 上传文件时 request.getParameter() 是否仍然有效?

    我刚刚读过这个很好的答案 https stackoverflow com questions 2422468 how to upload files in jsp servlet 2424824 2424824来自 BalusC 关于如何使
  • JSP:无法弄清楚如何为 GlassFish 3.1.2 响应设置 UTF-8

    我正在使用 GlassFish 3 1 2 每当访问 JSP 页面时都会看到以下警告 PWC4011 无法将请求字符编码设置为UTF 8 context myapp 因为请求参数已经被读取 或者 ServletRequest getRead
  • 如何将 JavaScript 库包含到 Spring MVC 项目中(例如 jQuery 或 Dojo)

    我在这里阅读了超过 5 个相关主题 但无法找到答案 分步说明 到目前为止 我已经有了 STS Spring MVC 模板结构并尝试将jquery js在我的项目中的某个地方 不幸的是 没有人说它应该在哪里 那么 请说 将 jquery js
  • 如何在JSP中显示对象的数据

    我已通过注册表将一些用户详细信息存储到数据库 hibernate 和 spring 中 我想在单独的 JSP 页面中显示所有用户的用户详细信息 有人可以告诉我该怎么做吗 下面是我的控制器代码 Controller public class
  • 仅当 css 文件存在时才将其包含在 jsp 中

    我正在尝试使用默认 css 设计一个应用程序 我想要一个选项 我可以包含新的 css 自定义 文件来更改默认皮肤 我可以通过在 jsp 页面中引用 自定义和默认 css 来实现此目的 其中默认值将始终存在 并且可以为不同用户加载自定义 cs
  • 文件上传处理程序

    这是文件上传处理程序的代码 这在我的服务器上工作正常 但上传文件后仅显示文件上传成功但我还想显示上传的文件的名称 import java io File import java io IOException import java util
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻

随机推荐

  • Node中的Connect

    来自对 了不起的Node js 一书的学习 Connect Node js为常规的网络应用提供了基本的API 然而 xff0c 实际情况下 xff0c 绝大部分网络应用都需要完成一系列类似的操作 xff0c 这些类似的操作你一定不想每次都重
  • Node中的Connect——常用中间件

    接下来介绍一个Connect内置的一些中间件 xff1a static中间件 1 挂载 static允许将任意一个URL匹配到文件系统中任意一个目录 如 xff1a 将 my images URL和名为 images的目录对应起来 xff0
  • Flask-apscheduler 无法启动工作,报错Run time of job was missed by... 解决方法

    先说结论 xff1a flask apscheduler 中如果要调用 app context环境的话 xff0c 用 scheduler app app context 详细过程 xff1a 1 环境与背景 xff0c 使用Flask 还
  • Node.js中同步函数异步编程

    转载自 xff1a nodejs 代码设计模式1 xff1a 同步函数变异步 同步函数变异步 1 问题 xff1a 1 1 碰到需要调用你刚正在创建的对像 span class hljs function span class hljs k
  • 深入理解Express.js

    转载自 xff1a 深入理解Express js 本文针对那些对Node js有一定了解的读者 假设你已经知道如何运行Node代码 xff0c 使用npm安装依赖模块 但我保证 xff0c 你并不需要是这方面的专家 本文针对的是Expres
  • Angular2文档学习的知识点摘要——依赖注入

    目录 目录依赖注入 xff08 DI xff09 为什么需要依赖注入 xff1f Angular 依赖注入 配置注入器在 NgModule 中注册提供商在组件中注册提供商该用NgModule还是应用组件 xff1f 注入服务显性注入器的创建
  • mysql 单表多次查询和多表联合查询,哪个效率高

    引自高性能MySQL xff1a
  • JDK5中的重要特性

    目录 目录静态导入自动装箱拆箱增强for循环可变参数枚举类反射 加载类解剖类利用Constructor创建对象利用Method执行方法反射字段 内省IntrospectorBeanUtils框架泛型Generic 泛型的使用自定义泛型 自定
  • Tomcat虚拟目录与虚拟主机的配置

    目录 目录互联网上常用协议以及其工作端口虚拟目录的映射方式 Tomcat配置虚拟目录不重启Tomcat配置虚拟目录的方式让tomcat自动映射 配置虚拟主机使用Java编写最简单的服务器程序 互联网上常用协议以及其工作端口 协议端口http
  • Tomcat相关知识点及其应用

    目录 目录将Web应用打包成warTomcat体系架构Tomcat配置https连接器Tomcat服务器的管理平台 将Web应用打包成war 在Web应用目录下执行命令 xff1a jar cvf xxx span class hljs p
  • Servlet开发须知知识点

    目录 目录Web项目目录结构Servlet的调用过程Servlet的运行过程Servlet接口实现类Servlet的URL映射Servlet线程安全 Web项目目录结构 举例 xff0c 在Intellij IDEA中如下 xff1a 其中
  • Servlet中的response对象

    目录 目录前言简介向客户端输出数据 response对象的getOutputStream方法response对象的getWriter方法 实现文件下载生成图片验证码实现浏览器定时刷新控制浏览器缓存实现请求重定向 前言 这里讲述的是Servl
  • Servlet中的request对象

    目录 目录简介request的常用方法request接收中文数据乱码问题request对象实现请求转发使用请求转发的注意事项RequestDispatcher的页面包含方法includeWeb工程中各类URL地址的写法防盗链 简介 Http
  • wps和搜狗输入法archlinux的解决方案文章

    archlinuxcn 源里安装yay wps3部分组成 yay S wps office cn 主程序英文界面 yay S wps office mui zh cn 中文皮肤 xff0c 变成中文界面 yay S ttf wps font
  • Servlet中不可不知的Cookie技术

    目录 目录介绍Servlet中的CookieCookie重要知识点通过Cookie技术显示用户上次访问时间使用Cookie技术实现记录用户浏览过的商品 显示商品列表和浏览过的商品查看商品详情 xff08 使用Cookie记录浏览信息 xff
  • Servlet中不可不知的Session技术

    目录 目录介绍Session和Cookie的主要区别Session的创建Session的销毁Session的实现原理解决浏览器关闭后就立即丢失Session ID的问题浏览器禁用Cookie后如何使用Session技术 xff1f Sess
  • JSP知识随手记

    目录 目录介绍JSP运行原理JSP最佳实践JSP指令 page指令include指令taglib指令 JSP九大内置对象 out隐式对象pageContext隐式对象 JSP标签映射JSP知识点JSP与JavaBean 关于JavaBean
  • FileZilla连接Linux服务器(Ubuntu)

    目录 目录前言FileZilla使用ubuntu用户密钥的形式连接FileZilla使用root用户密码的形式连接参考 前言 这里使用的是Ubuntu服务器 xff0c 如果是Linux系统的服务器出现这样的问题 xff0c 可能解决方法也
  • JSP中的自定义标签

    目录 目录简介入门案例自定义标签功能扩展传统自定义标签的运行原理传统自定义标签的使用 控制JSP页面部分内容执行控制整个JSP页面是否执行控制标签体执行重复执行用标签修改JSP页面内容 简单标签的运行原理简单标签的使用 控制JSP页面部分内
  • JSP中使用简单标签自定义标签

    目录 目录简介使用标签控制页面逻辑的案例 开发防盗链标签开发cif标签开发cifcelse标签开发cforEach标签使用简单标签实现html转移标签 打包标签库 简介 让标签处理器类继承于SimpleTagSupport类实现自定义标签功