EL表达式和JSTL标签库

news2024/9/28 1:18:08

2023.10.25

EL表达式是什么?

        EL表达式,Expression Language(表达式语言),可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。 由于JSP中夹杂着各种java代码,例如<% java代码 %>、<%=%>等,导致JSP文件很混乱,不好维护,所以才有了EL表达式。EL表达式可以算是JSP语法的一部分,EL表达式归属于JSP。

        ps:EL表达式一般操作的都是域对象中的数据,操作不了局部变量。

        EL表达式优先从小范围中读取数据:pageContext < request < session < application

EL表达式的使用

EL表达式的作用:

        从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。

1、从某个域中取数据。

  • pageContext

  • request

  • session

  • application

2、将取出的数据转成字符串。

  • 如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。

3、将字符串输出到浏览器。

  • 和这个一样:<%= %>,将其输出到浏览器。

EL表达式的基本语法格式:

${表达式}

 EL表达式的使用案例:

<%
	// 创建User对象
	User user = new User();
	user.setUsername("jackson");
	user.setPassword("1234");
	user.setAge(50);

	// 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。
	// 数据是必须存储到四大范围之一的。
	request.setAttribute("userObj", user);
%>

使用EL表达式取出User对象:

${userObj}
//等同于java代码:<%=request.getAttribute("userObj")%>

 ps:面试题: ${userObj} 和 ${"userObj"}的区别是什么?

        ${userObj}表示从某个域中取出数据,并且被取的这个数据的name是"userObj",之前一定有这样的代码: 域.setAttribute("userObj", 对象);
        ${"userObj"} 表示直接将"userObj"当做普通字符串输出到浏览器。不会从某个域中取数据了。

如何输出对象的属性值?

${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
EL表达式中的 . 这个语法,实际上调用了底层的getXxx()方法。
注意:如果没有对应的get方法,则出现异常。报500错误。

EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。

EL表达式中有四个隐含的隐式的范围:

  • pageScope 对应的是 pageContext范围。

  • requestScope 对应的是 request范围。

  • sessionScope 对应的是 session范围。

  • applicationScope 对应的是 application范围。

怎么从Map集合中取数据:

        ${map.key}

怎么从数组和List集合中取数据:

  • ${数组[0]}

  • ${数组[1]}

  • ${list[0]}

忽略EL表达式的指令:

<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
isELIgnored="true" 表示忽略EL表达式
isELIgnored="false" 表示不忽略EL表达式。(这是默认值)

isELIgnored="true" 这个是全局的控制。

可以使用反斜杠进行局部控制:\${username} 这样也可以忽略EL表达式。

通过EL表达式获取应用的根:

  • ${pageContext.request.contextPath}

ps:EL表达式没有内置request对象,所以不能直接用request获取应用的根,需要先用内置对象pageContext先获取request。

JSTL标签库

什么是JSTL标签库?

        Java Standard Tag Lib(Java标准的标签库)。通常结合EL表达式一起使用。目的是让JSP中的java代码消失。

使用JSTL标签库的步骤:

  1. 引入JSTL标签库对应的jar包。  在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。ps:这里解释一下为什么有的jar包放在lib下(如mysql的驱动jar包和JSTL标签库jar包),有的jar包是在idea的设置中部署(如servlet-api.jar、jsp-api.jar):直接在idea中部署的jar包,是Tomcat服务器本身就有的jar包,这里部署只是为了和idea关联起来。 而放在lib下的jar包,是第三方的jar包,Tomcat服务器没有自带的。 
  2. 在JSP中引入要使用标签库。(使用taglib指令引入标签库。)
  3. 在需要使用标签的位置使用即可。表面使用的是标签,底层实际上还是java程序。

JSTL标签的原理:

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

使用JSTL标签库的案例 :

<%@ page import="jsp.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>

<%@ page import="java.util.List" %>
<%@ 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("3", "艾弗森");
    Student s2 = new Student("24", "科比");
    Student s3 = new Student("23", "乔丹");

    // 添加到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){
%>
id:<%=stu.getId()%>,name:<%=stu.getName()%><br>
<%
    }
%>

<hr>

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

上述案例分别演示了使用和不使用jstl标签库来对集合中的元素进行遍历,访问服务器结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133261.html

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

相关文章

MySQL---表的增查改删(CRUD进阶)

文章目录 数据库约束表的设计一对一一对多多对多 新增查询聚合查询分组查询联合查询内连接外连接自连接子查询合并查询 数据库约束 数据库约束就是指&#xff1a;程序员定义一些规则对数据库中的数据进行限制。这样数据库会在新增和修改数据的时候按照这些限制&#xff0c;对数…

[ACTF2020 新生赛]Exec

【解题过程】 1.打开链接 得到一个能ping 的网站&#xff0c;可以推测这个可以在终端运行的网站。 2.解题思路 在执行的时候我们可以想到命令执行的“&#xff1b;”分号的作用&#xff1a;命令用分号分隔开来&#xff0c;表示它们是两个独立的命令&#xff0c;需要依次执行。…

【Docker】Docker的网络

Docker提供了多种内置的网络模式&#xff0c;用于在容器之间建立网络连接。这些网络模式&#xff0c;包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。 桥接网络 桥接网络是Docker的默认网络模式。在桥接网络中&#xff0c;Docker会为每…

Pytorch代码入门学习之分类任务(一):搭建网络框架

目录 一、网络框架介绍 二、导包 三、定义卷积神经网络 3.1 代码展示 3.2 定义网络的目的 3.3 Pytorch搭建网络 四、测试网络效果 一、网络框架介绍 网络理解&#xff1a; 将32*32大小的灰度图片&#xff08;下述的代码中输入为32*32大小的RGB彩色图片&#xff09;&…

论多段图的最短路径问题(我认为本质上还是暴力枚举法)

比如说这道题&#xff1a;我向前推进 从0到11的最短路径 按照图可以分5段&#xff0c;v1 是第一阶段 0&#xff0c;v2是第二段 有1&#xff0c;2&#xff0c;3&#xff0c;4 从0开始&#xff0c;路径为0&#xff0c;所以m&#xff08;1&#xff0c;0&#xff09;0&#xff1b…

单片机核心/RTOS必备 (ARM汇编)

ARM汇编概述 一开始&#xff0c;ARM公司发布两类指令集&#xff1a; ARM指令集&#xff0c;这是32位的&#xff0c;每条指令占据32位&#xff0c;高效&#xff0c;但是太占空间。Thumb指令集&#xff0c;这是16位的&#xff0c;每条指令占据16位&#xff0c;节省空间。 要节…

reqable(小黄鸟)+雷电抓包安卓APP

x 下载证书保存到雷电模拟器根目录(安装位置) 在根目录打开cmd执行命令 F:\Program\leidian\LDPlayer9>adb push reqable-ca.crt /system/etc/security/cacerts/364618e0.0 reqable-ca.crt: 1 file pushed, 0 skipped. 0.8 MB/s (1773 bytes in 0.002s)如果是powershell…

Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)

案例需求分析 直播公司每日都会产生海量的直播数据&#xff0c;为了更好地服务主播与用户&#xff0c;提高直播质量与用户粘性&#xff0c;往往会对大量的数据进行分析与统计&#xff0c;从中挖掘商业价值&#xff0c;我们将通过一个实战案例&#xff0c;来使用Hadoop技术来实…

Node编写更新用户头像接口

目录 定义路由和处理函数 验证表单数据 ​编辑 实现更新用户头像的功能 定义路由和处理函数 向外共享定义的更新用户头像处理函数 // 更新用户头像的处理函数 exports.updateAvatar (req, res) > {res.send(更新成功) } 定义更新用户头像路由 // 更新用户头像的路由…

Liunx-Kubernetes安装

安装Kubernetes Kubernetes有多种部署方式&#xff0c;目前主流的方式有kubeadm、minikube、二进制包 minikube&#xff1a;一个用于快速搭建单节点kubernetes的工具kubeadm&#xff1a;一个用于快速搭建kubernetes集群的工具二进制包&#xff1a;从官网下载每个组件的二进制…

浏览器多开,数据之间相互不干扰

方法很简单 在浏览器快捷方式中&#xff0c;快捷键点开属性&#xff0c;在目标中添加--user-data-dirD:\chrome\1

【蓝桥每日一题]-贪心(保姆级教程 篇1)#拼数 #合并果子 #凌乱yyy

目录 题目&#xff1a; 拼数 思路&#xff1a; 题目&#xff1a; 合并果子 思路&#xff1a; 题目&#xff1a;凌乱yyy 思路&#xff1a; 题目&#xff1a;拼数 思路&#xff1a; 思路很简单。举个例子&#xff1a;对于a321,b32。我们发现ab32132,ba32321&#xff0c;那么…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下&#xff0c;让函数、接口或类与多种类型一起工作&#xff0c;从而实现复用 基本使用 举个例子&#xff1a; 创…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码&#xff1a;https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

解决:vscode和jupyter远程连接无法创建、删除文件的问题(permission denied)

目录 问题&#xff1a;vscode和jupyter远程连接服务器无法创建、删除文件的问题原因&#xff1a;代码文件的权限不够解决方法&#xff1a;1.ls -l查看目录所在组&#xff0c;权限2.chown修改拥有者和所在组 问题&#xff1a;vscode和jupyter远程连接服务器无法创建、删除文件的…

【兔子王赠书第3期】《案例学Python(进阶篇)》

文章目录 前言推荐图书本书特色本书目录本书样章本书读者对象粉丝福利丨评论免费赠书尾声 前言 随着人工智能和大数据的蓬勃发展&#xff0c;Python将会得到越来越多开发者的喜爱和应用。因为Python语法简单&#xff0c;学习速度快&#xff0c;大家可以用更短的时间掌握这门语…

Spring学习笔记—JDK动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Unity中Shader的ShaderLOD

文章目录 前言一、ShaderLOD的使用步骤1、ShaderLOD使用在不同的SubShader中&#xff0c;用于区分SubShader所对应的配置2、在 C# 中使用 Shader.globalMaximumLOD 赋值来选择不同的 SubShader,以达到修改配置对应Shader的效果3、在设置LOD时&#xff0c;是需要和程序讨论统一 …

WebGL笔记:矩阵的变换之平移的实现

矩阵的变换 变换 变换有三种状态&#xff1a;平移、旋转、缩放。当我们变换一个图形时&#xff0c;实际上就是在移动这个图形的所有顶点。解释 webgl 要绘图的话&#xff0c;它是先定顶点的&#xff0c;就比如说我要画个三角形&#xff0c;那它会先把这三角形的三个顶点定出来…

为什么需要山洪灾害监测预警系统?

在山洪高发地区&#xff0c;安装山洪灾害监测预警系统能够通过实时监测&#xff0c;预警山洪信息&#xff0c;对于保障我们的生命财产安全具有重要意义。 监测山洪不仅需要对山体进行监测&#xff0c;还要监测降雨量以及水位上升情况。山洪灾害监测预警系统是由GNSS监测站和水…