jsp的EL表达式详解

一、什么是EL表达式,有什么用

EL表达式全称:Expression Language。是表达式语言。
作用:主要用来替代jsp页面中的表达式脚本在jsp页面中进行数据的输出。(具体主要是输出域对象的数据
优点:在输出数据时,比jsp额表达式脚本要简介得多
格式/语法(在jsp文件中使用):

${表达式}

二、用法

2.1 最简单的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        request.setAttribute("key","123456");
    %>
<%--最简单的使用方法,取key的值--%>
    key值:${key}
    <br>
<%--如果取的值为空,那么不会输出什么null或者undefine--%>
    name值:${name}
</body>
</html>

运行结果:
在这里插入图片描述

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

说到域,这里说一下,jsp中的域对象主要有四个:
1、pageContext(数据只在当前页面有效,请求转发后无效)
2、request(数据在当前请求有效,请求转发后有效,重定向无效)
3、session(数据在关闭浏览器前有效)
4、application(数据在关闭服务器前有效)

而EL表达式所有域的顺序也是从小到大的,也就是跟上面的顺序一样:pageContext > request > session > application

也就是说,如果现在四个域都存储了一个Attribute叫做key,我们使用EL表达式${key} 会优先输出pageContext的。

2.3. EL表达式输出复杂的Bean对象

假如现在有以下Bean需要输出。

package com.hstc.edu.EL;

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

public class Product {
    private String name;
    private Double[] prices;
    private List<String> cities;
    private Map<String, Object> map;

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

    public Product(String name, Double[] prices, List<String> cities, Map<String, Object> map) {
        this.name = name;
        this.prices = prices;
        this.cities = cities;
        this.map = map;
    }

    public Product() {
    }

    public String getName() {
        return name;
    }

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

    public Double[] getPrices() {
        return prices;
    }

    public void setPrices(Double[] prices) {
        this.prices = prices;
    }

    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;
    }
}

那么,我们在jsp下的代码如下(以下代码说明了几乎所有常用的基本或者非基本类型使用EL表达式的输出方式):
最主要的代码如下:

    直接输出product:${product}
    <br>
    只输出product的name属性:${product.name}
    <h2>注意:无法使用product.prices直接输出数组的所有值</h2>
    <br>
    只输出product的prices数组中某一个属性:${product.prices[0]}
    <br>
    输出product的cities集合:${product.cities}
    <br>
    输出product的cities集合中个别元素:${product.cities[0]}
    <br>
    输出product的Map集合:${product.map}
    <br>
    输出product的Map集合中某个值:${product.map.key1} 或者 ${product.map["key1"]}
    <br>

完整的代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL输出复杂的Bean对象</title>
</head>
<body>
    <%
        Product product = new Product();
        product.setName("冰淇淋");
        product.setPrices(new Double[]{1.0,1.5,2.0,3.0,5.0});

        List<String> cities = new ArrayList<String>();
        cities.add("汕头");
        cities.add("广州");
        cities.add("深圳");
        cities.add("上海");
        cities.add("北京");
        product.setCities(cities);

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

        //将product对象存入request
        request.setAttribute("product",product);
    %>

    直接输出product:${product}
    <br>
    只输出product的name属性:${product.name}
    <h2>注意:无法使用product.prices直接输出数组的所有值</h2>
    <br>
    只输出product的prices数组中某一个属性:${product.prices[0]}
    <br>
    输出product的cities集合:${product.cities}
    <br>
    输出product的cities集合中个别元素:${product.cities[0]}
    <br>
    输出product的Map集合:${product.map}
    <br>
    输出product的Map集合中某个值:${product.map.key1} 或者 ${product.map["key1"]}
    <br>

</body>
</html>

显示结果如下:
在这里插入图片描述

2.4. EL表达式的关系运算

在这里插入图片描述

2.5. EL表达式的逻辑运算

在这里插入图片描述

2.6. EL表达式的算术运算

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

2.7. empty运算

作用:判断一个数据是否为空,若为空,输出true,否则输出false。

满足数据为空的五种情况:
1、值为null
2、字符串为空串的时候
3、数组长度为0
4、list集合的元素个数为0
5、map集合的元素个数为0

在jsp脚本下使用如下:

${ empty 参数名}

例如:

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        request.setAttribute("key1",null);
        request.setAttribute("key2","");
        request.setAttribute("key3",new String[]{});
        request.setAttribute("key4",new ArrayList<Integer>());
        request.setAttribute("key5",new HashMap<>());
    %>
    key1 = ${empty key1}<br>
    key2 = ${empty key2}<br>
    key3 = ${empty key3}<br>
    key4 = ${empty key4}<br>
    key5 = ${empty key5}<br>
</body>
</html>

显示如下:
在这里插入图片描述

2.8. EL表达式的三元运算

其实就是Java中的

表达式1 ? 表达式2 : 表达式3

比如: 1 == 1 ? true : false
也就是如果1 等于 1 的话,那么就输出true,否则输出false。
具体无非就是加个${}变成:

${1==1?true:false}

2.9. 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中配置的<context-param>的上下文参数

这里说一个点:上面提到过一个域的优先级的问题,如果你实在想在一个jsp页面使用多个域,而且起的Attribute的名称又一样,还想跳过这层优先级,那么就可以使用上面的例如requestScope.Attribute的键来获取。
举个例子吧:
现在你的Attribute设置如下:

    <%
        pageContext.setAttribute("key","pageValue");
        request.setAttribute("key","requestValue");
    %>

那么获取这两个key 的代码如下:

    pageContext.key = ${key} 或者 ${pageScope.key}
    <br>
    request.key = ${requestScope.key}

显示(为了证明这是对的,特地贴个图):
在这里插入图片描述

2.10. EL表达式pageContext对象的作用

主要用于获取以下7个数据:
1、协议
2、服务器ip
3、服务器端口
4、工程路径
5、请求方法
6、客户端ip
7、会话的id编号

具体例子,剑来!直接一波代码强烈输出:
在jsp文件中代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext的七大作用</title>
</head>
<body>
    <h1>利用EL表达式的pageContext对象获取以下七个数据</h1>
    <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>
</body>
</html>

显示如下:(这里因为访问的是自己的电脑,所以客户端的ip是自己的ip)
在这里插入图片描述
有人可能会觉得,不是吧老哥,这么长,怎么记,其实有个更容易的写法,我们把request和session放到pageContext域中,修改代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext的七大作用</title>
</head>
<body>
    <%
        pageContext.setAttribute("req",request);
        pageContext.setAttribute("ses",session);
    %>
    <h1>利用EL表达式的pageContext对象获取以下七个数据</h1>
    <br>
    1、协议:${req.scheme}
    <br>
    2、服务器ip:${req.serverName}
    <br>
    3、服务器端口:${req.serverPort}
    <br>
    4、工程路径:${req.contextPath}
    <br>
    5、请求方法:${req.method}
    <br>
    6、客户端ip:${req.remoteHost}
    <br>
    7、会话的id编号:${ses.id}
    <br>
</body>
</html>

运行结果也是一样的:
在这里插入图片描述

2.11. EL表达式另外几个隐含对象的用法(param、paramValues、header、headerValues、cookie、initParam)

2.11.1. param、paramValues

首先是param和paramValues,主要用来获取请求参数的值,也就是网页后边加?的参数。比如:
jsp如下:

    username = ${param.username}<br>
    hobbies = ${param.hobby}<br>
    hobbies = ${paramValues.hobby[0]} and ${paramValues.hobby[1]}<br>

那么使用此链接(http://localhost:8080/EL/other.jsp?username=Keeling&hobby=eat&hobby=drink)获得的显示为:
在这里插入图片描述
param的获取就不用说了,主要说一下,如果hobby有两个值的话,那么param只能输出第一个值,此时就必须使用paramValues对象
如果直接输出${paramValues.hobby}会怎么样呢,请看
在这里插入图片描述

2.11.2. header、headerValues

直接贴代码

    获取整个请求头:${header}<br>
    获取请求头[User-Agent]的值:${header['User-Agent']}<br>
    <%--因为是headerValues所以要取0来得到值,headerValues['Connection']相当于拿到一个数组--%>
    获取请求头[Connection]的值:${headerValues['Connection'][0]}<br>

显示:
在这里插入图片描述

2.11.3. cookie

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

显示:
在这里插入图片描述
这个Cookie怎么看呢?打开网页,按F12,打开Network,然后找到当前的网页文件即可查看我们的Cookie的详细信息。
在这里插入图片描述
如果要获取他的NMTID值,那么用以下代码,其他的也基本类似:

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

但是注意,有特殊字符的名称要用中括号[“”],比如Idea-8296e771(±*/、!~等等都算特殊字符)

2.11.4. initParam

在web.xml中配置:
在这里插入图片描述
然后在jsp中获取如下:

${initParam.username}
${initParam.url}

如果要获取所有的数据,那么也可以直接用

${initParam}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值