Java的JSTL标签库详解
作者:@每天都要敲代码 发布时间:2023-07-13 21:58:35
一:深入解析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提供了很多种标签,重点掌握核心标签库 ://java.sun.com/jsp/jstl/core
③语法格式如下:
prefix="起的名字,核心标签库,一般默认叫做c,可随意。"
uri=//java.sun.com/jsp/jstl/core 表示使用的是这个库
<%@taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>
第三步: 在需要使用标签的位置使用即可
①表面使用的是标签,底层实际上还是java程序 。
②例如:<c:catch></c:catch> 实际上对应的就是一个java类。
3、JSTL标签的原理
<%@taglib prefix="c" uri="//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>
进行测试访问://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}
发送请求//localhost:8080/jsp/18.jsp ,前端没有传入username,后端就取不到数据,调用隐式对象param.username返回的就是一个false;所以变量v取出来的也就是false
发送请求//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}
</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} ,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>
执行结果:
来源:https://blog.csdn.net/m0_61933976/article/details/128142736


猜你喜欢
- • 创建目录和文件1、通过Path类的Combine方法可以合并路径。string activeDir = @"C:\myDir&
- 一、什么是代理?指为一个目标对象提供一个代理对象, 并由代理对象控制对目标对象的引用. 使用代理对象, 是为了在不修改目标对象的基础上,增强
- 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:
- 上篇文章已经对Synchronized关键字做了初步的介绍,从字节码层面介绍了Synchronized关键字,最终字节码层面就是monito
- 本文实例讲述了Android编程实现XML解析与保存的三种方法。分享给大家供大家参考,具体如下:简介在Android开发中,关于XML解析有
- 本文实例为大家分享了Android实现文字下方加横线的具体代码,供大家参考,具体内容如下public class WhiteTextview
- 由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传、拍照、本地选择、相片裁剪等功能,如果有需要的朋
- 先申明一个枚举: public enum Test_Enum  
- 前言以多个客户端和一个服务端的socket通信为例,服务端启动时创建一个固定大小的线程池。服务端每接收到一个连接请求后(通信任务),交给线程
- 为了实现不同环境构建的不同需求,这里使用到了 profile。因为 profile 能够在构建时修改 pom 的一个子集,或者添加额外的配置
- maven的三种packaging方式pom是maven依赖文件jar是java普通项目打包war是java web项目打包pom:打出来可
- 一、需求C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉
- C#关于颜色值的表示:常用的颜色值表示方式有两种,一种是10进制的RGB值表示,如(0,113,255),三个值分别表示(红,绿,蓝);一种
- 前言前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一
- [LeetCode] 9. Palindrome Number 验证回文数字Determine whether an integer is
- 本文实例讲述的是AlertDialog,这种对话框会经常遇到。AlertDialog跟WIN32开发中的Dialog不一样,AlertDia
- 1. Consul 简介Consul是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与
- 把最近听的写的一些题目做下笔记!1.下列程序的执行,说法错误的是 ( ABC )public class MultiCatch
- Java API不能远程访问HBase今天我在虚拟机里面安装了Hbase 1.2.4,说在windows上Java API调用访问下玩玩,结
- 因为系统的菜单列表是不轻易改变的,所以不需要在每次请求的时候都去查询数据库,所以,在第一次根据用户id请求到菜单列表的时候,可以把菜单列表的