EL表达式(上)

EL表达式

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

2. EL表达式出现在jsp中主要是:
- 从某个作用域中取数据(四个域:pageContext,request,session,application),然后将其转换为字符串,然后将其输出到浏览器,这就是EL表达式的功效。
3. EL表达式基本语法格式:
- $(表达式)


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

<%
  //向request作用域中存储username为zhangsan
  request.setAttribute("username","zhangsan");
%>

<%-- 将request域当中的数据取出来,并且还要输出到浏览器,使用java代码怎么办--%>
<%=request.getAttribute("username") %>

在这里插入图片描述

以上是用JSP在浏览器打印输出zhangsan,后面加EL表达式后

<%-- 使用EL表达式--%>
${username}

在这里插入图片描述

举例

  • 写一个javabean类,user
package com.bjpowernode.javaweb.servlet;

public class User {
    private String username;
    private String password;
    private int age;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }

    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

  • JSP中调用 输出到浏览器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.bjpowernode.javaweb.servlet.User" %>

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

    //将User对象存储到request对象
    request.setAttribute("userObj",user);
%>

<%-- 使用EL表达式从request域中,取出User对象,并将其输出到浏览器--%>
${userObj}

<%--想输出的是user对象的username属性 --%>
${userObj.username}

<%--输出password--%>
${userObj.password}

<%--输出年龄age--%>
${userObj.age}

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e1c07ec62e6e4903b48802a43dd1a193.png

注意
比如${userObj.email},javabean中可以没有email属性,但是一定有email的get方法
在这里插入图片描述

4. a b c 和 {abc}和 abc{“abc”}的区别

  • ${abc}表示从某个域中取出数据,并且被取的这个数据的name是“abc”,之前一定有这样的代码:域.setAttribute(“abc”,对象);
  • ${“abc”}表示直接将“abc”当作普通字符串输出到浏览器,不会从某个域中取数据了。
  • ${userObj}底层是怎么做的?从域中取数据,取出user对象,然后调用user对象的toString方法,转换称字符串,输出到浏览器。
  • 输出对象的属性值 ${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法

5.

  • EL表达式默认优先从小的域取数据,从小到大依此是pageContext<request<session<application,如下面代码,会先取pageContext中的data,也可以自己指定从哪个域中取,如下面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    //四个域都存储了数据,并且name相同
    session.setAttribute("data","session");
    request.setAttribute("data","request");
    pageContext.setAttribute("data","pageContext");
    application.setAttribute("data","application");
%>
${data}

<%--在没有指定范围的情况下,但在EL表达式中可以指定范围读取数据--%>
<%--EL表达式有4个隐含的范围对象   pageScope requestScope sessionScope applicationScope--%>


${pageScope.data}
${requestScope.data}
${sessionScope.data}
${applicationScope.data}

注意:在实际开发中,因为向某个域中存储数据时候,name都是不同的,所以XXXScope都是可以省略的

6.
当jsp中出现错误时,如以下代码,存入username-zhangsan,取的时候输入错误,因此EL表达式设计更好,对出错进行了处理,在浏览器上显示空白

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    request.setAttribute("username","zhangsan");
%>
<%= request.getAttribute("username")%>
采用EL表达式: ${username}


<%--username 输入错误导致在浏览器上的输出什么 JSP输出nullEL表达式输出空白--%>
<%= request.getAttribute("usernam")%>
采用EL表达式: ${usernam}

在这里插入图片描述

注意:${usernam} 这个EL表达式等同于这一段java代码 <%=request.getAttribute(“usernam”)==null ? " " : request.getAttribute(“usernam”)%>

7.
EL表达式取数据的时候有两种形式:

  • 第一种: . (大部分使用这种方式)
  • 第二种: [ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用[ ])
    如: request.setAttribute(“abc.def”,“zhangsan”);
    ${requestScope.abc.def } 这样是无法取值的
    应该是 ${requestScope[“abc.def”]}

8.
掌握使用EL表达式,怎么从Map集合中取数据

 -  ${map.key}

掌握使用EL表达式,怎么从数组中取数据

 -  ${数组[0]}

掌握使用EL表达式,怎么从list中取数据

- ${list[0]}

9.

page指令当中,有一个属性,可以忽略EL表达式

- <%@page contentType="text/html;charset=UTF-8" isELIgnored="true"  表示忽略EL表达式


- isELIgnored=“false” 表示不忽略EL表达式(默认)
- 忽略某一个EL表达式 前面加“\”

10.
根据EL表达式获取应用的根
在EL表达式中没用request这个隐式对象。requestScope这个只代表“请求范围”,不等同于request对象。在EL表达式当中有一个隐式对象:pageContext
EL表达式中的pageContext和JSP中的九大内置对象pageContext是同一个对象

<%=(HttpServletRequest)pageContext.getRequest().getContextPath()%>
这段java代码对应的EL表达式,获取应用的根路径
${pageContext.request.contextPath} 

11.
EL表达式中其他隐式对象:
- param
- paramValues
- initParam

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#让三个线程按照顺序执行

现实的例子 三个线程都是while&#xff08;true&#xff09;的循环体 A线程&#xff1a;采集数据 B线程&#xff1a;画曲线 C线程&#xff1a;存数据库 AutoResetEvent类 AutoResetEvent 是一个线程同步的类&#xff0c;它提供了一种机制&#xff0c;允许一个或多个线程等待直…

Android 12.0 通知--PendingIntent源码分析

结论: PendingIntent 是延迟触发的一种 Intent , 通过上图的过程看,PendingIntent 的执行,是一种跨进程通信.首先创建PendingIntent对象时,就把该对象定义到 ActivityManagerService, 到执行 PengdingIntent 动作时, 也是在 ActivityManagerService 找到 目标PengdingIntent, 从…

科研绘图(三)百分比堆叠线条图

百分比堆叠线条图是一种数据可视化工具&#xff0c;它结合了堆叠面积图和线条图的特点。在这种图表中&#xff0c;时间序列数据被分成几个部分&#xff0c;每个部分代表一个类别&#xff0c;所有类别的值加起来总和为100%。这种图的每个点的堆叠区域代表不同类别在特定时间点的…

TypeScript学习笔记、鸿蒙开发学习笔记

变量定义方式 # 变量声明 let msg: string douzi console.log(msg) let num: number 20 console.log(num) let end: boolean true console.log("end" end) let a: any 10 a douzi console.log(a) let p {name:"douzi",age:20} console.log(p.name)…

神经网络|张量tensor(待完善)

文章目录 tensor/张量什么是tensor&#xff1f;如何用代码实现tensortensor在神经网络中的应用 其他 tensor/张量 什么是tensor&#xff1f; 张量是用来探究一个点在各个切面&#xff08;一共三个切面&#xff09;和各个方向&#xff08;x&#xff0c;y&#xff0c;z三个方向&…

AI语音机器人的发展

第一代AI语音机器人具体投入研发的开始时间不太清楚&#xff0c;只记得2017年的下半年就已经开始接触到成型的AI语音机器人&#xff0c;并且正式商用。语音识别效果还不多&#xff0c;大多都是接入的科大讯飞或者百度的ASR。 2018年算是AI语音机器人的“青春期”吧&#xff0c;…

LVS 负载均衡群集

本章展示&#xff1a; 了解群集的结构与工作模式 了解 LVS 负载均衡群集原理 学会配置 NFS 共享服务 学会构建 LVS-NAT 负载均衡群集 1.1 LVS 群集应用基础 群集的称呼来自于英文单词“Cluster”&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表 示大量服务…

Docker五部曲之二:Docker引擎

文章目录 前言Docker引擎镜像管理容器管理容器运行前台运行和后台运行容器识别重启策略清除 容器日志 数据管理卷挂载创建和管理卷启动带有卷的容器通过Docker Compose使用卷使用只读卷备份、恢复和迁移卷 绑定挂载用绑定挂载启动一个容器Docker Compose使用绑定挂载使用只读绑…

数据仓库研发规范

数据仓库研发规范 本文将介绍数据仓库研发规范的阶段规划、角色职责和整体流程。 在大数据时代&#xff0c;规范地进行数据资产管理已成为推动互联网、大数据、人工智能和实体经济深度融合的必要条件。贴近业务属性、兼顾研发各阶段要点的研发规范&#xff0c;可以切实提高研…

DCP文件传输的重要性与应用

在数字时代&#xff0c;文件传输已成为商业运作中不可或缺的一环。随着企业越来越多地采用云基础设施和服务&#xff0c;有效地在云和团队之间传输大文件和数据集变得至关重要。在这一背景下&#xff0c;数据复制协议&#xff08;DCP&#xff09;文件传输应运而生&#xff0c;引…

学习Vue封装的过渡与动画总结

今天学习了Vue封装的过渡与动画&#xff0c;接下来说一下Vue是如何实现的&#xff0c;首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画&#xff0c;但Vue就不需要直接获取到需要过渡或动画的元素&#xff0c;而是使用一个<transition>的标签来包裹住想要过…

K8s:Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#xff08;post st…

Netty开发弹幕系统

用Nettywebsocket实现简单的web弹幕系统 服务端代码 1. pom依赖 <!-- Netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.66.Final</version></dependency><!-- N…

基于opencv的指针式仪表的识别与读数

对于指针式仪表的识别与读数&#xff0c;可以通过以下步骤使用OpenCV实现&#xff1a; 读取图像&#xff1a;使用cv2.imread()函数读取要处理的仪表图像。 灰度转换&#xff1a;使用cv2.cvtColor()函数将彩色图像转换为灰度图像。这是因为灰度图像只有一个通道&#xff0c;便…

Nginx负载均衡以及常用的7层协议和4层协议的介绍

一、引言 明人不说暗话&#xff0c;下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。 二、nginx负载均衡的作用 高并发&#xff1a;负载均衡通过算法调整负载&#xff0c;尽力均匀的分配应用集群中各节点的工作量&#xff0c;以此提高应用集群的并发处理能力…

flutter在windows环境搭建

下载flutter https://flutter.cn/docs/development/tools/sdk/releases 下载相应的版本 我放在C盘下&#xff1a; 环境变量 再加系统变量&#xff1a; PUB_HOSTED_URLhttps://pub.flutter-io.cn 如图 FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 完成

[自动驾驶算法][从0开始轨迹预测]:一、坐标和坐标系变换

既然要从0开始轨迹预测&#xff0c;那从哪开始写起呢&#xff1f;回想下自己的学习历程&#xff0c;真正有挑战性的不是模型结构&#xff0c;不是繁琐的训练和调参&#xff0c;而是数据的制作&#xff01;&#xff01;&#xff01; 笔者自认为不是一个数学基础牢固的人&#xf…

Photoshop 2024 (PS2024) v25 直装版 支持win/mac版

Photoshop 2024 提供了多种创意工具&#xff0c;如画笔、铅笔、涂鸦和渐变等&#xff0c;用户可以通过这些工具来创建独特和令人印象深刻的设计效果。增强的云同步&#xff1a;通过 Adobe Creative Cloud&#xff0c;用户可以方便地将他们的工作从一个设备无缝同步到另一个设备…

Docker之数据卷的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之数据卷的使用》。&#x1f3af;&#x…

《GreenPlum系列》GreenPlum初级教程-03GreenPlum系统管理

文章目录 第三章 GreenPlum系统管理1.关于GreenPlum数据库发布版本号2.启动和停止GreenPlum数据库2.1 启动数据库2.2 重启数据库2.3 仅重新载入配置文件更改2.4 停止GreenPlum数据库2.5 停止客户端进程 3.GreenPlum数据库状态查询4.访问GreenPlum数据库4.1 数据库会话参数4.2 支…