【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 标签库:自定义标签的开发与应用

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、JSP 标签库:开发者的“瑞士军刀”

JSP 标签库[1],说白了就是一套“瑞士军刀”,里头装着各种实用的工具,比如 JSTL自定义标签 这些。JSP 标签库能让开发者在 JSP 页面里用标签代替 Java 代码,写起来“顺手”,看起来“清爽”。

1. JSTL:标准标签库

JSTL[2] 是 JSP 的标准标签库,里头装着各种常用的标签,比如循环、条件判断、格式化啥的。JSTL 虽然好用,但有时候“不够用”,这时候就得用自定义标签了。

Jsp Code

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach var="item" items="${list}">

    <p>${item}</p>

</c:forEach>

2. 自定义标签:开发者的“独门武器”

自定义标签是开发者自己写的标签,能“量身定制”功能,比如分页、权限验证啥的。自定义标签虽然“复杂”,但用起来“顺手”,写起来“清爽”。

Jsp Code

<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %>

<my:pagination page="${page}" />

二、自定义标签的“开发流程”

自定义标签的开发流程,说白了就是“三步走”:写标签类写标签描述文件在 JSP 里用标签

1. 写标签类

标签类是自定义标签的“核心”,里头写着标签的逻辑。标签类得继承 TagSupport 或者 SimpleTagSupport,重写 doStartTag 或者 doTag 方法。

Jsp Code

public class PaginationTag extends TagSupport {

    private int page;

    

    public void setPage(int page) {

        this.page = page;

    }

    

    public int doStartTag() throws JspException {

        try {

            JspWriter out = pageContext.getOut();

            out.print("<div class='pagination'>");

            out.print("<a href='?page=" + (page - 1) + "'>上一页</a>");

            out.print("<a href='?page=" + (page + 1) + "'>下一页</a>");

            out.print("</div>");

        } catch (IOException e) {

            throw new JspException(e);

        }

        return SKIP_BODY;

    }

}

2. 写标签描述文件

标签描述文件是自定义标签的“说明书”,里头写着标签的名字、类名、属性啥的。标签描述文件得放在 WEB-INF/tags 目录下,后缀是 .tld

XML Code

<taglib>

    <tlib-version>1.0</tlib-version>

    <short-name>my</short-name>

    <uri>/WEB-INF/tags/mytags.tld</uri>

    <tag>

        <name>pagination</name>

        <tag-class>com.example.PaginationTag</tag-class>

        <body-content>empty</body-content>

        <attribute>

            <name>page</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

    </tag>

</taglib>

3. 在 JSP 里用标签

在 JSP 里用自定义标签,得先引入标签库,再用标签。引入标签库用 <%@ taglib %>,用标签就跟用 HTML 标签一样。

Jsp Code

<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %>

<my:pagination page="${page}" />

三、自定义标签的“复杂使用示例”

自定义标签虽然“复杂”,但用起来“顺手”,写起来“清爽”。比如,用自定义标签实现分页、权限验证啥的,都能“搞定”。

1. 分页标签

分页标签是自定义标签的“经典应用”。比如,用分页标签显示分页链接,用户点一下就能翻页。

Java Code

public class PaginationTag extends TagSupport {

    private int page;

    private int total;

    

    public void setPage(int page) {

        this.page = page;

    }

    

    public void setTotal(int total) {

        this.total = total;

    }

    

    public int doStartTag() throws JspException {

        try {

            JspWriter out = pageContext.getOut();

            out.print("<div class='pagination'>");

            if (page > 1) {

                out.print("<a href='?page=" + (page - 1) + "'>上一页</a>");

            }

            for (int i = 1; i <= total; i++) {

                if (i == page) {

                    out.print("<span>" + i + "</span>");

                } else {

                    out.print("<a href='?page=" + i + "'>" + i + "</a>");

                }

            }

            if (page < total) {

                out.print("<a href='?page=" + (page + 1) + "'>下一页</a>");

            }

            out.print("</div>");

        } catch (IOException e) {

            throw new JspException(e);

        }

        return SKIP_BODY;

    }

}

Jsp Code

<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %>

<my:pagination page="${page}" total="${total}" />

2. 权限验证标签

权限验证标签是自定义标签的“高级应用”。比如,用权限验证标签控制页面元素的显示,用户没权限就“看不见”。

Java Code

public class AuthTag extends TagSupport {

    private String role;

    

    public void setRole(String role) {

        this.role = role;

    }

    

    public int doStartTag() throws JspException {

        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();

        HttpSession session = req.getSession();

        String userRole = (String) session.getAttribute("role");

        if (role.equals(userRole)) {

            return EVAL_BODY_INCLUDE;

        } else {

            return SKIP_BODY;

        }

    }

}

Jsp Code

<%@ taglib prefix="my" uri="/WEB-INF/tags/mytags.tld" %>

<my:auth role="admin">

    <p>只有管理员能看到这段话,嗝~</p>

</my:auth>

四、自定义标签的“历史”:从 JSP 1.1 到 JSP 2.3

自定义标签从 JSP 1.1 开始就有了,虽然现在 JSP 2.3 已经“普及”了,但自定义标签的“核心功能”依然没变。

1. JSP 1.1:初代“瑞士军刀”

JSP 1.1 在 1999 年发布,自定义标签是它的“初代瑞士军刀”。虽然功能简单,但已经能满足大部分开发需求了。

2. JSP 2.0:引入 SimpleTag

JSP 2.0 在 2003 年发布,引入了 SimpleTag,让自定义标签的开发更加“简单”。SimpleTag 的引入,让自定义标签的“玩法”更加丰富。

Java Code

public class MySimpleTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException {

        getJspContext().getOut().print("Hello, World!");

    }

}

3. JSP 2.3:最后的“辉煌”

JSP 2.3 在 2013 年发布,是 JSP 的“最后版本”。虽然自定义标签的功能已经很强大了,但 JSP 的“辉煌”已经过去了,因为大家都开始用 Spring Boot、Vue.js 这些新技术了。


专有名词解释

  1. JSP 标签库:一套用于在 JSP 页面中代替 Java 代码的标签集合。
  2. JSTL:JavaServer Pages Standard Tag Library,JSP 的标准标签库,提供常用的标签功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…

根据指定 Excel 模板将 Excel 明细数据生成新的 Excel 文档

在日常工作中&#xff0c;我们常常需要生成 Excel 文档&#xff0c;例如将 Excel 数据 自动转换为独立的 Excel 文件。在这种需求下&#xff0c;如何高效地将 Excel 表格 中的每一条数据生成一个对应的 Excel 文档&#xff0c;并且让文档中的内容根据 Excel 数据动态变化&#…

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

【数据结构与算法】Java描述:第三节:栈与队列

一、 栈(Stack) 1.1 概念 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/…

MATLAB中movmax函数用法

目录 语法 说明 示例 向量的中心移动最大值 向量的尾部移动最大值 矩阵的移动最大值 包括缺失值的移动最大值 基于样本点计算移动最大值 仅返回满窗最大值 movmax函数的功能是求得移动最大值。 语法 M movmax(A,k) M movmax(A,[kb kf]) M movmax(___,dim) M mov…

linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)

服务器审查 在 Linux 中审查服务器的过程包括评估服务器的性能、安全性和配置&#xff0c;以确定需要改进的领域或任何潜在问题。审查的范围可以包括检查安全增强功能、检查日志文件、审查用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux 以其稳定性和安全性而闻名…

Java中的栈的实现

Java中的栈的实现--双端队列&#xff08;Deque&#xff09; 1. 解释代码2.为什么不用 Stack<Character>&#xff1f;3.使用示例4.Deque 的常用方法5.LinkedList<> 和 ArrayDeque<> 的区别和联系6. 总结 1. 解释代码 Deque<Character> st new ArrayDe…

【Andrej Karpathy 神经网络从Zero到Hero】--2.语言模型的两种实现方式 (Bigram 和 神经网络)

目录 统计 Bigram 语言模型质量评价方法 神经网络语言模型 【系列笔记】 【Andrej Karpathy 神经网络从Zero到Hero】–1. 自动微分autograd实践要点 本文主要参考 大神Andrej Karpathy 大模型讲座 | 构建makemore 系列之一&#xff1a;讲解语言建模的明确入门&#xff0c;演示…

Go_zero学习笔记

<!-- go-zero --> 安装配置 go-zero_github go-zero文档 go install github.com/zeromicro/go-zero/tools/goctllatest goctl --version // goctl version 1.7.2 windows/amd64 gopath/bin/会生成goctl的执行进程(%GOPATH%\bin设置到path环境变量中) 安装protoc&pr…

nats jetstream server code 分析

对象和缩写 jetstream导入两个对象&#xff1a;stream and consumer&#xff0c;在stream 之上构造jetstreamapi。在nats代码中&#xff0c;以下是一些常见的缩写 1.mset is stream 2.jsX is something of jetstream 3.o is consumer 代码分析 对于producer &#xff0c;发送…

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…

豆包大模型 MarsCode AI 刷题专栏 004

007.创意标题匹配问题 难度&#xff1a;易 问题描述 在广告平台中&#xff0c;为了给广告主一定的自由性和效率&#xff0c;允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候&#xff0c;会根据用户的搜索词触发的 bidword 对创意中的通配符&#xff…

Blueprint —— Blueprint Editor(二)

目录 一&#xff0c;Blueprint Header View 二&#xff0c;Blueprint Bookmarks 三&#xff0c;Blueprint Editor Defaults Tab 获取类默认值 一&#xff0c;Blueprint Header View Blueprint Header View 可将虚幻引擎蓝图类和蓝图结构体转换为C代码&#xff1b;在转换过程…

JVM组成面试题及原理

Java Virtual Machine&#xff08;JVM&#xff09;是Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f;…

解决在windows中docker拉取镜像出现的问题

解决在windows中docker拉取镜像出现的问题 docker pull minio/minio 出现报错&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while await…

MySQL基本建表操作

目录 1&#xff0c;创建数据库db_ck 1.1创建表 1.2 查看创建好的表 2,创建表t_hero 2.1 先进入数据库Db_Ck 2.1.1 这里可以看是否进入数据库: 2.2 创建表t_Hero 2.2.1 我们可以先在文本文档里面写好然后粘贴进去&#xff0c;因为直接写的话&#xff0c;错了要重新开始 …

使用Arduino和ESP8266进行基于物联网的垃圾箱监控

使用 Arduino 和 ESP8266 的基于 IOT 的垃圾箱监控系统 在这个 DIY 中,我们将制作一个基于 IOT 的垃圾箱/垃圾监控系统,该系统将通过网络服务器告诉我们垃圾桶是空的还是满的,并且您可以通过互联网从世界任何地方了解“垃圾桶”或“垃圾箱”的状态。它将非常有用,可以安装…

【Academy】HTTP 请求走私 ------ HTTP request smuggling

HTTP 请求走私 ------ HTTP request smuggling 1. 什么是 HTTP 请求走私&#xff1f;2. HTTP 请求走私漏洞是如何产生的&#xff1f;3. 如何执行 HTTP 请求走私攻击3.1 CL.TE 漏洞3.2 TE.CL 漏洞3.3 TE.TE 行为&#xff1a;混淆 TE 标头 4. 如何识别和确认 HTTP 请求走私漏洞4.…