EL表达式

EL,Expression Language,是表达式语言。

使用jsp页面虽然能进行数据输出,但过于麻烦,而使用EL表达式在输出数据时会更简洁。

简单举个例子,如果在jsp页面内设置属性:

<%
   request.setAttribute("key", "111");
%>

那么使用表达式脚本获取key的值应该是:

表达式脚本:<%=request.getAttribute("key")%>

而使用EL表达式:

${key}

浏览器上的效果:

在这里插入图片描述
注意,如果输出一个不存在的值,那么jsp表达式会输出null,而EL表达式输出空串。

EL表达式主要是在jsp页面上输出数据

EL表达式搜索四个域的顺序:

    <%
        session.setAttribute("key", "session");
        application.setAttribute("key", "app");
        request.setAttribute("key", "request");
        pageContext.setAttribute("key", "page");
    %>

    ${key}

浏览器会输出page,将pageContext注释后输出request,将request注释后,输出session,将session注释后仍然输出session,这是因为只要不关闭页面,session就会一直保存。如果把浏览器关闭后重新打开,就输出app了。

也就是说,EL表达式的搜索顺序是:pageContext、request、session、application。

EL输出Bean对象

假设我们有这么一个类Person,成员有:

private String name;
    private String[] phones;
    private List<String> cities;
    private Map<String, Object> map;

那么在jsp中使用EL表达式输出的格式为:

<body>
    <%
        Person p = new Person();
        p.setName("caesar");
        p.setPhones(new String[] {"134224", "2134421"});
        ArrayList<String> cities = new ArrayList<>();
        cities.add("北京");
        cities.add("上海");
        cities.add("深圳");
        p.setCities(cities);
        HashMap<String, Object> map = new HashMap<>();
        map.put("key1", "v1");
        map.put("key2", "v2");
        map.put("key3", "v3");
        p.setMap(map);

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

    输出p: ${person} <br>
    输出p的属性: ${person.name} <br>
    输出p的phones数组: ${person.phones[1]} <br>
    输出p的cities: ${person.cities} <br>
    输出p的map: ${person.map} <br>
    输出p的map的某个value值: ${person.map.key2}
</body>

运行结果:

在这里插入图片描述
注意,如果只是在Java Bean中定义了属性但没有指定get方法,那么EL表达式不会输出这个属性值,如:

没有给age加get方法:

在这里插入图片描述
使用 ${person.age} 获取age的值,发现出错了:

在这里插入图片描述
因为EL表达式是根据get方法来获取值的,而且即使没有属性,但有get方法仍然能访问到属性,例如我们把age属性删去,只留get方法:

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

在这里插入图片描述
所以EL表达式在输出属性时找到的属性对应的get方法。

运算

关系运算

在这里插入图片描述

逻辑运算

在这里插入图片描述

算术运算

在这里插入图片描述

empty运算

判断一个数据是否为空,若是则为true,否则为false。

  • 值为null
  • 为空串
  • 为Object数组,长度为0
  • list集合,元素个数为0
  • map集合,元素个数为0

结果为false:

在这里插入图片描述

三元运算
  • ${3 == 3? “yes”: “no”}
点运算和中括号运算符

在这里插入图片描述
如果直接用map.a.a.a获取key="a.a.a"的value值会出错,因为系统会认为.a.a.a是三次点运算,这时要加中括号[],如下图所示:

在这里插入图片描述

EL表达式中11个隐含对象

在这里插入图片描述
在这里插入图片描述

如何使用

在这里插入图片描述
之前提到过,直接${key2}就能输出数据,为何非要在前面加上applicationScope呢?多此一举?原因是如果多个域的key相同,那么使用key2会根据就近原则先输出pageContext key2的value,这可能不是我们想要的。

pageContext对象的使用

在这里插入图片描述
在这里插入图片描述
可以用如下方式简化:

在这里插入图片描述
现在只需${req.scheme}即可。

param && paramValues
  • 使用${param}可获取从地址栏输入的参数,如:

${param.username}:

在这里插入图片描述

而paramValues适用于key有多个值的情况,如:

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

在这里插入图片描述

header && headerValues

输出请求头:${header[‘user-Agent’]}

在这里插入图片描述
headerValues同理。

cookie

在这里插入图片描述

在这里插入图片描述

initParam

${initParam},用于输出xml文件中的context-param映射

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值