EL表达式学习笔记

文章目录

  • EL 表达式是干什么用的
  • EL 表达式的底层原理
  • EL 表达式可以用在哪些地方
  • EL 表达式用来访问 JavaBean 的属性
  • EL 表达式获取请求参数的值
  • EL 表达式用于运算,将结果作为标签的属性值或者直接输出
  • Struts2 的 EL 表达式
  • EL 表达式翻译为 Java 代码的含义
  • EL 表达式示例
  • EL 表达式用在 xml 文件中

EL 表达式是干什么用的

EL 表达式的全称是 Expression Language,是一种表达式语言。 其语法格式:${el表达式}

EL 表达式可以直接使用,并不需要额外的配置或者引入什么文件。

EL 表达式依次从 pageContext、request、session、application 四个隐含对象中找到指定绑定名称对应的对象,然后获取对象的属性值直接输出到页面中,或者获取对象的属性值后再进行计算,将最后的结果输出到页面中。

EL 表达式经常用来给 JSTL 标签的属性赋值。

EL 表达式用字符串表达式替换 Java 代码,用来表示对数据的获取或计算。EL 表达式解决了 Java 代码和 HTML 的不匹配问题(让 HTML 页面中不再有 Java 代码)。

EL 表达式的底层原理

当 JSP 转换成对应的 Servlet 类时,会在 service 方法体内生成 EL 表达式对应的 Java 代码。这段 Java 代码就是依次调用 pageContext、request、session、application 对象的 getAttribute() 方法,然后将获取到的数据作为 out 对象的 print() 方法的实参,最终输出到页面中。

EL 表达式可以用在哪些地方

EL 表达式不可以在 JS 语境中使用,即不能在 </script> 标签体内使用。

EL 表达式不可以在 Java 语境中使用。

EL 表达式可以使用在 JSP、XML、HTML 等文件中,在这些文件中 el 表达式可以单独使用。

EL 表达式经常和 JSTL 标签结合使用,用在标签的属性值中,用来给标签属性赋值。

EL 表达式可以用在 HTML 标签的属性值中。

具体参见《EL 表达式教程》。

EL 表达式用来访问 JavaBean 的属性

示例:${user.name}

JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为"user" 的对象,如果找到了,就不再向下查找;否则,继续向下查找。找到后,调用该对象的 getName(),并输出其值;找不到,则输出"" (空)。

或者也可以使用 ${user["name"]} , 效果相同 "name" 表示字符串。

或者是 ${user[propname]},注意 propname 没有引号,表示变量。

此外,[] 里面还可以是 0,1,2… 这样的下标,作用是输出数组里的元素值。

可以使用 pageScope,requestScope,sessionScope,applicationScope 四个关键字指定查找的范围。例如:${requestScope.user.name}只到 request 中去找,不再依次到 4 个范围查找了。

示例代码:

<%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 15:42To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="priv.lwx.el.bean.*" %>
<html>
<%--访问bean的属性--%>
<head><title>Title</title>
</head>
<body style="font-size:30px;">
<%User user = new User();user.setName("liaowenxiong");user.setAge(22);IdCard card = new IdCard();card.setCardNo("100");user.setCard(card);user.setInterest(new String[]{"fishing", "sleep"});request.setAttribute("user1", user);
%>
<%--基本类型--%>
${user1.name}<br/>
${user1["name"]}<br/>
${user1.age}<br/>
<%--引用类型--%>
${user1.card.cardNo}<br/><%request.setAttribute("propname", "name");
%>
${user1[propname]};<br/>
<%--输出数组元素值--%>
${user1.interest[1]}
user's name:${requestScope.user1.name}
</body>
</html>

EL 表达式获取请求参数的值

${param.username} 等价于 request.getParameter("username");

${paramValues.interest} 等价于 request.getParameterValues("interest");

<%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 16:14To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<%--获取请求参数值--%>
<head><title>Title</title>
</head>
<body style="font-size:30px;">
username:${param.username}<br/>
interest:${paramValues.interest[0]}
interest:${paramValues.interest[1]}
interest:${paramValues.interest}
</body>
</html>

EL 表达式用于运算,将结果作为标签的属性值或者直接输出

<%--Created by IntelliJ IDEA.User: liaowenxiongDate: 2022/2/4Time: 16:29To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.servlet.jsp.*" %>
<html>
<head><title>Title</title>
</head>
<body style="font-size:30px;">
<%--算术运算--%>
${1+2}<br/>
${"245"+"456"}<br/>
<hr>
<%--关系运算--%>
${"abc" == "abc"}
${"abc" eq "abc"}
<hr>
<%pageContext.setAttribute("str", "abc");
%>
<%--el表达式会从pageContex对象中获取到属性str的值,然后再和字符串"abc"比较,最后将比较结果输出到页面中--%>
${"abc" eq str}<br/>
<%--empty运算--%>
<%request.setAttribute("str1", "");List list = new ArrayList();request.setAttribute("list1", list);request.setAttribute("obj1", null);
%>
<%--空字符串的结果为true--%>
${empty str1}<br>
<%--找不到指定绑定名对应的对象,结果为true--%>
${empty obj}<br>
<%--集合内容为空,结果为true--%>
${empty list1}<br>
<%--null,结果为true--%>
${empty obj1}<br>
</body>
</html>

Struts2 的 EL 表达式

Struts2 的 V 层组件一般是 JSP 文件,在 JSP 文件中可以通过 el 表达式、ognl 表达式、jstl 标签库、struts2 提供的标签来获取 Action 组件中的属性值。

使用 el 表达式不需要引入额外的 jar 包;要使用 ognl 表达式,要引入 ognl-2.7.3.jar 包;要使用 jstl 标签,要引入 jstl.jarstandard.jar 包并且在 JSP 文件中要使用指令引入 jstl 标签库。在 Struts2 项目中使用 Struts2 的标签不要引入额外的 jar 包,但是 JSP 文件中需要使用指令引入 Struts2 的标签库。

其实 struts.xml 中配置的 V 层组件,默认情况下控制器是通过转发的机制去调用的,按道理说控制器可以将 Action 组件的属性值先绑定到 request 对象中,再转发给某个 jsp 文件,那么 jsp 中的 el 表达式就可以从 request 对象中找到数据了。实际情况并非如此的。

在 Struts2 的项目中,JSP 文件中获取到 request 对象并不是服务器生成的,而是 Struts2 提供的包装类 StrutsRequestWrapper 的对象,这个包装类实际上是 HttpServletRequest 的衍生类,StrutsRequestWrapper 类重写了 getAttribute() 方法,这个方法会先去访问服务器生成的 request 对象,如果获取不到指定属性的值再去访问 ValueStack 对象中的属性 root 和 context。

所以在 Struts2 项目中,el 表达式表面还是去访问 pageContext、request、session、application 四个对象获取指定属性的值。只不过在访问 request 对象时,底层是先去访问服务器生成的原始 request 对象,获取不到再去访问 ValueStack 对象的属性 root 和 context。

如果按标准 el 表达式访问的域对象来排序,Struts2 中的 el 表达式访问域对象的实际顺序是:
pageContext、request、ValueStack、session、application

所以在 Struts2 项目中,el 表达式如果无法从 pageContext、request 对象获取到数据,那么就会执行以下的代码去访问 ValueStack:

Object obj = Ognl.getValue("OGNL表达式",root,context);

el 表达式 ${author},可以获取到 Action 对象的 author 属性值,其实是调用该 Action 对象 getAuthor() 方法,如果 Action 类中没有定义变量 author,却有 getAuthor() 方法,${author} 最后也会调用 Action 对象的 getAuthor() 方法。

总结:Struts2 的 el 表达式底层有去调用 Ognl 引擎,访问 ValueStack 的属性 root 和 context,而且访问 context 获取指定属性的值并无需在属性名前加 #

EL 表达式翻译为 Java 代码的含义

举例说明下:
${foo.name} 翻译为 Java 代码是 out.print(foo.getName());,意味着调用对象 foogetName() 方法,而非直接访问对象 foo 的实例变量 name,同时注意实例变量一般是私有的,不能直接访问。

另外,JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为“foo”的对象。

注:其实 out.write()out.print() 都是先把 html 文本数据输出到 response 对象中,然后 web 服务器再把 response 对象中的数据响应个浏览器端进行加载和解析,最后显示出来给用户看。

EL 表达式示例

EL 表达式:${empty str1}
JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为“str1”的对象,如果找到了就不再向下查找,否则继续向下查找。找到后判断值是否为空,如果是空字符串,则返回 true,如果是个空集合,也返回 true,如果找不到绑定名为“str1”的对象,也返回 true,如果是 null,也返回 true。再将 true 这个值输出到页面中,最后响应给浏览器显示出来。

EL 表达式:${user.name}${user["name"]}

JSP 引擎会依次从 pageContext、request、session、application 查找绑订名为"user" 的对象,如果找到了,就不再向下查找;否则,继续向下查找。找到后,调用该对象的 getName(),并输出其值;找不到,则输出"" (空)。

EL 表达式:${requestScope.user.name}

表示只到 request 中查找,不再依次从 pageContext、request、session、application 查找。

EL 表达式用在 xml 文件中

在 Struts2 项目中,我们在 struts.xml 文件中可以使用 EL 表达式获取属性值,如下所示:

<action name="user" class="priv.lwx.struts2.UserAction"> <result name="success" type="dispatcher">/WEB-INF/jsp/user.jsp?userId=${user.userId}</result>
</action>

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

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

相关文章

【WebRTC---源码篇】(十二)WebRTC/RTX协议

在SDP中可以查询到提前协商好的RTX信息 接受到RTCP NACK 重传RTX包,有效荷载前两个字节为原始seqnumber 如何知道重传的是哪个包 发送RTX

stackoverflow_Stackoverflow:您尚未发现的7个最佳Java答案

stackoverflow您可以在Stackoverflow上找到哪些最有趣的答案&#xff1f; Stackoverflow是开发人员的金矿。 它可以帮助我们找到遇到的特定问题的最有用答案&#xff0c;并且我们总是从中学习新事物。 在以下文章中&#xff0c;我们研究了最受欢迎的Java问题和答案&#xff0…

json请求 post vue_Spring Boot+Vueaxios异步请求数据的12种操作(上篇)

Java大联盟致力于最高效的Java学习关注Spring Boot Vue 前后端分离最核心的操作就是通过异步请求完成数据同步&#xff0c;这其中又可以分为很多种不同的情况&#xff0c;比如是 GET 请求还是 POST 请求&#xff1f;参数是普通变量还是 JSON&#xff1f;基于 RESTful 架构如何…

数据库SQL语言分类(DDL/DML/DQL/TCL/DCL)

文章目录一、数据定义语言 DDL&#xff08;一&#xff09;create 数据库对象的创建&#xff08;二&#xff09;alter 修改数据库对象&#xff08;三&#xff09;drop 删除数据库对象&#xff08;四&#xff09;truncate 清空表数据二、数据操纵语言 DML&#xff08;一&#xff…

【WebRTC---源码篇】(十三)WebRTC/Pacer

pacer作用 NextSendTime Timestamp PacingController::NextSendTime() const {Timestamp now = CurrentTime();if (paused_) {return last_send_time_ + kPausedProcessInterval;}// If probing is active, that always takes priority.if (prober_.IsProbing()) {Timest…

卡夫卡如何分区_通过分区在卡夫卡实现订单担保人

卡夫卡如何分区Kafka最重要的功能之一是实现消息的负载平衡&#xff0c;并保证分布式集群中的排序&#xff0c;否则在传统队列中是不可能的。 首先让我们尝试了解问题陈述 让我们假设我们有一个主题&#xff0c;其中发送消息&#xff0c;并且有一个消费者正在使用这些消息。 …

全景视觉空间直线检测_视觉SLAM深度解读

近年来&#xff0c;SLAM技术取得了惊人的发展&#xff0c;领先一步的激光SLAM已成熟的应用于各大场景中&#xff0c;视觉SLAM虽在落地应用上不及激光SLAM&#xff0c;但也是目前研究的一大热点&#xff0c;今天我们就来详细聊聊视觉SLAM的那些事儿。视觉SLAM是什么&#xff1f;…

HTTP网页请求响应的状态码/状态代码

文章目录1开头 询问客户端是否还有请求消息2开头 &#xff08;请求成功&#xff09;表示成功处理了请求的状态代码3开头 &#xff08;请求被重定向&#xff09;表示要完成请求&#xff0c;需要进一步操作。 通常&#xff0c;这些状态代码用来重定向4开头 &#xff08;请求错误&…

某人想在h小时内钓到_为某人命名以重新连接到您的服务器

某人想在h小时内钓到在进行测试自动化时&#xff0c;通常需要知道当前计算机的名称&#xff0c;以提示另一台计算机连接到它&#xff0c;特别是在并行运行测试的情况下。 本周&#xff0c;我试图对服务器进行测试&#xff0c;以使其连接回在从属测试计算机上运行的WireMock服务…

对象必须实现 iconvertible。_java面向对象最全入门笔记(通俗易懂,适合初学者)...

前言:面向对象的三大特征封装 (Encapsulation)继承 (Inheritance)多态 (Polymorphism)编程思想&#xff1a;面向过程&#xff1a;做某件事情都需要自己亲历亲为&#xff0c;按照步骤去完成面向对象&#xff1a;做某件事情不需要自己亲历亲为&#xff0c;只需指定特定的对象去完…

C++ 【随想录】(一)模拟矩阵相乘

#include<iostream> using namespace std; const int N 105; int R1[N][N], R2[N][N], ans[N][N];int main() {int m, p, n;cin >> m >> p >> n;for (int i 0; i < m; i) {//录入第一个矩阵for (int j 0; j < p; j) {cin >> R1[i][j];}…

HH SaaS电商系统的结算系统设计

文章目录一、第三方卖家销售货款结算流程说明&#xff1a;销售货款结算逻辑流程图预期收入如何统计二、第三方卖家推广分销佣金结算佣金结算逻辑流程图逾期佣金收入如何统计三、采购货款结算租户采购货款结算流程说明商城采购货款结算流程说明店铺商家的采购货款结算流程说明四…

java8并行流_Java 8:CompletableFuture与并行流

java8并行流这篇文章展示了Java 8的CompletableFuture在执行异步计算时如何与并行流进行比较。 我们将使用以下类对长时间运行的任务进行建模&#xff1a; class MyTask {private final int duration;public MyTask(int duration) {this.duration duration;}public int calc…

postgresql删除索引_PostgreSQL 13 发布,索引和查找有重大改进

9月24日&#xff0c;PostgreSQL全球开发组宣布PostgreSQL 13正式发布&#xff0c;作为世界上使用最多的开源数据库之一&#xff0c;PostgresSQL 13是目前的最新版本。PostgreSQL 13 在索引和查找方面进行了重大改进&#xff0c;有利于大型数据库系统&#xff0c;改进包括索引的…

【WebRTC---源码篇】(十六)WebRTC/NetEQ

WebRTC【4096版本】 NetEQ的作用 进行抖动控制和丢包隐藏,通过该技术可以让音频更平滑 NetEQ插入packet数据 int NetEqImpl::InsertPacketInternal(const RTPHeader& rtp_header,rtc::ArrayView<const uint8_t> payload) {//如果有效荷载payload为空if (paylo…

HH SaaS电商系统的销售订单设计

文章目录订单销售类型订单优惠优惠方式子订单优惠金额订单拆单订单发货销售订单拆单逻辑图销售订单的信息结构相关实体订单运营类型&#xff08;作废&#xff09;售后截止时间订单状态状态机的设计不同属性组合下的订单状态组合1&#xff1a;实物线上非预售非定制非拼单快递组合…

kafka netty_惠而浦:使用Netty和Kafka的微服务

kafka netty介绍 在上一个博客中 &#xff0c;我介绍了Netty用作Web服务器。 该示例运行良好……只要需要广播服务器即可。 大多数情况下不是很有用。 更有可能的是&#xff0c;每个客户端仅接收针对其的数据&#xff0c;并保留了特殊情况下的广播&#xff0c;例如“服务器在1…

HH SaaS电商系统的拼团系统设计

文章目录拼团业务流程拼团单实体拼团单的状态拼团型订单的销售状态注意点拼团业务流程 创建活动 管理后台创建拼团活动&#xff0c;设置好活动有效期、成团人数、成团时效、限购数量、活动对象、添加活动商品&#xff0c;设置团长价和团员价&#xff0c;活动开始后活动对象在买…

统信uos系统考试题_离Windows更近一步!微信Linux原生版上线:国产统信UOS系统已适配...

就在本月11号&#xff0c;国产操作系统-统信 UOS发布了专业版 V20(1030)&#xff0c;功能更强大&#xff0c;同时性能和安全性均有所提升。而距离这个好消息过去没多久&#xff0c;统信软件官方再次发布了一个好消息&#xff1a;那就是微信桌面客户端(统信 UOS 版)研发完成&…