EL表达式

1.EL 表达式的作用

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

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp</title>
</head>
<body>
    <%
        request.setAttribute("key","value");
    %>
    表达式脚本输出的Key的值是:
    <%=request.getAttribute("key")%>
    <br/>
    EL表达式输出的key值是:
    ${key}
</body>
</html>

实验结果:
在这里插入图片描述
EL 表达式的格式是:${表达式}
EL 表达式在输出 null 值的时候,输出的是空串。
jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。

2.EL 表达式搜索域数据的顺序

EL 表达式主要是在 jsp 页面中输出数据。
主要是输出域对象中的数据。

当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp</title>
</head>
<body>
    <%  //往四个域中保存相同的 key 的数据。
        pageContext.setAttribute("key","pageContext");
        request.setAttribute("key","request");
        session.setAttribute("key","session");
        application.setAttribute("key","application");
    %>
    
    ${key}

</body>
</html>

实验结果:
在这里插入图片描述
从小到大的范围的顺序:
  pageContext ====>>> request ====>>> session ====>>> application

3.EL 表达式输出 Bean 的普通属性、数组属性、List集合属性、map集合属性

示例:输出出 Person 类中普通属性,数组属性。list 集合属性和 map 集合属性。
Person类:

public class Person {
    private String name;
    private Integer[] age;
    private List<String> cities;
    private Map<String,Object> map;

    public Person() {
    }

    public Person(String name, Integer[] age, List<String> cities, Map<String, Object> map) {
        this.name = name;
        this.age = age;
        this.cities = cities;
        this.map = map;
    }

    public String getName() {
        return name;
    }

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

    public Integer[] getAge() {
        return age;
    }

    public void setAge(Integer[] age) {
        this.age = age;
    }

    public List<String> getCities() {
        return cities;
    }

    public void setCities(List<String> cities) {
        this.cities = cities;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

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

JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp</title>
</head>
<body>
    <%
        Person person = new Person();
        person.setName("Tom");
        person.setAge(new Integer[]{1,2,3});

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

        HashMap<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 的 age 数组属性值:${p.age[2]}<br>
    输出 Person 的 cities 集合中的元素值:${p.cities} <br>
    输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br>
    输出 Person 的 Map 集合: ${p.map} <br>
    输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
    输出 Person 的 Map 集合中某个 key 的值: ${p.map['key3']} <br>
    输出 Person 的 age 属性:${p.age} <br>

</body>
</html>

实验结果:
在这里插入图片描述

4.EL 表达式——运算

语法:${ 运算表达式 } , EL 表达式支持如下运算符:

4.1 关系运算

关系运算符说 明范 例结果
== 或 eq等于${ 5 == 5 } 或 ${ 5 eq 5 }true
!= 或 ne不等于${ 5 !=5 } 或 ${ 5 ne 5 }false
< 或 lt小于${ 3 < 5 } 或 ${ 3 lt 5 }true
> 或 gt大于${ 2 > 10 } 或 ${ 2 gt 10 }false
<= 或 le小于等于${ 5 <= 12 } 或 ${ 5 le 12 }true
>= 或 ge大于等于${ 3 >= 5 } 或 ${ 3 ge 5 }false

4.2 逻辑运算

逻辑运算符说 明范 例结果
&& 或 and与运算${ 12 == 12 && 12 < 11 } 或 ${ 12 == 12 and 12 < 11 }false
|| 或 or或运算${ 12 == 12 || 12 < 11 } 或 ${ 12 == 12 or 12 < 11 }true
! 或 not取反运算${ !true } 或 ${not true }false

4.3 算数运算

算数运算符说 明范 例结果
+加法${ 12 + 18 }30
-减法${ 18 - 8 }10
*乘法${ 12 * 12 }144
/ 或 div除法${ 144 / 12 } 或 ${ 144 div 12 }12
% 或 mod取模${ 144 % 10 } 或 ${ 144 mod 10 }4

4.4 empty 运算

empty 运算可以判断一个数据是否为空:${ empty 数据 }

  • 如果为空,则输出 true;
  • 不为空输出 false。

以下几种情况为空:

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

4.5 三元运算

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

示例:

${ 2 != 1 ? "true":"false" }

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

.点运算,可以输出 Bean 对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值。
并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
具体示例请见,第三节的:
输出 Person 的 name 属性:${p.name}
输出 Person 的 Map 集合中某个 key 的值: ${p.map['key3']}

5.EL 表达式的 11 个隐含对象

变量类型作用
pageContextPageContextImpl它可以获取 jsp 中的九大内置对象
pageScopeMap<String,Object>它可以获取 pageContext 域中的数据
requestScopeMap<String,Object>它可以获取 Request 域中的数据
sessionScopeMap<String,Object>它可以获取 Session 域中的数据
applicationScopeMap<String,Object>它可以获取 ServletContext 域中的数据
paramMap<String,String>它可以获取请求参数的值
paramValuesMap<String,String[]>它也可以获取请求参数的值,获取多个值的时候使用
headerMap<String,String>它可以获取请求头的信息
headerValuesMap<String,String[]>它可以获取请求头的信息,它可以获取多个值的情况
cookieMap<String,Cookie>它可以获取当前请求的 Cookie 信息
initParamMap<String,String>它可以获取在 web.xml 中配置的上下文参数

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

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp</title>
</head>
<body>
    <%
        pageContext.setAttribute("key1", "pageContext");
        request.setAttribute("key1", "request");
        session.setAttribute("key1", "session");
        application.setAttribute("key1", "application");
    %>
    ${ pageScope.key1}<br/>
    ${ requestScope.key1}<br/>
    ${ sessionScope.key1}<br/>
    ${ applicationScope.key1}<br/>

</body>
</html>

实验结果:
在这里插入图片描述

5.2 pageContext 对象的使用

  • 获取请求的协议
  • 获取请求的服务器 ip 或域名
  • 获取请求的服务器端口号
  • 获取当前工程路径:
  • 获取请求方法(GET 或 POST)
  • 获取客户端 ip 地址
  • 获取会话的 id 编号:

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a.jsp</title>
</head>
<body>
    <%
        pageContext.setAttribute("req", request);
    %>
    1.协议: ${ req.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>

</body>
</html>

实验结果:
在这里插入图片描述

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

  • param:它可以获取请求参数的值

代码示例:

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

请求地址:
http://localhost:8080/JSP/a.jsp?username=xyh123&password=123456

实验结果:
在这里插入图片描述

  • paramValues :它也可以获取请求参数的值,获取多个的时候使用

代码示例:

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

请求地址:
http://localhost:8080/JSP/a.jsp?username=xyh123&username=xyh456&password=123456

实验结果:
在这里插入图片描述

  • header :它可以获取请求头的信息

代码示例:

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

实验结果:
在这里插入图片描述

  • headerValues:它可以获取请求头的信息,它可以获取多个值的情况

代码示例:

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

实验结果:
在这里插入图片描述

  • cookie:它可以获取当前请求的 Cookie 信息

代码示例:

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

实验结果:
在这里插入图片描述

  • initParam :它可以获取在 web.xml 中配置的上下文参数

web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>

</web-app>

代码示例:

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

实验结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值