JSTL标签库 | 深入解析JSTL标签库

news2024/9/24 1:21:50

目录

一:深入解析JSTL标签库 

1、什么是JSTL标签库

2、使用JSTL标签库的步骤 

3、JSTL标签的原理

4、jstl中的核心标签库core当中常用的标签


一:深入解析JSTL标签库 

1、什么是JSTL标签库

①Java Standard Tag Lib(Java标准的标签库)。

JSTL标签库通常结合EL表达式一起使用,目的是让JSP中的java代码消失

标签是写在JSP当中的,但实际上最终还是要执行对应的java程序(java程序在jar包当中)

2、使用JSTL标签库的步骤 

第一步:引入JSTL标签库对应的jar包

(1)tomcat9之前引入的jar包是:

①taglibs-standard-impl-1.2.5.jar

②taglibs-standard-spec-1.2.5.jar

(2)tomcat10之后引入的jar包是:

①jakarta.servlet.jsp.jstl-2.0.0.jar

②jakarta.servlet.jsp.jstl-api-2.0.0.jar

(3)在IDEA当中怎么引入?

①在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中,选中两个jar包右击鼠标,点击“Add Lib...”进行添加。

②一定是要和mysql的数据库驱动一样,都是放在WEB-INF/lib目录下的。

③什么时候需要将jar包放到WEB-INF/lib目录下?如果这个jar是tomcat服务器没有的。

第二步:在JSP中引入要使用标签库

①使用taglib指令引入标签库

②JSTL提供了很多种标签,重点掌握核心标签库 :http://java.sun.com/jsp/jstl/core

③语法格式如下:

prefix="起的名字,核心标签库,一般默认叫做c,可随意。"

uri=http://java.sun.com/jsp/jstl/core 表示使用的是这个库

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

第三步: 在需要使用标签的位置使用即可

①表面使用的是标签,底层实际上还是java程序 。

②例如:<c:catch></c:catch> 实际上对应的就是一个java类。

3、JSTL标签的原理

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>以上uri后面的路径实际上指向了一个xxx.tld文件。鼠标停留在路径上,按ctr键就会自动显示对应的xxx.tld文件,例如:C:\Users\86177\IdeaProjects\JavaWeb\jsp\web\WEB-INF\lib\taglibs-standard-impl-1.2.5.jar!\META-INF\c.tld

tld文件实际上是一个xml配置文件,在tld文件中描述了“标签”和“java类”之间的关系
以上核心标签库对应的tld文件是:c.tld文件。它在taglibs-standard-impl-1.2.5.jar里面META-INF目录下,有一个c.tld文件。

 ③以里面的catch标签为例,进行源码分析

<tag>
        <description>  对标签的描述
            Catches any Throwable that occurs in its body and optionally
            exposes it.
        </description>

        <name>catch</name> 标签的名字

        <tag-class>
            org.apache.taglibs.standard.tag.common.core.CatchTag
        </tag-class> 标签对应的java类

        <body-content>JSP</body-content>标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式(属于JSP的)。

        <attribute>  属性
            <description> 对这个属性的描述
                Name of the exported scoped variable for the
                exception thrown from a nested action. The type of the
                scoped variable is the type of the exception thrown.
            </description>
            <name>var</name> 属性名
            <required>false</required> false表示该属性不是必须的。true表示该属性是必须的。
            <rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
        </attribute>
    </tag>

④所以对于catch标签的语法格式如下:

<c:catch var="">
	JSP....
</c:catch>

 ⑤以foreach标签进行举例说明,通过源码分析,发现foreach标签有一个items属性,这个属性是可以指向一个集合的,并且也支持EL表达式;还有一个var属性,var后面的名字是随意的,var属性代表的是集合中的每一个元素。

⑥所以现在就可以使用EL表达式来代替我们原来我们用java代码使用增强for循环取出数据的过程!

<%@ page import="com.bjpowernode.javaweb.jsp.Student" %>
<%@ page import="java.util.*" %>
<%@page contentType="text/html; charset=UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%
    // 创建List集合
    List<Student> stuList = new ArrayList<>();

    // 创建Student对象
    Student s1 = new Student("110", "经常");
    Student s2 = new Student("120", "救护车");
    Student s3 = new Student("119", "消防车");

    // 添加到List集合中
    stuList.add(s1);
    stuList.add(s2);
    stuList.add(s3);

    // 将list集合存储到request域当中
    request.setAttribute("stuList", stuList);
%>

<%--第一种方式:使用Java代码,把for循环拆分了,看起来很诡异--%>
<%
    /// 从域中获取List集合
    List<Student> stus = (List<Student>)request.getAttribute("stuList");
    // 编写for循环遍历list集合
    for(Student stu: stus){
%>
    id:<%=stu.getId()%>,name:<%=stu.getName()%><br>

<%
    }
%>

<%--第二种方式:使用JSTL标签库中的forEach标签,非常简明、美观--%>
<c:forEach items="${stuList}" var="s">
    id:${s.id},name:${s.name}<br>
</c:forEach>

⑦进行测试访问:http://localhost:8080/jsp/17.jsp 发现这两种方式都能取出数据!

4、jstl中的核心标签库core当中常用的标签

(1)if标签

①语法格式:<c:if test=" "></c: if> 。

test属性是必须的,test属性支持EL表达式;test属性值只能是boolean类型

③if标签还有var属性,不是必须的;v变量中存储的是test属性的值。

④还有scope属性,用来指定var的存储域,也不是必须的。scope有四个值可选:page(pageContext域)、request(request域)、session(session域)、application(application域)

<%@page contentType="text/html;charset=UTF-8" %>

<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--if标签,test属性是必须的--%>
<c:if test="${empty param.username}">
    <h1>用户名不能为空</h1>
</c:if>

<c:if test="${not empty param.username}" var="v" scope="request">
    <h1>欢迎${param.username}登录</h1>
</c:if>

<%--通过EL表达式将request域当中的v取出--%>
${v}

😊发送请求http://localhost:8080/jsp/18.jsp​​​​​​ ,前端没有传入username,后端就取不到数据,调用隐式对象param.username返回的就是一个false;所以变量v取出来的也就是false

😊发送请求http://localhost:8080/jsp/18.jsp?username=zhangsan,前端传入username为张三,后端就能取到数据,调用隐式对象param.username返回的就是一个true;所以变量v取出来的也就是true

(2)forEach标签

①<c:forEach var="i" begin="1" end="10" step="2"> ${i} </c: forEach> ;var用来指定循环中的变量;begin开始;end结束;step步长。forEach底层实际上会将i存储到pageContext域当中;因为EL表达式只能从某个域当中取数据!

<%@ page contentType="text/html;charset=UTF-8"%>

<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--forEach底层实际上:会将i存储到pageContext域当中--%>
<c:forEach var="i" begin="1" end="10" step="2">
     <%--所以这里才会使用EL表达式将其取出,因为EL表达式只能从某个域当中取数据--%>
    ${i}&nbsp;
</c:forEach>

执行结果如下:

②varStatus属性:表示var的状态对象,这里是一个java对象,这个java对象代表了var的状态;并且varStatus这个状态对象有count属性,可以直接使用

<%@ page import="com.bjpowernode.javaweb.jsp.Student" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8"%>

<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<%
    // 创建List集合
    List<Student> stuList = new ArrayList<>();

    // 创建Student对象
    Student s1 = new Student("110", "经常");
    Student s2 = new Student("120", "救护车");
    Student s3 = new Student("119", "消防车");

    // 添加到List集合中
    stuList.add(s1);
    stuList.add(s2);
    stuList.add(s3);

    // 将list集合存储到request域当中
    request.setAttribute("stuList", stuList);
%>

<c:forEach items="${stuList}" var="s" varStatus="stuStatus">
    <%--varStatus的count值从1开始,以1递增,主要是用于编号/序号。--%>
    编号:${stuStatus.count} &nbsp;,id:${s.id},name:${s.name} <br>
</c:forEach>

执行结果:

(3)choose-when-otherwise

①这实际上是一个嵌套结构,语法格式是固定的,不能随意使用!

<%@page contentType="text/html;charset=UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:choose>
    <c:when test="${param.age < 18}">
        青少年
    </c:when>
    <c:when test="${param.age < 35}">
        青年
    </c:when>
    <c:when test="${param.age < 55}">
        中年
    </c:when>
    <c:otherwise>
        老年
    </c:otherwise>
</c:choose>

执行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?

如果误删电脑文件后&#xff0c;如何恢复文件&#xff1f; 电脑删除文件是很经常的事&#xff0c;为了电脑运行更快我们经常都会清理&#xff0c;但是有时候也会出现不小心删除重要文件的情况。如何恢复删除的文件&#xff1f;本文总结的2种常用方法可以帮助到你。 方法1、注册…

惠普CP1025 因转印离合器导致打印不全大片空白的问题

问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似的问题 惠普CP1025彩色激光打印机打印图像前半部有字后半部白纸惠普1025打印…

Java框架:Spring框架

文章目录一、Spring概念二、Spring特征三、Spring基本架构3.1Spring体系结构3.2Core Container(核心容器)3.3Data Access/Integration(数据访问/集成)3.4Web(MVC/Remoting)3.5Test(测试)3.6AOP(面向切面编程)四、Spring主要jar包五、Spring用到的设计模式一、Spring概念 什么是…

vue学习笔记(三)-组件化编程基础

概念 传统方式与组件化对比 存在问题 1.依赖关系混乱 2.代码复用率不高 模块与组件、模块化与组件化的关系 模块 a.理解&#xff1a;向外提供特定功能的 js 程序&#xff0c;一般就是一个 js 文件 b.为什么&#xff1a;js 文件很多很复杂 c.作用&#xff1a;复用、简化 …

【Docker技术内幕】(十二)使用docker安装Kafka

目录 一、准备工作 1、安装docker 2、设置加速镜像 二、开始安装 1、启动容器 三、验证Kafka是否安装成功 四、部署kafka-manager 一、准备工作 1、安装docker 参考 【Docker技术内幕】&#xff08;四&#xff09;Linux环境下安装docker 2、设置加速镜像 vim /etc/do…

C语言 数据存储 char int 数据存储 关于原码反码补码

上图 前五个整形是整形家族&#xff0c;为什么char也是 因为他是字符型 字符实际存储的时候寸的是这个的ascll值 ascll值是个整数 除了以上两种 还有构造类型 又叫自定义类型 为什么又数组类型 如下代码 arr和【】的内容都可以自定义 为什么出现以上情况.(ffff 是16进制表示…

第二证券|通过磁铁制造功率更大的电动汽车电池

德克萨斯大学奥斯汀分校的研讨人员表明&#xff0c;一个更厚的电极&#xff0c;经过磁优化的离子道路&#xff0c;能够使充电更快&#xff0c;充电之间的功率更大。 研讨人员制作了一种具有‘快速通道’摆放的电极&#xff0c;以进步充电速度和续航路程。 研讨人员发现了一种共…

Apache Hudi 数据湖介绍

目录​​​​​​​ Apache Hudi 数据湖介绍 Hudi 历程 Hudi Features Apache Hudi 数据湖介绍 Apache Hudi&#xff08;发音为“hoodie”&#xff09;是下一代流媒体数据湖平台源于Uber 。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的追加…

[附源码]Nodejs计算机毕业设计基于云数据库的便民民宿租赁系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

人人都能看懂的Spring底层原理,看完绝对不会懵逼

人人都能看懂的Spring原理&#xff0c;绝对不会懵逼为什么要使用Spring&#xff1f;Spring的核心组件Spring是如何实现IOC和DI的&#xff1f;定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

docker高级篇2-分布式存储之三种算法

面试题&#xff1a; 1~2亿条数据需要缓存&#xff0c;请问如何设计这个缓存案例&#xff1f; 答&#xff1a;单机单台100%是不可能的。肯定是分布式缓存的。那么用Redis如何落地&#xff1f; 一般有三种方案&#xff1a; 哈希取余分区&#xff1b;一致性哈希算法分区&#…

HttpRunner4.x 安装与使用

HttpRunner4.x 安装与使用HttpRunner4.x 安装与使用安装使用运行脚手架项目方式一&#xff1a;录制生成用例步骤1&#xff1a;导出har文件步骤2&#xff1a;转化成测试用例文件步骤3&#xff1a;执行测试用例方式二&#xff1a;手工编写测试用例HttpRunner4.x 安装与使用 以下…

卡塔尔世界杯终局之战,阿根廷VS法国,是老将加冕还是新王登基?

【世界杯】阿根廷VS法国 不知不觉&#xff0c;世界杯已经走到最后的尾声&#xff0c;此前经历的28天&#xff0c;63场比赛皆是铺垫&#xff0c;卢赛尔体育场将会迎来2022卡塔尔世界杯最终的决赛&#xff0c;究竟是梅西球王加冕还是法国卫冕世界杯冠军&#xff0c;今晚23&#x…

KNN算法 鸢尾花种类预测

目录 一&#xff1a;KNN原理 二&#xff1a;数据处理 三&#xff1a;超参调试、模型保存及使用 四&#xff1a;鸢尾花种类预测 详细步骤 一&#xff1a;KNN原理 从训练集中找到跟待测数据最近的k条记录 根据这些记录的分类决定新数据的分类 主要因素包括有&#xff1a;K邻…

java------JVM之类加载和双亲委派机制

类加载器&#xff1a;加载.class文件。 将新建的对象放入堆里面&#xff0c;而对象的引用(地址)放到栈&#xff0c;其中引用指向堆里面对应的对象。 1-启动类加载器&#xff0c;负责加载jre\lib目录下的rt.jar包c编写&#xff0c;加载java核心库 java.*,构造ExtClassLoader和A…

[CocosCreator]封装行为树(一)

(老规矩:广告位留给自己) 欢迎喜欢或者从事CocosCreator开发的小伙伴请加入我的大家庭CocosCreator游戏开发Q群:26855530 行为树的定义:控制AI实体决策流程的分层节点树。游戏中Npc的活动,或者主角挂机行为都十分依赖行为树,本章开始,封装适用CococCreator使用的TypeScript行…

Mongo基本操作

文章目录核心概念库<DataBase>集合<Collection>文档<Document>MySQL与MongoDB关系总结基本操作库<database>集合<Collection>文档<document>文档查询ANDORAND 和 OR 联合模糊查询排序分页总条数去重指定返回字段索引<index>操作复合…

vmware ESXI 7 升级ESXI 8

1 、上传VMware-Esxi-8.0安装包 2开启ssh 3、 远程登录到Esxi主机 ssh root192.168.31.119 [rootlocalhost:~] 4、升级到Esxi 8.0 [rootlocalhost:~] esxcli software sources profile list -d /vmfs/volumes/datastore1/iso/VMware-ESXi-8.0-20513097-depot.zip Name Vend…

软件设计师——项目管理

文章目录Gantt图与Pert图风险管理配置管理沟通管理题目举例Gantt图与Pert图 甘特图能够清晰描述每个任务的开始 / 结束时间及各任务之间的并行性&#xff0c;也可以动态地反映项目的开发进展情况&#xff0c;但难以反映多个任务之间存在的逻辑关系&#xff1b;PERT 利用项目的…

基于 Tensorflow 2.x 实现 BP 神经网络,实践 MNIST 手写数字识别

一、MNIST 数据集 MNIST 是一个非常有名的手写数字识别数据集&#xff0c;在很多资料中都会被用作深度学习的入门样例。在 Tensorflow 2.x 中该数据集已被封装在了 tf.keras.datasets 工具包下&#xff0c;如果没有指定数据集的位置&#xff0c;并先前也没有使用过&#xff0c…