0%

JSTL标签库

  • 什么是 JSTL 标签库?
    • Java Standard Tag Lib(Java 标准的标签库)
    • JSTL 标签库通常结合 EL 表达式一起使用。目的是让 JSP 中的 java 代码消失
    • 标签是写在 JSP 当中的,但实际上最终还是要执行对应的 java 程序(java程序在jar包当中)

6.4 JSTL标签库

  • 什么是 JSTL 标签库?
    • Java Standard Tag Lib(Java 标准的标签库)
    • JSTL 标签库通常结合 EL 表达式一起使用。目的是让 JSP 中的 java 代码消失
    • 标签是写在 JSP 当中的,但实际上最终还是要执行对应的 java 程序(java程序在jar包当中)

6.4.1 使用JSTL标签库的步骤

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

    • tomcat10 之后引入的 jar 包是:
      • jakarta.servlet.jsp.jstl-2.0.0.jar
      • jakarta.servlet.jsp.jstl-api-2.0.0.jar
    • 在 IDEA 当中怎么引入?
      • 在 WEB-INF 下新建 lib 目录,然后将 jar 包拷贝到 lib 当中。然后将其 “Add Lib…”
      • 一定是要和 mysql 的数据库驱动一样,都是放在 WEB-INF/lib 目录下的。
      • 什么时候需要将 jar 包放到 WEB-INF/lib 目录下? -> 如果这个 jar 包是 tomcat 服务器没有的
  2. 第二步:在 JSP 中引入要使用标签库(使用 taglib 指令引入标签库)。

    • JSTL 提供了很多种标签,你要引入哪个标签???

      重点掌握核心标签库:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      这个就是核心标签库。
      prefix="这里随便起一个名字就行了,核心标签库,大家默认的叫做c,你随意。使用时标签库的名字"

      <%--格式化标签库,专门负责格式化操作的。--%>
      <%--<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>--%>

      <%--sql标签库--%>
      <%--<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>--%>
  3. 第三步:在需要使用标签的位置使用即可。表面使用的是标签,底层实际上还是 java 程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <%@ page import="com.f.javaweb.jsp.bean.Student" %>
    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %>
    <%@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("张三", 10);
    Student s2 = new Student("李四", 20);
    Student s3 = new Student("王五", 30);
    // 添加到List集合中
    stuList.add(s1);
    stuList.add(s2);
    stuList.add(s3);
    // 将list集合存储到request域当中
    request.setAttribute("stuList", stuList);
    %>

    <%--需求:将List集合中的元素遍历。输出学生信息到浏览器--%>
    <%--使用java代码--%>
    <%
    // 从域中获取List集合
    List<Student> stus = (List<Student>) request.getAttribute("stuList");
    // 编写for循环遍历list集合
    for (Student stu : stus) {
    %>
    name:<%=stu.getName()%>,age:<%=stu.getAge()%><br>
    <%
    }
    %>

    <hr>

    <%--使用core标签库中forEach标签。对List集合进行遍历--%>
    <%--EL表达式只能从域中取数据。--%>
    <%--items需要进行迭代的集合,var后面的名字是随意的。var属性代表的是集合中的每一个元素。--%>
    <c:forEach items="${stuList}" var="s">
    name:${s.name},age:${s.age} <br>
    </c:forEach>

6.4.2 JSTL标签的原理

1
2
3
4
5
6
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
以上uri后面的路径实际上指向了一个xxx.tld文件,这个xxx.tld文件里有“<uri>http://java.sun.com/jsp/jstl/core</uri>”
tld文件实际上是一个xml配置文件。
在tld文件中描述了“标签”和“java类”之间的关系。
以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。
  • 源码解析:配置文件 tld 解析:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <tag>
    <description>
    对该标签的描述
    </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表达式。
    <attribute>
    <description>
    对这个属性的描述
    </description>
    <name>var</name> 属性名
    <required>false</required> false表示该属性不是必须的。true表示该属性是必须的。
    <rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
    </attribute>
    </tag>

    示例:
    <c:catch var="">
    标签体(JSP...)
    </c:catch>
  • 总结由标签找到 Java 类的过程,以 <c:forEach items="${stuList}" var="s"> 为例:

    1. c 找到 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    2. http://java.sun.com/jsp/jstl/core 找到 c.tld 配置文件。
    3. forEach 找到 c.tld 配置文件中的 forEach tag。
    4. c.tld 配置文件中的 forEach tag 找到对应的 java 类 org.apache.taglibs.standard.tag.rt.core.ForEachTag
    5. 找到该 java 类,继而执行 java 程序。

6.4.3 JSTL核心标签库core中常用的标签

  1. c:if

    • <c:if test="boolean类型,支持EL表达式"></c: if>

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      <%--核心标签库中的if标签--%>
      <%--test属性是必须的。test属性支持EL表达式--%>
      <c:if test="${empty param.username}">
      <h1>用户名不能为空。</h1>
      </c:if>
      <%--没有else标签, 可以搞两个if出来--%>
      <c:if test="${not empty param.username}">
      <h1>欢迎${param.username}</h1>
      </c:if>
      <%--if标签还有var属性,不是必须的。--%>
      <%--if标签还有scope属性,用来指定var的存储域。也不是必须的。--%>
      <%--scope有四个值可选:page(pageContext域)、request(request域)、session(session域)、application(application域)--%>
      <%--将var中的v存储到request域。--%>
      <%--把test的值以var为键名保存到指定的域中--%>
      <c:if test="${not empty param.username}" var="v" scope="request">
      <h1>欢迎你${param.username}。</h1>
      </c:if>
      <%--通过EL表达式将request域中的v取出--%>
      ${v}<br/>
  2. c:forEach

    • <c:forEach items=“集合,支持EL表达式” var=“集合中的元素” varStatus=“元素状态对象”> ${元素状态对象.count} </c: forEach>

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      <%--核心标签库中的forEach标签--%>
      <%--var用来指定循环中的变量--%>
      <%--begin开始--%>
      <%--end结束--%>
      <%--step步长--%>
      <%--底层实际上:会将i存储到pageContext域当中。--%>
      <c:forEach var="i" begin="1" end="10" step="1">
      <%--所以这里才会使用EL表达式将其取出,EL表达式取数据一定是从某个域当中取出的。--%>
      ${i}<br>
      </c:forEach>

      <%
      // 创建List集合
      List<Student> stuList = new ArrayList<>();
      // 创建Student对象
      Student s1 = new Student("张三", 10);
      Student s2 = new Student("李四", 20);
      Student s3 = new Student("王五", 30);
      // 添加到List集合中
      stuList.add(s1);
      stuList.add(s2);
      stuList.add(s3);
      // 将list集合存储到request域当中
      request.setAttribute("stuList", stuList);
      %>
      <%--var="s"这个s代表的是集合中的每个Student对象--%>
      <%--varStatus="这个属性表示var的状态对象,这里是一个java对象,这个java对象代表了var的状态"--%>
      <%--varStatus="这个名字是随意的"--%>
      <%--varStatus这个状态对象有count属性。可以直接使用。--%>
      <c:forEach items="${stuList}" var="s" varStatus="stuStatus">
      <%--varStatus的count值从1开始,以1递增,主要是用于编号/序号。--%>
      编号:${stuStatus.count}, name:${s.name}, age:${s.age} <br>
      </c:forEach>
  3. c:choose

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <%--
    if(){

    }else if(){

    }else if(){

    }else if(){

    }else{

    }
    --%>

    <%--核心标签库中的choose标签--%>
    <%--注意:这个嵌套结构不能随便改,只能这样嵌套。--%>
    <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>
---------------The End---------------