【JSP】JSTL汇总——源码解析

news2024/11/24 10:40:12

JSTL

  • 什么是JSTL
  • 使用JSTL的步骤
  • JSTL标签的原理
    • 分析标签源码
    • 看核心标签库中的forEach标签
  • 主标签库常用标签
    • forEach标签
      • begin、end、step属性
      • stuStatus属性
    • if标签
      • test属性
      • var和scope
    • choose和when标签

什么是JSTL

JSTL全称为 Java Standard Tag Library(Java标准标签库)

JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理等等

使用JSTL可以让JSP代码更加的简洁,可读性非常好,重用性非常高,可以完成一些复杂的功能!

使用JSTL的步骤

  1. 引入JSTL标签库对应的jar包

在IDEA中怎么引入?
WEB-INF下新建lib目录,然后将jar包拷贝到lib当中;
什么时候需要将jar包放到WEB-INF下的lib目录下?
Tomcat没有自带的jar

  1. 在JSP中引入要使用标签库(使用taglib指令引入标签库)

JSTL中提供了很多标签库,重点掌握核心标签库(core标签库)

在这里插入图片描述

JSTL标签的原理

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

以上uri后面的路径实际上指向了一个xxx.tld文件。
tld文件实际上是一个xml配置文件。
tld文件中描述了“标签”和“Java类”之间的关系,
以上核心标签库对应的tld文件是:c.tld文件

在这里插入图片描述

分析标签源码

<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表达式。

    <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>
/*
<c:catch var="">
	JSP....
</c:catch>
*/

  </tag>

看核心标签库中的forEach标签

下面是forEach标签的源码(有点小长):

<tag>
    <description>
	The basic iteration tag, accepting many different
        collection types and supporting subsetting and other
        functionality
    </description>
    <name>forEach</name>
    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
    <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class>
    <body-content>JSP</body-content>//该标签允许JSP内容
    
    <attribute>
        <description>
Collection of items to iterate over.
(翻译:要遍历的集合)
        </description>
	<name>items</name>
	<required>false</required>
	<rtexprvalue>true</rtexprvalue>
	//该属性值支持EL表达式
	
	<type>java.lang.Object</type>
        <deferred-value>
	    <type>java.lang.Object</type>
        </deferred-value>
    </attribute>



    <attribute>
        <description>
If items specified:
Iteration begins at the item located at the
specified index. First item of the collection has
index 0.
If items not specified:
Iteration begins with index set at the value
specified.
        </description>
	<name>begin</name>
	<required>false</required>
	<rtexprvalue>true</rtexprvalue>
	<type>int</type>
    </attribute>


    <attribute>
        <description>
If items specified:
Iteration ends at the item located at the
specified index (inclusive).
If items not specified:
Iteration ends when index reaches the value
specified.
        </description>
	<name>end</name>
	<required>false</required>
	<rtexprvalue>true</rtexprvalue>
	<type>int</type>
    </attribute>


    <attribute>
        <description>
Iteration will only process every step items of
the collection, starting with the first one.
        </description>
	<name>step</name>
	<required>false</required>
	<rtexprvalue>true</rtexprvalue>
	<type>int</type>
    </attribute>


    <attribute>
        <description>
Name of the exported scoped variable for the
current item of the iteration. This scoped
variable has nested visibility. Its type depends
on the object of the underlying collection.
        </description>
(翻译:迭代的当前项的导出作用域变量的名称。这个作用域变量具有嵌套的可见性。它的类型取决于基础集合的对象。)

	<name>var</name>
	<required>false</required>
	<rtexprvalue>false</rtexprvalue>
	//不可以用EL表达式
    </attribute>


    <attribute>
        <description>
Name of the exported scoped variable for the
status of the iteration. Object exported is of type
jakarta.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested
visibility.
        </description>
	<name>varStatus</name>
	<required>false</required>
	<rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
  • 在此标签属性items中,该属性的属性值是支持EL表达式的,那么就可以像下面这样使用:

在这里插入图片描述

  • 在此标签属性var中,该属性代表的是集合中的每一个元素,var后面的名字是自取的是随意的。

在这里插入图片描述
测试结果:
在这里插入图片描述

主标签库常用标签

forEach标签

  1. 上面解释了的forEach中的var和items属性标签

begin、end、step属性

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

<c:forEach var="i" begin="1" end="10" step="1">
  ${i}<br>
</c:forEach>

测试结果:
在这里插入图片描述
由于可以使用EL表达式去访问var,这里我们可以猜测var被存在某个域中了;

stuStatus属性

varStatus=“这个属性表示var的状态对象,这里是一个Java对象,这个Java对象代表了var的状态”
varStatus=“这里面名字是随意的”
varStatus这个状态对象有count属性,可以直接使用。

<%@ page import="javawen.jsp.bean.User" %>
<%@ 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<User> list = new ArrayList<>();
    User user1 = new User("zx","13",34);
    User user2 = new User("zs","343",94);
    User user3 = new User("xm1","12413",24);
    list.add(user1);
    list.add(user2);
    list.add(user3);
    request.setAttribute("user",list);
%>

<%--items通过源码我们知道是支持EL表达式的--%>

<c:forEach items="${user}" var="u" varStatus="xx">
    编号:${xx.count},name:${u.username},password:${u.password},age:${u.age}
    <br>
</c:forEach>


测试结果:

在这里插入图片描述

if标签

  1. if标签(test属性(必须),var属性(非必须),scope属性(非必须))

test属性

看下面源码可以知道,if标签中test属性必须存在并且是支持EL表达式的;
在这里插入图片描述

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

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

<c:if test="${empty paramValues.username}">
    <h1>用户名为空</h1>
</c:if>

测试效果:
在这里插入图片描述

var和scope

var=“这里填的是一个变量”,这个变量名是布尔类型的,其值和test相对应。
下面看看var属性描述的翻译:
在这里插入图片描述
scope=“这里填的是四大作用域中的其中一个”,可以填(pageContext、request、session、application)。
表示var作用的范围!

下面是其属性描述翻译:
在这里插入图片描述
测试:

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

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

<c:if test="${empty paramValues.username}" var="flag" scope="application">
    <h1>用户名为空</h1>
</c:if>

${flag}

在这里插入图片描述

choose和when标签

<%@page contentType="text/html;charset=UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  下面相当于
  if(){
  }else if(){
  }else if(){
  }else{
  }

--%>
<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/52750.html

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

相关文章

[附源码]计算机毕业设计springboot区域医疗服务监管可视化系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++读写Excel有许多开源库

1、OpenXLSX GitHub - troldal/OpenXLSX: A C library for reading, writing, creating and modifying Microsoft Excel (.xlsx) files. 依赖于第三库&#xff1a; PugiXMLZippy (C wrapper around miniz)Boost.Nowide (for opening files with non-ASCII names on Windows)…

(二)初识Vue

文章目录Vue环境搭建第一步&#xff1a;Vue下载第二步&#xff1a;安装开发者调试工具第一个Vue程序第一步&#xff1a;引入Vue.js第二步&#xff1a;关闭生产提示第三步&#xff1a;准备容器第四步&#xff1a;创建Vue实例第一个Vue程序的小细节细节一&#xff1a;如果使用的是…

Vue 2.0/3.0

vue核心 vue官网 1、 英文官网: https://vuejs.org/ 2、中文官网: https://cn.vuejs.org/ 模板语法 插值语法&#xff08;双大括号表达式&#xff09;指令语法&#xff08;以 v-开头&#xff09; Vue模板语法有2大类&#xff1a; 1.插值语法&#xff1a; 功能&#xff1a;用…

01【SpringMVC快速入门】

文章目录01【SpringMVC快速入门】一、SpringMVC快速入门1.1 SpringMVC概述1.1.1 SpringMVC是什么1.2 SpringMVC环境搭建1.2.1 创建web项目1.2.2 Maven依赖&#xff1a;1.2.3 配置web.xml1.2.4 SpringMVC配置1.2.5 编写Controller1.2.6 编写视图页面01【SpringMVC快速入门】 一…

高等数学(第七版)同济大学 习题10-4 (前7题)个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题10-4&#xff08;前7题&#xff09; 函数作图软件&#xff1a;Mathematica 1.求球面x2y2z2a2含在圆柱面x2y2ax内部的那部分面积.\begin{aligned}&1. \ 求球面x^2y^2z^2a^2含在圆柱面x^2y^2ax内部的那部分面积.&\e…

设置Oracle表空间只读

如果对表存储的规划较好&#xff0c;将业务相关的表都放在几个表空间里&#xff0c;可以通过设置表空间只读的方式&#xff0c;让这些表只读&#xff1a; alter tablespace <tablespace name> read only; 解除只读&#xff1a; alter tablespace <tablespace name>…

2023年软考备考,软件设计师知识点速记,速看

2023上半年软考中级软件设计师知识点速记分享给大家&#xff0c;快来一起打卡学习吧&#xff01; 1、码制的表示 2、浮点数的表示 &#xff08;1&#xff09;浮点数格式 阶码决定范围&#xff0c;阶码越长&#xff0c;范围越大&#xff1b; 尾数决定精度&#xff0c;尾数越…

Android编写一个视频监控App

Android编写一个视频监控App 很久没写app了&#xff0c;小项目需要写一个rtmp拉流的视频监控app&#xff0c;简单记录一下。 参考&#xff1a;Android实现rtmp推拉流摄像头&#xff08;三&#xff09;_空空7的博客-CSDN博客_android rtmp拉流 相关库 引用外部库首先添加这个…

C_C++文件,字符串和控制台格式化处理总结

在实际业务开发中经常会用到文件&#xff0c;字符串和控制台格式化操作&#xff0c;格式化操作无非就是将数据转成指定格式存储在文件或者字符串&#xff0c;或者显示在控制台上&#xff0c;或者反过来。本篇结合实际工作将C/C语言中常用的文件&#xff0c;字符串和控制台常用格…

[附源码]Python计算机毕业设计Django高血压分析平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数据抓取-bs4、XPath、pyquery详细代码演示

数据抓取-bs4、XPath、pyquery 一般抓取某个网站或者某个应用的内容&#xff0c;内容分为两个部分 非结构化的文本&#xff1a;HTML文本 结构化的文本&#xff1a;JSON、XML 非结构化的数据常见的解析方式有&#xff1a;XPath、CSS选择器、正则表达式 XPath语言 XPath是X…

golang知识点整理

目录 1、goroutine GMP模型 2、goroutine阻塞的处理 3、goroutine内存泄漏 4、map原理、扩容 5、go内存管理 6、go的gc 1、goroutine GMP模型 1. G代表一个goroutine对象&#xff0c;每次go调用的时候&#xff0c;都会创建一个G对象 2. M代表一个线程&#xff0c;每次创建…

JavaScript和Node.js的关系

JavaScript和Node.js的关系 JavaScript是一门编程语言&#xff08;脚本语言&#xff09;&#xff0c;JavaScript以前是在浏览器里执行的&#xff0c;需要浏览器里的JavaScript引擎&#xff0c;Firefox有叫做Spidermonkey的引擎&#xff0c;Safari有JavaScriptCore的引擎&#x…

第2章物理层——2.数据通信基础知识

一.数据通信系统模型 一个通信系统可以划分为三大部分: 源系统&#xff08;发送端&#xff09;&#xff0c;传输系统&#xff08;传输网络&#xff09;&#xff0c;目的系统&#xff08;接收端&#xff09; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传…

GIS工具maptalks开发手册(二)03-02——示例之json格式添加绘制工具、渲染点、文字和多个面

GIS工具maptalks开发手册(二)03-02——示例之json格式添加绘制工具、渲染点、文字和多个面 layer参数——https://maptalks.org/maptalks.js/api/0.x/Layer.html 1、json格式渲染点和面 效果-json格式渲染点和面 代码 index.html <!DOCTYPE html> <html> <…

spring boot使用自定义过滤器实现接口认证

spring boot使用自定义过滤器实现接口认证自定义过滤器创建FilterConfig类加密 解密 验证CipherFilter其他工具类AES 128 加密工具bean未加载前获取bean接口效果swagger访问Apipost 错误请求Apipost 正确请求自定义过滤器 创建MyFilter 类 去实现Filter接口 根据业务逻辑&…

(Git) git使用入门学习

文章目录打开基本操作拉代码常用指令设置用户查看历史版本分支管理配置公钥基于VS CodeEND打开 Git Bash Here 即打开命令行的形式 基本操作 拉代码 # git clone 地址 $ git clone https://gitee.com/heaven-sent-lotus/test.git常用指令 # 查看状态 git status# 添加到工作区…

数学建模学习(109):几行代码训练几十种机器学习模型

由于本专栏不是专门讲解机器学习的,因此我想该专栏的读者在机器学习模型的实践和理论上是比较薄弱的。 我想大家在经历过数学建模比赛,一定发现机器学习的模型是一定会出现的。无论是哪一场数学建模比赛,一定有一个题是用机器学习的。虽然前面的文章中,讲解了几篇机器学习…

JS实现二叉排搜索树

二叉树中的节点最多只能有两个子节点&#xff1a;一个是左侧子节点&#xff0c;另一个是右侧子节点。而二叉搜索树又可以简称BST&#xff0c;它是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&#xff09;小的值&#xff0c;在右侧节点存储&#x…