板块二 JSP和JSTL:第四节 EL表达式 来自【汤米尼克的JAVAEE全套教程专栏】

板块二 JSP和JSTL:第四节 EL表达式

  • 一、什么是表达式语言
  • 二、表达式取值
      • (1)访问JSP四大作用域
      • (2)访问List和Map
      • (3)访问JavaBean
  • 三、 EL的各种运算符
      • (1).和[ ]运算符
      • (2)算数运算符
      • (3)比较运算符
      • (4)逻辑运算符
      • (5)条件运算符和empty运算符

在上一节中,我们学习了JSP的四大域对象,可是既然这四个域对象在Servlet中可以起到一模一样的作用,为什么我们还要在JSP里书写冗长的代码呢?其实JSP还有秘密武器:表达式语言(Expression Language)简称EL,它可以大幅度的减少JSP里的Java代码,这样来操作域对象就会变得格外优雅

一、什么是表达式语言

EL原本是JSTL 1.0为方便存储数据所自定义的语言,如今以及成了JSP标准的一部分,是一项成熟、标准的技术
由于JSP在整个Web程序中处于表示层,主要用于显示页面内容,在开发领域页面的设计会由专业的前端工作者完成,通常这些设计人员对Java编程不甚了解,所用的工具是HTML,因此在JSP中嵌入大量的Java源代码不利于开发的效率。为了解决这个问题,JSTL标记库应运而生,而EL就是JSTL的基础
EL的语法结构非常简单,举个栗子,观察下面代码

User user = (User)session.getAttribute("user");
String sex = user.getSex();
out.print(sex);

其作用就是从Session中得到User对象,然后在网页上印user中的sex属性
如果使用EL,要实现同样的逻辑进行表达就会变成这样

${sessiomScope.user.sex}

它的意思是,从Session作用域中取得user对象的sex属性,然后在网页上打印出来,怎么样,是不是非常简便?
其实EL的基本语法结构就是

${expression}

有几点重要注意事项:

  • EL表达式一般操作的都是域对象中的数据操作不了局部变量
  • 还记得上一节总结的四大鱼对象吗?EL表达式在取域对象中的数据时,范围是page->request->session->application从小到大取的,一旦有同名变量就取走了
  • 如果EL表达式获取对象的值为,默认显示空字符串

二、表达式取值

(1)访问JSP四大作用域

EL表达式取四个作用域里的值有对应的名称

作用域名称
PagepageScope
RequestrequestScope
SessionsessionScope
ApplicationapplicationScope

实例,在hello.jsp中写入测试代码,分别在Session和Application作用域中存取数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><%session.setAttribute("sessMsg","这里是session作用域");application.setAttribute("appMsg","这里是application作用域");%>${sessionScope.sessMsg} <br>${applicationScope.appMsg}</body>
</html>

启动服务器,在浏览器中访问hello.jsp,可得
在这里插入图片描述

(2)访问List和Map

在表达式中可以用${list[num]}来直接访问List中的某位元素(list是数组的自定义名字)
实例,在hello.jsp中写入

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><%// ListList<String> list =new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");request.setAttribute("list", list);%>// list是数组的名字获取List的size:${list.size()}<br>获取List的指定下标的值:${list[1]}<br></body>
</html>

启动服务器,在浏览器中访问hello.jsp可得
在这里插入图片描述


同样可以用${map.}${map[]}来直接访问Map中的某对键值对(map是数组的自定义名字)
实例,在hello.jsp中写入

<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><%// MapMap map =new HashMap();map.put("aaa","111");map.put("bbb",222);map.put("ccc",33);request.setAttribute("map",map);%>获取Map的某对键值对:${map.aaa} <br>获取Map的某对键值对:${map["bbb"]}</body>
</html>

启动服务器,在浏览器中访问hello.jsp可得
在这里插入图片描述

在代码中我们发现实际上List和Map是存在Request作用域中的,但在用表达式取值时居然没有写requestScope.前缀也能拿到,其实此时表达式访问List和Map是在四个作用域中由从小到大的范围寻找的,所以也可以省略作用域前缀,如果加上前缀就是只在指定作用域中寻找

(3)访问JavaBean

JavaBean一般由Servlet实例化,由JSP显示其中的内容
什么?你问我什么是JavaBean?举个栗子,你肯定见过,简单来说就是一个public修饰的Java类里面定义了几个private属性,并且提供了属性相应的get/set方法(如果boolean 则get可以替换成is),它就是JavaBean
实例
com.caijiyuan包下新建一个User类,写入两个属性,并且alt+ins生成两个属性的get/set方法
在这里插入图片描述
再添上一个User类的带参构造函数,总体代码如下

package www.caijiyuan;public class User {private Integer userId;private String uname;public User(Integer userId, String uname) {this.userId = userId;this.uname = uname;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}
}

在hello.jsp中new一个user实例并且传参,别忘了把实例放在Request作用域里

<%@ page import="www.caijiyuan.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><%// UserUser user = new User(1959,"Toomynike");request.setAttribute("user",user);%>获取User的名字:${user.uname} <br>获取UserID:${user.userId}</body>
</html>

启动服务器,在浏览器中访问hello.jsp可得
在这里插入图片描述

三、 EL的各种运算符

(1).和[ ]运算符

EL 提供.[]两种运算符来存取数据。当要存取的属性名称中包含一些特殊字符,就只能使用 [],例如这样书写是错误的

${user.My-Name}

必须写成

${user["My-Name"] }

如果要动态取值时,也必须用[]来做,.无法做到动态取值,例如data是一个变量时

${sessionScope.user[data]}

(2)算数运算符

它们也是直接写在${}中,会直接将运算结果打印出来

算数运算符说明实例打印的结果
+${10+2}12
-${10-2}8
*${10*2}20
/div${10/4}${10div2}2.5
%mod取模${10%4}${10mod2}2

(3)比较运算符

比较运算符返回bool类型

算数运算符说明实例打印的结果
==eq等于${10==2}${10 eq 2}false
!=ne不等于${10!=2}${10 ne 2}true
<lt小于${10<2}${10 lt 2}false
>gt大于${10>2}${10 gt 2}true
<=le小于等于${10<=2}${10 le 2}false
>=ge大于等于${10 >=2}${10 ge 2}true

(4)逻辑运算符

逻辑运算符也是返回bool类型

算数运算符说明实例打印的结果
&&and逻辑与${true && false}或者{ture and false}false
丨丨or逻辑或${fasle 丨丨 true}或者{false or true}true
!not逻辑非${!true}${not ture}false

(5)条件运算符和empty运算符

  • 条件运算符
    A为真则返回B,否则返回C
${A?B:C}
  • empty运算符

A为null\空字符串\空数组返回true,否则返回false

${empty A}

以上就是此小节的全部内容,学会了EL让我们的JSP格外优雅,下一节开始我们将学习JSTL,让JSP既优雅又强大

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

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

相关文章

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

抖音数据抓取工具|短视频下载工具|视频内容提取软件

一、开发背景&#xff1a; 随着抖音平台的流行&#xff0c;越来越多的人希望能够下载抖音视频以进行个人收藏或分享。然而&#xff0c;目前在网上找到的抖音视频下载工具功能单一&#xff0c;操作繁琐&#xff0c;无法满足用户的需求。因此&#xff0c;我们决定开发一款功能强大…

java面试题之mysql篇

1、数据库索引 ​​​​​​​ 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她&#xff0c;则与在表中搜索所有的行相比&#xff0c;索引有助于更快地获取信息。 索引的一个主要…

音视频开发之旅(69)-SD图生图

目录 1. 效果展示 2. ControlNet介绍 3. 图生图流程浅析 4. SDWebui图生图代码流程 5. 参考资料 一、效果展示 图生图的应用场景非常多&#xff0c;比较典型的应用场景有风格转化&#xff08;真人与二次元&#xff09;、线稿上色、换装和对图片进行扩图等&#xff0c;下面…

TCP/IP协议栈:模拟器实现基本的L2和L3功能

在C中实现的TCPI/IP网络堆栈模拟器。该模拟器实现基本的第2层&#xff08;MAC地址&#xff0c;Arp&#xff09;和第3层&#xff08;路由&#xff0c;IP&#xff09;功能。 TCP/IP协议栈是一个网络通信的基础架构&#xff0c;包含了多层次的协议和功能。在模拟实现基本的L2和L3…

神经网络2-卷积神经网络一文深度读懂

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;&#xff0c;主要用于图像识别、语音识别和自然语言处理等任务&#xff0c;是深度学习&#xff0…

使用决策树算法预测隐形眼镜类型

目录 谷歌笔记本&#xff08;可选&#xff09; 编写算法&#xff1a;决策树 准备数据&#xff1a;拆分数据集 测试算法&#xff1a;构造注解树 使用算法&#xff1a;预测隐形眼镜类型 谷歌笔记本&#xff08;可选&#xff09; from google.colab import drive drive.mount…

Springboot之压缩逻辑源码跟踪流程

背景 在项目开发过程中&#xff0c;前后端参数比较多&#xff0c;导致网络传输耗时比较多&#xff0c;因此想将数据压缩传输&#xff0c;以减少网络传输的耗时&#xff0c;从而减少接口的响应时间&#xff0c;可以自己实现&#xff0c;但是spring相关的框架已经内置了该功能&am…

堆排序、快速排序和归并排序

堆排序、快速排序和归并排序是所有排序中最重要的三个排序&#xff0c;也是难度最大的三个排序&#xff1b;所以本文单独拿这三个排序来讲解 目录 一、堆排序 1.建堆 2.堆排序 二、快速排序 1.思想解析 2.Hoare版找基准 3.挖坑法找基准 4.快速排序的优化 5.快速排序非…

Servlet使用Cookie和Session

一、会话技术 当用户访问web应用时&#xff0c;在许多情况下&#xff0c;web服务器必须能够跟踪用户的状态。比如许多用户在购物网站上购物&#xff0c;Web服务器为每个用户配置了虚拟的购物车。当某个用户请求将一件商品放入购物车时&#xff0c;web服务器必须根据发出请求的…

windows实现ip1:port1转发至ip2:port2教程

第一步&#xff1a;创建虚拟网卡(如果ip1为本机127.0.0.1跳过此步骤)&#xff0c;虚拟网卡的IPV4属性设置ip1 1> 创建虚拟网卡参见 Windows系统如何添加虚拟网卡&#xff08;环回网络适配器&#xff09;_windows添加虚拟网卡-CSDN博客​​​​​​ 2> 设置虚拟网卡使用…

【Go的函数】

函数 函数的引入函数细节祥讲包的引入包的细节详讲init函数匿名函数闭包defer关键字系统函数字符串相关函数日期和时间相关函数内置函数 函数的引入 【1】为什么要使用函数&#xff1a; 提高代码的复用&#xff0c;减少代码的冗余&#xff0c;代码的维护性也提高了 【2】函数…

简单mock server模拟用户请求给小程序提供数据

整理小程序代码时发现一此小程序离开了mock-server基本上没有办法显示了,因此用node,express来满足给小程序提供演示数据的功能 const express require(express); const { createCanvas, Image } require(canvas); const fs require(fs); const path require(path);…

Python爬虫实战:图片爬取与保存

引言&#xff1a; 在本文中&#xff0c;我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求&#xff0c;BeautifulSoup库来解析HTML页面&#xff0c;以及os和shutil库来下载和保存图片。通过这个教程&#xff0c;你将学会如何爬取网…

你要不要搞副业

最近看到了几个网友关于年轻人要不要搞副业的一点讨论&#xff0c;学习到了很多。整理分享如下&#xff1a; plantegg 你要不要搞副业&#xff1f; 最近网上看到很多讨论搞副业和远程工作的&#xff0c;我也说点自己的经验看法 当然这完全是出于个人认知肯定不是完全对的、也…

day4:对话框与事件

使用qt搭建一个简易的闹钟系统 #include "second.h" #include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt::…

《高效使用Redis》- 由面试题“Redis是否为单线程”引发的思考

由面试题“Redis是否为单线程”引发的思考 很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f…

手把手教你Jenkins整合Jmeter实现自动化接口测试!

01、在机器上安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改jmeter.properties 中 jmeter.save.saveservice.output_format值为xml。 编写接口测试脚本&#xff1a; 脚…

在Win11上部署Stable Diffusion WebUI Forge

Stable Diffusion WebUI Forge 是 Stable Diffusion WebUI&#xff08;基于 Gradio&#xff09;之上的平台&#xff0c;可简化开发、优化资源管理并加快推理速度。“Forge”这个名字的灵感来自“Minecraft Forge”。这个项目旨在成为SD WebUI的Forge。 与原始 WebUI&#xff0…

掌握Pillow:Python图像处理的艺术

掌握Pillow&#xff1a;Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…