六、JSP06 使用 EL 和 JSTL 简化 JSP

news2024/11/27 16:33:19

六、使用 EL 和 JSTL 简化 JSP

6.1 使用 EL 表达式

EL 表达式借鉴了 JavaScript 和 XPath 的表达式语言

EL 表达式提供了一种在 JSP 中简化表达式的方法

EL 表达式通常用于在某个作用域 {page、request、session、application等} 内取得属性值

6.1.1 使用 EL 表达式

  • EL 表达式语法
${表达式}
  • EL 表达式一般操作的是域对象,操作不了局部变量
  • 域对象的概念在 JSP 中存在的有: pageContext、request、session、application
  • 作用范围依次为 本页面、一次请求、一次会话、整个应用程序
  • 使用时通过给域对象设置的 name 值来调用值
  • 如果四个域对象的 name 值都相同时,EL 默认的查找方式是从小到大查找
  • 示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    pageContext.setAttribute("uname","pageContext");
    request.setAttribute("uname", "request");
    session.setAttribute("uname", "session");
    application.setAttribute("uname", "application");

//    局部变量
    String str="你好";
%>
局部变量${str}<br>
域变量${uname}
</body>
</html>
  • 输出结果
局部变量
域变量pageContext
  • 因为 EL 表达式操作的是域对象,所以调用局部变量并没有找到值
  • 因此也可以看出,当 EL 表达式操作的值为空时,会返回一个空的字符串,而不是 null

6.1.2 使用 EL 表达式操作对象

  • EL 表达式经常用来访问两类内容: 对象和属性

1、用 点 (.) 操作符

  • 与 Java 语言类似,在 EL 表达式中,也可以用点操作符来访问对象的属性
  • 用 点 (.) 操作符访问对象属性 示例
${对象名.属性}

2、 [] 操作符

  • 与点操作符类似,[] 操作符也可以访问对象的属性
  • 它也可以用来访问一些包含了特殊字符的 如 .- 等的属性名
  • 也可以用来访问数组
  • [] 操作符示例
${对象名[属性]}
${数组[下标]}

3、 EL 表达式的简单用于,操作 Map 集合

  • 将用户信息存储在 Map 中,并通过 EL 表达式输出
  • 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    Map<String, String> map=new HashMap<String, String>();
    map.put("name","巧克力");
    map.put("hobby","胡思乱想");
    request.setAttribute("user",map);
%>
用户名:${user.name}<br>
用户爱好:${user.hobby}<br>
</body>
</html>
  • 输出结果

image-20230604132354909

6.1.3 Empty 运算符

  • Empty 运算符是一个前缀操作符,用于检测一个变量是否为空
  • 如引用为 null,字符串或集合的长度为 0 等,结果都会返回为 true
  • 如果不为空则返回 false
  • 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
  String str=null;
  String str1="";
  Map map=null;
  Map map1=new HashMap();
  Map map2=new HashMap();
  map2.put("str","123");
 request.setAttribute("str",str);
 request.setAttribute("str1",str1);
 request.setAttribute("map",map);
 request.setAttribute("map1",map1);
 request.setAttribute("map2",map2);

%>
空字符串:${empty str}<br>
值为空格的字符串:${empty str1}<br>
空 map:${empty map}<br>
长度为0的 map:${empty map1}<br>
有值的 map:${empty map2}<br>
</body>
</html>
  • 运行结果

image-20230604133317344

6.1.4 EL 表达式的隐式对象

  • EL 表达式提供了若干隐式对象,以便 JSP 的开发
  • EL 表达式的隐式对象按照使用途径的不同分为 作用域访问对象、参数访问对象、JSP 隐式对象、首部访问对象和初始化参数访问对象
  • EL 表达式的隐式对象

image-20230604135233081

1、作用域访问对象

  • 在 Java Web 中存储变量时,共有 page、request、session、application 四个作用域选项
  • 但是如果四个作用域内存储的值的 name 都相同时,可以使用作用域对象,指定在某个作用域查找的值
  • 将作用域内的所有属性转为 Map 类,通过 key 值来调用
  • EL 表达式提供了四个作用域访问对象
对象名称说明
pageScope与 page 作用域中的属性相关联的 Map 类
requestScope与 request 作用域中的属性相关联的 Map 类
sessionScope与 session 作用域中的属性相关联的 Map 类
applicationScope与 application 作用域中的属性相关联的 Map 类
  • 当使用 EL 表达式访问某个变量时,应该指定查找范围,如 ${rquestScope.pageObje}
  • 代码示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
    pageContext.setAttribute("uname","pageContext");
    request.setAttribute("uname", "request");
    session.setAttribute("uname", "session");
    application.setAttribute("uname", "application");
%>
PageContext作用域:${pageScope.uname}<br>
requset作用域:${requestScope.uname}<br>
session作用域:${sessionScope.uname}<br>
application作用域:${applicationScope.uname}<br>

</body>
</html>
  • 输出结果

e", “application”);
%>
PageContext作用域: p a g e S c o p e . u n a m e < b r > r e q u s e t 作用域 : {pageScope.uname}<br> requset作用域: pageScope.uname<br>requset作用域:{requestScope.uname}

session作用域: s e s s i o n S c o p e . u n a m e < b r > a p p l i c a t i o n 作用域 : {sessionScope.uname}<br> application作用域: sessionScope.uname<br>application作用域:{applicationScope.uname}

~~~
  • 输出结果

image-20230604140604914

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

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

相关文章

【019】C++的指针与函数

C的指针与函数 引言一、指针变量作为函数的参数1.1、单向传递&#xff1a;值传递1.2、单向传递&#xff1a;传地址 二、数组作为函数的参数传递三、函数的返回值类型是指针类型四、函数指针4.1、函数指针的定义4.2、函数指针变量的注意事项4.3、函数指针变量使用typedef定义别名…

rabbitmq死信队列详解

目录 1 概念 2 成为死信队列的条件 2.1 队列指定长度 2.2 消息ttl时间 2.3 消费者拒收消息 1 概念 死信队列&#xff1a;死信队列其实和普通的队列一样&#xff0c;只不过里面存放的消息都是普通队列过期没有消费的。所以&#xff0c;接收没有及时被消费消息的队列为死信…

[SWPUCTF 2021 新生赛] (WEB二)

目录 easyupload1.0 easyupload2.0 easyupload3.0 no_wakeup PseudoProtocols error hardrce pop sql finalrce hardrce_3 easyupload1.0 1.启动环境 2.上传一个图片木马 GIF89a <script languagephp>eval($_POST[a]);</script>3.蚁剑连接&#xff0c;…

VBScript深度学习入门——线性回归

背景 破电脑装不了VS、Py、IDea、Golang等主流编译器或其语言运行环境&#xff0c;但是自带.Net FrameWork 3.5&#xff0c;可以使用VBScript进行脚本编写&#xff0c;无所谓&#xff0c;反正都是了解底层原理学习&#xff0c;大不了手搓机器学习框架。 分析 了解线性回归的…

剑指 Offer 24. 反转链表解题思路

文章目录 题目解题思路 题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 …

去过门头沟吗?

门头沟&#xff08;Mt.Gox&#xff09; 1. 成立2. 发展3. 危机4. 后续 1. 成立 MtGox是程序员杰德麦凯莱布&#xff08;Jed MeCaleb&#xff09;在比特币论坛的用户名。2007年&#xff0c;麦凯莱布开发了魔法风云会线上交易平台&#xff1a;门头沟&#xff08;Mt.Gox&#xff…

【数据分析之道-Matplotlib(六)】Matplotlib饼图

文章目录 专栏导读1、Matplotlib饼图pie()语法格式2、设置饼图各个扇形的标签与颜色3、突出显示第二个扇形&#xff0c;并格式化输出百分比4、shadows通过将参数设置为&#xff1a;向饼图添加阴影 True5、使用legend()函数为每个楔形添加解释列表6、将title参数添加到legend 函…

MYSQL实战45讲笔记--基础架构:一条SQL查询语句是如何执行的?

基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f; **select** * **from** T **where** ID10mysql架构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层&#xff1a;连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务…

不同平均值—集合—力扣—Python

一、题目描述&#xff1a; 二、代码解题&#xff1a; 1.不含注释语句的 class Solution:def distinctAverages(self, nums: List[int]) -> int:avg set([])l len(nums)//2for i in range(0,l):mi min(nums)ma max(nums)p (mima)/2avg.add(p)nums.remove(mi)nums.remo…

Python-For-EEG基础代码讲解(1)

Python-For-EEG 我要演示脑电图信号的基本分析。 主题 1、基于时域分析&#xff0c;P300信号数据集 Event-related potentials and 1-dimensional convolution&#xff08;ERP,CNN&#xff09;Long short-term memory(LSTM) 2、基于频域分析&#xff0c;DEAP和SSVEP数据集…

LeetCode_双指针_中等_82.删除排序链表中的重复元素 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回已排序的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&…

oracle19c SYSAUX表空间使用率高

今早手机收到一个信息&#xff0c;某客户的19c环境sysaux使用率超过了80%告警了。既然有事了还是需要登录查看下的 SYS > SET LINES 120 pagesize 199; SYS > COL OCCUPANT_NAME FORMAT A30; SYS > SELECT * FROM (SELECT OCCUPANT_NAME,SPACE_USAGE_KBYTES FROM V$S…

【逆向基础】JS逆向入门:小白也可以看懂

文章目录 前言一、接口抓包二、逆向分析3. 接口验证总结 前言 出于对数据安全的考虑&#xff0c;现代化的网站/APP通常会对数据接口做加密处理。而分析这些接口的加密算法并实现模拟调用的过程就叫做「逆向」。逆向对于爬虫工程师来说是一个永远绕不开的话题&#xff0c;也逐渐…

《嵌入式存储器架构、电路与应用》----学习记录(四)

第5章 新型嵌入式存储器 在现有主流嵌入式存储器中&#xff0c;SRAM虽然读写速度非常快&#xff0c;但是单元面积太大&#xff0c;无法在片上实现高密度集成&#xff1b;DRAM由于要制造电容&#xff0c;所采用的工艺无法在先进的CMOS工艺中实现&#xff0c;不利于做嵌入式存储…

六一专辑||C++实现动态烟花代码

首先&#xff0c;祝大家儿童节快乐&#xff01; 在这篇文章中&#xff0c;将用烟花致以大家最好的祝福&#xff01; 烟花代码将会用到 Easyx 图形库&#xff0c;可以去官网下载&#xff1a;easyx.cnhttp://easyx.cn/ 代码思路 1 烟花结构体 2 初始化烟花 3 烟花上升 4 烟…

设置主机名和host映射

这里写目录标题 设置主机名设置host映射主机名解析过程分析 设置主机名 为了方便记忆。可以给linux系统主机名&#xff0c;也可以根据需要修改主机名 指令hostname来查看主机名 修改主机名 vim /etc/hostname 进入之后修改就行 修改之后重启生效 设置host映射 如何通过主机…

分布式锁实现原理

为什么需要分布式锁&#xff1f; 本地锁synchronized只能锁住当前服务进程&#xff0c;一个本地锁只能锁一个服务&#xff0c;如果是分布式服务情况下使用本地锁&#xff0c;那么多少服务就会有多少进程同时执行&#xff0c;就是去了锁的效果&#xff0c;为了到达分布式情况下…

3.9 流水作业调度问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.我对流水调度问题的理解 流水作业调度问题是动态规划中的一个经典问题&#xff0c;它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的…

go test 包外测试

之前文章有介绍过 go test coverage 单测覆盖率 和Go test基础用法&#xff0c;今天这里主要介绍 go 单测中比较特殊的一种场景&#xff1a;包外测试。初次看到这个名字&#xff0c;我还以为就是单独创建一个新目录&#xff0c;所有的单测用例统一都汇总到这个目录下&#xff0…

【P48】JMeter 断言持续时间(Duration Assertion)

文章目录 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明二、测试计划设计 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明 可以控制取样器的执行是否超过某个时间&#xff0c;如果超时则报错&#xff0c;持续时间断言器也叫超时…