Java的JSTL标签库详解

 更新时间:2023年05月17日 08:56:20   作者:@每天都要敲代码  
JSTL包含用于编写和开发JSP页面的一组标准标签,它可以为用户提供一个无脚本环境。在此环境中,用户可以使用标签编写代码,而无须使用Java脚本

一:深入解析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}&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>

执行结果:

到此这篇关于Java的JSTL标签库详解的文章就介绍到这了,更多相关JSTL标签库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot+JWT实现单点登录完美解决方案

    SpringBoot+JWT实现单点登录完美解决方案

    单点登录是一种统一认证和授权机制,指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的系统,不需要重新登录验证,这篇文章主要介绍了SpringBoot+JWT实现单点登录解决方案,需要的朋友可以参考下
    2023-07-07
  • java实现画图板功能

    java实现画图板功能

    这篇文章主要为大家详细介绍了java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Spring中@Autowired注解在不同方法的写法示例

    Spring中@Autowired注解在不同方法的写法示例

    这篇文章主要为大家介绍了Spring中@Autowired注解在不同方法的写法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • spring mvc实现登录账号单浏览器登录

    spring mvc实现登录账号单浏览器登录

    这篇文章主要为大家详细介绍了spring mvc实现登录账号单浏览器登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 一段眼睛跟着鼠标转动的跟踪眼代码

    一段眼睛跟着鼠标转动的跟踪眼代码

    java实现的眼睛跟着鼠标转动的跟踪眼代码
    2008-10-10
  • Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    这篇文章主要介绍了Hadoop+HBase+ZooKeeper分布式集群环境搭建,集群环境至少需要3个节点,1个Master,2个Slave,节点之间局域网连接,可以相互ping通,本文通过实例给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 解决Spring Security的权限配置不生效问题

    解决Spring Security的权限配置不生效问题

    这篇文章主要介绍了解决Spring Security的权限配置不生效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java面试题之HashSet的实现原理

    Java面试题之HashSet的实现原理

    这篇文章主要介绍了Java面试题之HashSet的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • SpringBoot集合Mybatis过程解析

    SpringBoot集合Mybatis过程解析

    这篇文章主要介绍了SpringBoot集合Mybatis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 深入探究Spring底层核心原理

    深入探究Spring底层核心原理

    理解IOC与AOP的实现机制,优化应用性能与可维护性。Spring通过IOC容器管理Bean,AOP实现切面编程,支持事务管理、ORM框架等。深入理解Spring原理,可以帮助我们更好地使用Spring框架,提高开发效率与质量
    2023-04-04

最新评论