一、EL表达式简介

  1. EL表达式全称:Expression Language,即表达式语言
  2. EL表达式作用:代替JSP页面中表达式脚本进行数据的输出
  3. EL表达式比JSP的表达式脚本简洁很多
  4. EL表达式的格式是:${表达式} ,注:EL表达式写在jsp页面中,表达式一般是域对象的key
  5. EL 表达式在输出null 值的时候,输出的是空串。jsp 表达式脚本输出null 值的时候,输出的是null 字符串 ```html <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>

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

  1. <a name="PJNdI"></a>
  2. ## 二、EL表达式搜索域数据的顺序
  3. EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关
  4. ```html
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <html>
  7. <head>
  8. <title>Title</title>
  9. </head>
  10. <body>
  11. <%
  12. //往四个域中都保存了相同的key的数据
  13. pageContext.setAttribute("key", "pageContext");
  14. request.setAttribute("key", "request");
  15. session.setAttribute("key", "session");
  16. application.setAttribute("key", "application");
  17. %>
  18. ${key}
  19. </body>
  20. </html>

三、EL表达式输出Java类的属性

<%@ page import="com.atguigu.pojo.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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%
        Person person = new Person();

        person.setName("cess真的帅");
        person.setPhones(new String[]{"18611111111","18622222222","18699998888"});

        List<String> cities = new ArrayList<>();
        cities.add("北京");
        cities.add("上海");
        cities.add("成都");
        person.setCities(cities);

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

        pageContext.setAttribute("p", person);
    %>

    输出Person:${p}<br/>
    输出Person的name属性:${p.name} <br/>
    输出Person的phones数组属性值:${p.phones} <br/>
    输出Person的phones数组属性值:${p.phones[0]} <br/>
    输出Person的cities集合中的元素值:${p.cities} <br>
    输出Person的List集合中个别元素值:${p.cities[2]} <br>
    输出Person的Map集合: ${p.map} <br>
    输出Person的Map集合中某个key的值: ${p.map.key3} <br>

    <%-- 通过getXxx()方法取值,并不需要Javabean中有这个属性 --%>
    输出Person的age属性:${p.age} <br>

</body>
</html>

image.png

四、EL表达式的运算

语法:${运算表达式}

1. 关系运算

image.png

2. 逻辑运算

image.png

3. 算数运算

image.png

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>运算符</title>
</head>
<body>
    ${ 12 == 12 } 或 ${ 12 eq 12 } <br>
    ${ 12 != 12 } 或 ${ 12 ne 12 } <br>
    ${ 12 < 12 } 或 ${ 12 lt 12 } <br>
    ${ 12 > 12 } 或 ${ 12 gt 12 } <br>
    ${ 12 <= 12 } 或 ${ 12 le 12 } <br>
    ${ 12 >= 12 } 或 ${ 12 ge 12 } <br>
    <hr>

    ${ 12 == 12 && 12 > 11 } 或 ${ 12 == 12 and 12 > 11 } <br>
    ${ 12 == 12 || 12 > 11 } 或 ${ 12 == 12 or 12 > 11 } <br>
    ${ ! true } 或 ${ not true } <br>
    <hr>

    ${ 12 + 12 } <br>
    ${ 12 - 12 } <br>
    ${ 12 * 12 } <br>
    <%-- 除法会转为浮点型 --%>
    ${ 18 / 12 } 或 ${ 18 div 12 } <br>
    ${ 18 % 12 } 或 ${ 18 mod 12 } <br>
</body>
</html>

4. empty运算

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

  • 值为 null 值的时候,为空
  • 值为空串的时候,为空
  • 值是 Object 类型数组,长度为零
  • list 集合,元素个数为零
  • map 集合,元素个数为零

    5. 三元运算

    表达式 1?表达式 2:表达式 3
    表达式1为真返回表达式2的值,表达式1为假返回表达式3的值 ```html <%@ page import=”java.util.List” %> <%@ page import=”java.util.ArrayList” %> <%@ page import=”java.util.HashMap” %> <%@ page import=”java.util.Map” %> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %> <%

      // 1、值为null值的时候,为空
      request.setAttribute("emptyNull", null);
      // 2、值为空串的时候,为空
      request.setAttribute("emptyStr", "");
      // 3、值是Object类型数组,长度为零的时候
      request.setAttribute("emptyArr", new Object[]{});
      // 4、list集合,元素个数为零
      List<String> list = new ArrayList<>();
      request.setAttribute("emptyList", list);
      // 5、map集合,元素个数为零
      Map<String, Object> map = new HashMap<>();
      request.setAttribute("emptyMap", map);
    

    %>

    ${empty emptyNull}
    ${empty emptyStr}
    ${empty emptyArr}
    ${empty emptyList}
    ${empty emptyMap}

    ${(12 == 12) ? “cess真帅” : “cess更帅”}

<a name="Z5a6K"></a>
### 6. “.”点运算和“[ ]”中括号运算

- .点运算,可以输出 Bean 对象中某个属性的值
- []中括号运算,可以输出有序集合中某个元素的值

并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值
```html
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%
      Map<String,Object> map = new HashMap<>();
      map.put("a.a.a", "aaaValue");
      map.put("b+b+b", "bbbValue");
      map.put("c-c-c", "cccValue");

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

    ${map['a.a.a']} <br/>
    ${map["b+b+b"]} <br/>
    ${map['c-c-c']} <br/>
</body>
</html>

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

image.png

EL 获取四个特定域中的属性

image.png

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

    <%
        pageContext.setAttribute("key1", "pageContext1");
        pageContext.setAttribute("key2", "pageContext2");
        request.setAttribute("key2", "request");
        session.setAttribute("key2", "session");
        application.setAttribute("key2", "application");
    %>

    ${pageScope.key1} <br/>
    ${pageScope.key2} <br/>
    ${requestScope.key2} <br/>
    ${sessionScope.key2} <br/>
    ${applicationScope.key2} <br/>

</body>
</html>

pageContext对象的使用

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

    ${pageContext} <%--org.apache.jasper.runtime.PageContextImpl@33598e0--%>
    ${pageContext.servletConfig}
    <%--
        request.getScheme() 它可以获取请求的协议
        request.getServerName() 获取请求的服务器ip或域名
        request.getServerPort() 获取请求的服务器端口号
        getContextPath() 获取当前工程路径
        request.getMethod() 获取请求的方式(GET或POST)
        request.getRemoteHost()  获取客户端的ip 地址
        session.getId() 获取会话的唯一标识
    --%>

    <%=request.getScheme() %> <br/>

    1.协议: ${ pageContext.request.scheme } <br/>
    2.服务器ip:${ pageContext.request.serverName } <br/>
    3.服务器端口:${ pageContext.request.serverPort } <br/>
    4.获取工程路径:${ pageContext.request.contextPath } <br/>
    5.获取请求方法:${ pageContext.request.method } <br/>
    6.获取客户端ip地址:${ pageContext.request.remoteHost } <br/>
    7.获取会话的id编号:${ pageContext.session.id } <br/><br/>

    <%-- 开发中常将几大对象放到pageContext中,如下--%>
    <%
        pageContext.setAttribute("request", request);
    %>
    1.协议: ${ request.scheme } <br>
</body>
</html>

其他对象

<%--
  Created by IntelliJ IDEA.
  User: cess
  Date: 2021/6/13
  Time: 21:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<a href="http://localhost:8080/09_el_jstl/i_other_el_obj.jsp?username=cess&password=123456&hobby=java&hobby=python">请求</a> <br/>

    输出请求参数username的值:${param.username} <br>
    输出请求参数password的值:${param.password} <br>

    输出请求参数username的值:${paramValues.username[0]} <br>
    输出请求参数hobby的值:${paramValues.hobby[0]} <br>
    输出请求参数hobby的值:${paramValues.hobby[1]} <br>
    <hr>

    输出请求头【User-Agent】的值:${header['User-Agent']} <br>
    输出请求头【Connection】的值:${header.Connection} <br>

    输出请求头【User-Agent】的值:${headerValues['Accept-Language'][0]} <br>
    <hr>

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

    输出&lt;Context-param&gt;username的值:${initParam.username} <br>
    输出&lt;Context-param&gt;url的值:${initParam.url} <br>

</body>
</html>

web.xml

    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql:///test</param-value>
    </context-param>