07. EL表达式


一、EL表达式

1.1、什么是EL表达式

??EL 表达式的全称是:Expression Language。它是表达式语言。EL 表达式的作用是:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。

??EL 表达式的格式是:${表达式};EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。

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


  $Title$


  <%
    request.setAttribute("key","value");
  %>
  表达式脚本输出key的值是:<%= request.getAttribute("key") %>
EL表达式输出key的值是:${key}
表达式脚本输出key的值是:<%= request.getAttribute("key1") %>
EL表达式输出key的值是:${key1}

1.2、EL表达式搜索域数据的顺序

??EL 表达式主要是在 jsp 页面中输出数据。 主要是输出域对象中的数据。当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

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


  $Title$


  <%
    pageContext.setAttribute("key","pageContext");
    request.setAttribute("key","request");
    session.setAttribute("key","session");
    application.setAttribute("key","application");
  %>
  ${key}


1.3、EL表达式输出Bean对象

<%@ page import="star.light.el.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  <%
    Person person  = new Person();
    person.setName("Sakura");
    person.setPhones(new String[]{"10086","10000","10010"});

    List hobbyies = new ArrayList<>();
    hobbyies.add("Unreal Engine");
    hobbyies.add("Java");
    hobbyies.add("Python");
    hobbyies.add("Hormony");
    hobbyies.add("STM32");
    person.setHobby(hobbyies);

    Map map = new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    person.setMap(map);

    pageContext.setAttribute("p",person);
  %>
  输出Person:${p}
输出Person的name属性:${p.name}
输出Person的age属性:${p.age}
输出Person的数组具体的属性值:${p.phones[0]}
输出Person的List集合:${p.hobby}
输出Person的List集合中具体的元素值:${p.hobby[0]}
输出Person的Map集合:${p.map}
输出Person的Map集合中具体的元素值:${p.map.key1}
package star.light.el;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Person {
    private String name;
    private int age;
    private String[] phones;
    private List hobby;
    private Map map;

    public Person() {
    }

    public Person(String name, int age, String[] phones, List hobby, Map map) {
        this.name = name;
        this.age = age;
        this.phones = phones;
        this.hobby = hobby;
        this.map = map;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return 9;
    }

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

    public String[] getPhones() {
        return phones;
    }

    public void setPhones(String[] phones) {
        this.phones = phones;
    }

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phones=" + Arrays.toString(phones) +
                ", hobby=" + hobby +
                ", map=" + map +
                '}';
    }
}

在EL表达式中输出对象的属性是通过getXxx()来实现的

二、EL表达式进行运算

2.1、关系运算

关系运算符 说明
== 或 eq 等于
!= 或 ne 不等于
< 或 lt 小于
> 或 gt 大于
<= 或 le 小于等于
>= 或 ge 大于等于
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  3 ==3:${3 == 5} 或 ${3 eq 5}
3 != 5:${3 != 5} 或 ${3 ne 5}
3 < 5:${3 < 5} 或 ${3 lt 5}
3 > 5:${3 > 5} 或 ${3 gt 5}
3 <= 5:${3 <= 5} 或 ${3 le 5}
3 >= 5:${3 >= 5} 或 ${3 ge 5}

2.2、逻辑运算

逻辑运算符 说明 结果
&& 或 and 与运算 只有运算符两边都为真,结果才为真;否则为假
|| 或 or 或运算 只要运算符两边有一个为真,结果为真;否则结果为假
! 或 not 取反运算 如果表达式为真,则运算结果为假;否则为真
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  (3 < 5) && (3 > 7):${(3 < 5) && (3 > 7)} 或 ${(3 lt 5) and (3 gt 7)}
(3 > 5) && (3 > 7):${(3 > 5) && (3 > 7)} 或 ${(3 gt 5) and (3 gt 7)}
(3 < 5) && (3 < 7):${(3 < 5) && (3 < 7)} 或 ${(3 lt 5) and (3 lt 7)}
(3 < 5) || (3 > 7):${(3 < 5) || (3 > 7)} 或 ${(3 lt 5) or (3 gt 7)}
(3 > 5) || (3 > 7):${(3 > 5) || (3 > 7)} 或 ${(3 gt 5) or (3 gt 7)}
(3 < 5) || (3 < 7):${(3 < 5) || (3 < 7)} 或 ${(3 lt 5) or (3 lt 7)}
!(3 == 5):${!(3 == 5)} 或 ${not(3 eq 5)}
!(3 != 5):${!(3 != 5)} 或 ${not(3 ne 5)}

2.3、算数运算符

算数运算符 说明
+ 加法
- 减法
* 乘法
/ 或 div 除法
% 或 mod 取模
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  3 + 5:${3 + 5}
3 - 5:${3 - 5}
3 * 5:${3 * 5}
3 / 5:${3 / 5} 或 ${3 div 5}
3 % 5:${3 % 5} 或 ${3 mod 5}

2.4、empty运算

??empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。以下几种情况为空:

  • 值为 null 值的时候,为空
  • 值为空串的时候,为空
  • 值是 Object 类型数组,长度为零的时候
  • list 集合,元素个数为零
  • map 集合,元素个数为零
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  <%
    //值为null值的时候
    request.setAttribute("emptyNull",null);
    //值为空串的时候
    request.setAttribute("emptyStr","");
    //值是Object类型数组,长度为零的时候
    request.setAttribute("emptyArr",new Object[]{});
    //list集合,元素个数为零
    request.setAttribute("emptyList",new ArrayList<>());
    //map集合,元素个数为零
    request.setAttribute("emptyMap",new HashMap<>());
  %>
  ${empty emptyNull}
${empty emptyStr}
${empty emptyArr}
${empty emptyList}
${empty emptyMap}

2.5、三元运算

??表达式 1?表达式 2:表达式 3 如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。

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


  $Title$


  3 == 5:${(3 == 5)?"true":"false"}
3 != 5:${(3 != 5)?"true":"false"}

2.6、“.”点运算 和 [] 中括号运算符

??.点运算,可以输出 Bean 对象中某个属性的值。 []中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  <%
    Map map = new HashMap<>();
    map.put("aaa","value1");
    map.put("a.a.a","value2");
    map.put("a+a+a","value3");

    request.setAttribute("map",map);
  %>

  ${map}
${map.aaa}
${map["a.a.a"]}
${map['a+a+a']}

三、EL表达式的11个隐含对象

变量 类型 作用
pageContext PageContextImpl 它可以获取 jsp 中的九大内置对象
pageScope Map 它可以获取 pageContext 域中的数据
requestScope Map 它可以获取 Request 域中的数据
sessionScope Map 它可以获取 Session 域中的数据
applicationScope Map 它可以获取 ServletContext 域中的数据
param Map 它可以获取请求参数的值
paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用
header Map 它可以获取请求头的信息
headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况
cookie Map 它可以获取当前请求的 Cookie 信息
initParam Map 它可以获取在 web.xml 中配置的上下文参数

3.1、EL表达四获取四个特定域中的属性

  • pageScope --->> pageContext 域
  • requestScope --->> Request 域
  • sessionScope --->> Session 域
  • applicationScope --->> ServletContext 域

3.1.1、. pageContext对象的使用

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


  $Title$


  <%--
    request.getScheme() 它可以获取请求的协议
    request.getServerName() 获取请求的服务器 ip 或域名
    request.getServerPort() 获取请求的服务器端口号
    getContextPath() 获取当前工程路径
    request.getMethod() 获取请求的方式(GET 或 POST)
    request.getRemoteHost() 获取客户端的 ip 地址
    session.getId() 获取会话的唯一标识
  --%>
  1. 协议:${pageContext.request.scheme}
2. 服务器 ip:${pageContext.request.serverName}
3. 服务器端口:${pageContext.request.serverPort}
4. 获取工程路径:${pageContext.request.contextPath}
5. 获取请求方法:${pageContext.request.method}
6. 获取客户端 ip 地址:${pageContext.request.remoteHost}
7. 获取会话的 id 编号:${pageContext.session.id}

3.2、EL表达式其他隐含对象的使用

  • param Map 它可以获取请求参数的值
  • paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用
  • header Map 它可以获取请求头的信息
  • headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况
  • cookie Map 它可以获取当前请求的 Cookie 信息
  • initParam Map 它可以获取在 web.xml 中配置的上下文参数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  $Title$


  <%-- 请求地址:http://localhost:8080/el_expression/?username=sakura&username=kinomoto&password=27185 --%>
  ${param}
输出请求参数username的值:${param.username}
输出请求参数passwrod的值:${param.password}

${paramValues}
输出请求参数username的值:${paramValues.username[1]}

${header}
输出请求头【User-Agent】:${header['User-Agent']}
输出请求头【User-Agent】:${headerValues['User-Agent'][0]}

${cookie}
获取Cookie的名称:${cookie.JSESSIONID.name}
获取Cookie的值:${cookie.JSESSIONID.value}

${initParam}
输出<Context-param>username的值:${initParam.username}
输出<Context-param>password:${initParam.password}

??其中【web】下【WEB-INF】的【web.xml】的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

    
        username
        sakura
    
    
        password
        27185
    

相关