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

article/2025/11/8 19:05:47

目录

一:深入解析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 optionallyexposes 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 theexception thrown from a nested action. The type of thescoped 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://chatgpt.dhexx.cn/article/LAv4IU3c.shtml

相关文章

JSTL标签库详细介绍

目录 一JSTL标签库 二、核心&#xff08;Core&#xff09;标签库 通用标签 循环控制标签 导入文件和URL 总结 一JSTL标签库 JSTL是一个不断完善的开放源代码的JSP标签库&#xff0c;是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上…

JSTL标签库

JSTL&#xff08;Java Server Pages Standerd Tag Library&#xff0c;JSP标准标签库&#xff09;包含用于编写和开发JSP页面的一组标准标签&#xff0c;它可以为用户提供一个无脚本环境。在此环境中&#xff0c;用户可以使用标签编写代码&#xff0c;而无须使用Java脚本。在JS…

JSTL标签

一、概念 JSTL的全称是JavaServer Pages Tag Library&#xff0c;我们也称之为JSP标准标签库。它是由Apache组织提供的开源的免费的jsp标签 二、作用 用于简化和替换jsp页面上的java代码 三、使用步骤&#xff1a; 导入jstl相关jar包引入标签库&#xff0c;通过<% tagl…

JSTL核心标签超详细

1.JSTL介绍 JSTL&#xff08;JavaServer Pages Standard Tag Library&#xff0c;JSP标准标签库)是一个JSP标签集合&#xff0c;它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务&#xff0c;比如迭代&#xff0c;条件判断&#xff0c;XML文档操作&#xff0c;…

关于网站最近出现504错误的总结,too open many files in system

如果你有耐心看完这篇文章&#xff0c;也许会给你带来真正的益处。 网站出现504错误&#xff0c;如果你用阿里云CDN的话还会报 504 Gateway Time-out The gateway did not receive a timely response from the upstream server or application. Powered by Tengine 这样一句…

腾讯云服务器网站504,使用腾讯、百度云CDN现403和504错误的解决及使用CDN踩的坑...

最近源站出网流量超出带宽的限定值&#xff0c;经常导致服务器丢包。最近有点频繁&#xff0c;甚至一小时丢好几次&#xff0c;如下图所示&#xff1a; 于是考虑接入 CDN &#xff0c;腾讯云CDN送了300G流量&#xff0c;但是接入后经常打不开页面&#xff0c;就换了百度云CDN。…

出现504怎么办?由于服务器更新导致的博客报504错误[详细记录]

最近由于云服务商进行了云服务优化&#xff0c;更新。由于以前在优化博客时的疏忽与草率&#xff0c;导致了本次服务商那边更新&#xff0c;这边博客直接报错504。 据官方称是修改了DNS解析地址&#xff0c;和ip域名地址。 504错误&#xff1a;代表网关超时 &#xff08;Gatewa…

nginx实战总结-504错误剖析

一、问题描述 nginx访问会出现504:Gateway Time-out,按照报错的意思是请求无响应或者无响应,意思就是说由于大量的请求,有些线程运气差,一直调用不到,导致请求超时,所以就往超时的时间入手,进行解决 二、解决步骤 先看下nginx使用的是什么协议(proxy/fastcgi):我这…

Git 504错误

网络和代理的问题 1、在环境变量中添加代理 2、设置git的代理为默认 git config --global --unset http.proxy //设置http代理为默认 git config --global --unset https.proxy //设置https代理为默认env | grep proxy //查看代理

php响应码504,php为什么会出现504错误_后端开发

python如何实现excel多表合并(附代码)_后端开发 今天来用python实现合并多个excel为一个工作本&#xff0c;使用不到40行代码完成了60多张excel工作本合并为一张&#xff0c;大家一起来看看吧。 php出现504错误的原因是&#xff1a;1、nginx默认的fastcgi进程响应缓冲区太小了&…

504网关超时怎么解决_什么是504网关超时错误(以及如何解决)?

504网关超时怎么解决 A 504 Gateway Timeout Error happens when a server that was attempting to load a web page did not get a response in time from another server. Almost always, the error is on the website itself, and there’s nothing you can do about it but…

HTTP代理504网关超时错误如何修复?

HTTP状态代码指的是服务器向浏览器指示响应的状态&#xff0c;当服务器充当外部网关或代理并且没有及时收到来自另一个服务器的响应时&#xff0c;则会收到“504–网关超时”。那么&#xff0c;HTTP代理504网关超市错误怎么解决呢&#xff1f; 1、重新加载网页 遇到504网关超时…

鸡啄米:添加控件变量

设置Tab键的顺序&#xff1a;先按CtrlD &#xff0c;再从自己认为Tab顺序应该为1的控件开始依次单击&#xff0c;随着单击的完成&#xff0c;各控件的Tab响应顺序也按我们的想法设置好了按钮中的代码&#xff1a;UpdateData(TRUE); //将控件中输入的数据传到变量m_a 、 m_b中 …

鸡啄米:C++编程入门系列之一(进制数)

转载自&#xff1a; http://www.jizhuomi.com/software/21.html 鸡啄米在前言已经讲了程序的发展历程&#xff0c;程序设计的进步和编程入门的一些基本概念。这一节主要讲数据在计算机中的存储结构。计算机执行程序需要控制信息和数据信息&#xff0c;控制信息涉及硬件方面&a…

鸡啄米:C++编程入门系列之六(算法的基本控制结构之选择结构)

转载自&#xff1a; http://www.jizhuomi.com/software/34.html 上一讲鸡啄米为大家讲了运算符和表达式的知识&#xff0c;这一讲鸡啄米主要讲算法基本控制结构中的选择结构&#xff0c;同时教大家写比较简单的程序。 为了能写出简单的程序并看见它们的输出效果&#xff0c;鸡…

鸡啄米之VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)

目录 一、目的 1、想学习滚动条控件Scroll Bar&#xff0c;如此获得里面的数值&#xff0c;方便用在其他地方&#xff0c;比只输入变量方便多了 一、参考&#xff1a; 1、VS2010/MFC编程入门之二十六&#xff08;常用控件&#xff1a;滚动条控件Scroll Bar&#xff09; ①…

鸡啄米:C++编程入门系列之前言

转载自&#xff1a; http://www.jizhuomi.com/software/17.html 从今天开始鸡啄米将给大家讲解一些C编程入门的知识&#xff0c;对于鸡啄米也是个温习巩固的过程。鸡啄米将会用深入浅出的方式&#xff0c;尽量用最简单的语言让读者学会C语言&#xff0c;并爱上这门语言。 本前…

鸡啄米:C++编程入门系列之四(数据类型)

转载自&#xff1a; http://www.jizhuomi.com/software/29.html 上一讲鸡啄米给大家讲了VS2010的使用介绍&#xff0c;大家以后就可以用它来进行软件开发了&#xff0c;在编程入门的时候可以写些简单的程序先玩玩&#xff0c;实际编写代码试验下鸡啄米讲过的内容。 C是从C中发…

鸡啄米vc++2010系列30(树形控件Tree Control 下)

前面一节讲了树形控件Tree Control的简介、通知消息以及相关数据结构&#xff0c;本节继续讲下半部分&#xff0c;包括树形控件的创建、CTreeCtrl类的主要成员函数和应用实例。 树形控件的创建 MFC为树形控件提供了CTreeCtrl类&#xff0c;它封装了树形控件的所有操作。 树形控…

鸡啄米:C++编程入门系列之五(运算符和表达式)

转载自&#xff1a; http://www.jizhuomi.com/software/32.html 上一讲鸡啄米给大家讲了一些数据类型&#xff0c;这一讲主要讲解编程入门知识-运算符和表达式。运算符&#xff0c;顾名思义&#xff0c;就是用于计算的符号&#xff0c;比如&#xff0c;-&#xff0c;*&#xf…