EL

三、  EL

1.  EL 简介

* 什么是 EL?
1. EL(Expression Language,即:表达式语言),是一种简单的语言,提供了在 JSP 中简化 JSP 表达式的方法
2. 目的是为了尽量减少 JSP 页面中的 Java 代码,使得 JSP 页面的处理程序编写起来更加简洁,便于开发和维护
3. 所有 EL 表达式的格式都是以 “${}” 表示
4. 注意:<%@ page isELIgnored="true" %> 表示是否禁用 EL 语言,TRUE 表示禁止,FALSE 表示不禁止。JSP2.0 中是默认的启用 EL 语言的
5. 全局禁用 EL 表达式,在 web.xml 中进行如下配置:
<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <el-ignored>true</el-ignored>
  </jsp-property-group>
</jsp-config>

* EL 表达式提供 “.“ 和 “[ ]“ 两种运算符来存取数据
1. 注意:当要存取的属性名称中包含一些特殊字符,如 . 或 - 等非字母或数字的符号,就一定要使用 “[ ]“ ,如:
${user.My-Name} 应当改为 ${user["My-Name"]}
2. 如果要动态取值时,就可以用 “[ ]“ 来做,而 “.“ 无法做到动态取值,如:
${requestScope.list[i]} 中的 i 是一个变量

* EL 表达式获取变量数据的方式
1. JSP 四大作用域对象在 EL 表达式中属性(范围)名称:
1)pageContext:pageScope
2)request:requestScope
3)session:sessionScope
4)application:applicationScope
2. 当 EL 表达式中的变量没有给定作用域范围时,则默认在 page 范围查找,然后依次在 request、session、application 范围查找
a.假如途中找到了变量,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传 ""
b.我们会发现 EL 在查找未给定范围的变量的查询顺序是根据作用域从小到大进行查找

* EL 表达式中的逻辑运算
  1. ${逻辑表达式}:&&,||,!
  2. ${算数表达式}:+,-,*,/
  3. ${关系表达式}:>,<,==,>=,<=,!=,%
  4. ${A?B:C}:三目运算
5. ${empty 变量名}:EL 表达式的空值判断,判断指定变量是否存有数据
  6. 注意:"+" 表示加法运算,不代表字符连接,在 EL 表达式中使用 "+" 进行字符连接会报错

2.  EL 表达式中的 11 个隐式对象

* 1. 对于什么是隐式对象,在介绍 JSP 的九大内置对象中也说到过,隐式对象就是开发者可以直接使用它们而不用显式声明

1)pageContext 对象:JSP 页面的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等
a.如:${pageContext.response} 返回页面的响应对象

2)pageScope 对象:将当前 JSP 页面范围的变量名称映射到其值
a.如:使用 ${pageScope.objectName} 访问当前 JSP 页面范围的对象
b.如:使用 ${pageScope.objectName.attributeName} 访问当前 JSP 页面范围的对象的属性值

3)requestScope 对象:将请求范围的变量名称映射到其值
a.如:使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象
b.如:使用 ${requestScope.objectName.attributeName} 访问一个 JSP 请求范围的对象的属性值

4)sessionScope 对象:将会话范围的变量名称映射到其值
a.如:${sessionScope.objectName}
b.如:${sessionScope.objectName.attributeName}

5)applicationScope 对象:将应用程序范围的变量名称映射到其值

6)param 对象:将请求参数名称映射到单个字符串
a.底层通过调用 ServletRequest.getParameter(String name) 方法获得
b.表达式 ${param.name} 相当于 request.getParameter(name);

7)paramValues 对象:将请求参数名称映射到一个 String 类型的数组
a.底层通过调用 ServletRequest.getParamterValues(String name) 方法获得
b.表达式 ${paramvalues.name} 相当于 request.getParamterValues(name);

8)header 对象:将请求头名称映射到单个字符串
a.底层通过调用 ServletRequest.getHeader(String name) 方法获得
b.表达式 ${header.name} 相当于 request.getHeader(name);

9)headerValues 对象:将请求头名称映射到一个枚举集合
a.底层通过调用 ServletRequest.getHeaders(String name) 方法获得
b.表达式 ${headerValues.name} 相当于 request.getHeaders(name);

10)cookie 对象:将 cookie 名称映射到单个 cookie 对象
a.向服务器发出的客户端请求可以获得一个或多个 cookie
b.表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值
c.如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式

11)initParam 对象:将上下文初始化参数名称映射到单个值
a.底层通过调用 ServletContext.getInitparameter(String name) 方法获得
b.表达式 ${initParam.name} 相当于 request.getInitparameter(name);

3.  EL 表达式实例

<%@ page language="java" import="java.util.*,com.ncdx.pojo.*" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" isELIgnored="false" %>

<!-- 使用传统方式获取作用域对象的数据 
           缺点1:要导入包
           缺点2:需要强转
           缺点3:获取数据的代码过于麻烦 -->
<b><%=request.getParameter("uname")%></b><br/>
<b><%=request.getAttribute("str")%></b><br/>
<b><%=((User)request.getAttribute("user")).getAddr().getTown()%></b><br/>
<b><%=((ArrayList)request.getAttribute("list")).get(2)%></b><br/>
<b><%=((ArrayList<User>)request.getAttribute("list2")).get(0).getAddr().getPre()%></b><br/>
<b><%=((HashMap<String, String>)request.getAttribute("map")).get("a")%></b><br/>
<b><%=((HashMap<String, User>)request.getAttribute("map2")).get("b").getAddr().getCity()%></b><br/>
 

<hr/>
<!-- 使用 EL 表达式获取作用域对象的数据 -->
<b>${param.uname}</b><br/>
<b>${requestScope.str}</b><br/>
<b>${requestScope.user.addr.town}</b><br/>
<b>${requestScope.list[2]}</b><br/>
<b>${requestScope.list2[0].addr.pre}</b><br/>
<b>${requestScope.map.a}</b><br/>
<b>${requestScope.map2.b.addr.city}</b><br/>


<hr/>
<!-- EL 的作用域查找顺序 -->
<%
     pageContext.setAttribute("hello", "hello pageContext");
     request.setAttribute("hello", "hello request");
     session.setAttribute("hello", "hello session");
     application.setAttribute("hello", "hello application");
%>
${hello} ${pageScope.hello} ---> ${requestScope.hello} --> ${sessionScope.hello} --> ${applicationScope.hello} <hr/> <!-- EL 获取请求头数据 和 Cookie 数据 --> ${header} <br/> ${headerValues["accept-language"][0]} } <br/> ${cookie} <br/> ${cookie.JSESSIONID} <br/> ${cookie.JSESSIONID.name} <br/> ${cookie.JSESSIONID.value}
原文地址:https://www.cnblogs.com/IT-LFP/p/11685431.html