EL表达式详解

什么是EL表达式?

Expression Language(表达式语言)。

EL表达式能干什么?

替代JSP页面中数据访问时的复杂编码,简化开发,让JSP代码更加简洁。

如何使用?

基本语法:${expression}

如果不实用EL表达式,JSP页面获取后台传来的数据,需要通过Java脚本的方式获取:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        String message = (String)request.getAttribute("message");
    %>
    <%=message %>
</body>
</html>

使用EL表达式之后,可大大简化这种繁琐的开发方式,让JSP页面更加简洁。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${message }
</body>
</html>

${message}中的message对应域对象中数据的key值,那么问题来了,域对象有4种,如果每一个域对象中都存放一个key=message的数据,那么EL表达式取的是哪个呢?

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("message", "page");
        request.setAttribute("message", "request");
        session.setAttribute("message", "session");
        application.setAttribute("message", "application");
    %>
    ${message }
</body>
</html>

结果如图:

可以看到取的是pageContext中的数据,EL表达式默认取数据的方式是根据pageContext->request->session->application的顺序进行,如果在某个域对象中获取了数据,则返回,不再继续查找,如果没有找到,继续来到下一个域对象中查找,直到遍历完4个域对象。

我们也可以指定EL在某个特定的域对象中查找,只需要在EL表达式中添加前缀即可:pageScope,requestScope,sessionScope,applicationScope,分别对于page作用域,request作用域,session作用域,application作用域。

比如,指定EL在request中查找。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("message", "page");
        request.setAttribute("message", "request");
        session.setAttribute("message", "session");
        application.setAttribute("message", "application");
    %>
    ${requestScope.message }
</body>
</html>

EL取对象的属性值

EL表达式可以直接通过属性名取出对应的值,底层实际在调用getter方法。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Reader reader = new Reader();
        reader.setId(1);
        reader.setName("张三");
        request.setAttribute("reader", reader);
    %>
    ${reader.id }--${reader.name }
</body>
</html>

EL表达式获取集合

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%

        Reader reader = new Reader();
        reader.setId(1);
        reader.setName("张三");
        Reader reader2 = new Reader();
        reader2.setId(2);
        reader2.setName("李四");
        Reader reader3 = new Reader();
        reader3.setId(3);
        reader3.setName("王五");
        List<Reader> list = new ArrayList<Reader>();
        list.add(reader);
        list.add(reader2);
        list.add(reader3);
        request.setAttribute("list", list);
    %>
    ${list[0].id }--${list[0].name }<br/>
    ${list[1].id }--${list[1].name }<br/>
    ${list[2].id }--${list[2].name }<br/>
</body>
</html>

EL表达式支持关系运算符和逻辑运算符

运算符可以使用转义字符来表示:

&&:and

||:or

!:not

==:eq

!=:ne

<:lt

>:gt

<=:le

>=:ge

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        request.setAttribute("num1", 8);
        request.setAttribute("num2", 9);
        request.setAttribute("num3", 9);
    %>
    ${ num1 < num2 }<br/>
    ${ num1 lt num2 }<br/>
    ${ num1 > num2 }<br/>
    ${ num1 gt num2 }<br/>
    ${ num2 == num3 }<br/>
    ${ num2 eq num3 }<br/>
    ${ num1 < num2 && num1 > num2 }<br/>
    ${ num1 < num2 and num1 > num2 }<br/>
    ${ num1 < num2 || num1 > num2 }<br/>
    ${ num1 < num2 or num1 > num2 }<br/>
</body>
</html>

关键字empty判断变量是否为空

null,长度为零的String,size为0的集合都会认为是空。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Integer num = null; 
        String str = "";
        List<String> list = new ArrayList<String>();
        request.setAttribute("num", num);
        request.setAttribute("str", str);
        request.setAttribute("list", list);
    %>
    ${ empty num }<br/>
    ${ empty str }<br/>
    ${ empty list }<br/>
</body>
</html>

EL访问http请求参数对象

添加param前缀即可。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${param.id }
</body>
</html>

如果是多个参数,通过paramValues来获取。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${paramValues.id[0] }<br/>
    ${paramValues.id[1] }<br/>
    ${paramValues.id[2] }
</body>
</html>

EL访问pageContext对象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.southwind.entity.Reader" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${pageContext.servletConfig.servletName}<br/>
    ${pageContext.servletContext.contextPath}<br/>
    ${pageContext.request}
</body>
</html>

原文发布于微信公众号 - Java大联盟(javaunion)

原文发表时间:2018-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

Kotlin中常量的探究

在我们尝试使用Kotlin作为开发语言的时候,应该会想到在Kotlin中如何定义一个常量,就像Java中这样的代码一样

825
来自专栏10km的专栏

fastjson:javabean按字段(field)序列化存储为Map并反序列化

大部分json工具对java对象整体序列化都提供了简单的调用方式,以fastjson为例: Model model = new Model(); String ...

3445
来自专栏java闲聊

JDK8-Lambda表达式集合操作

public static List<Dish> toLists(){ return Arrays.asList( new...

883
来自专栏noteless

[二十六]JavaIO之再回首恍然(如梦? 大悟?)

我们上面列出来了ByteArray  File   Piped    Object  String  CharArray 这几种常用的数据源形式

1143
来自专栏携程技术中心

干货 | Kotlin超棒的语言特性

1654
来自专栏Java面试笔试题

Java中有几种类型的流?

字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io 包中还有许多其他的流,主...

972
来自专栏noteless

[二十四]JavaIO之PrintWriter

他与PrintStream的逻辑上功能目的是相同的--他们都想做同一件事情--更便捷的格式化打印输出

3662
来自专栏Java技术分享

xml解析技术概述和使用Jaxp对xml文档进行dom解析

用dom和sax对xml文档进行解析,可以使用已开发的xml解析开发包,我们直接调用即可。xml解析开发包有:Jaxp(最差)、Jdom(一般)、dom4j(最...

2288
来自专栏Java成神之路

java之IO

    java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同角度对其分类:

1023
来自专栏成长道路

文件的字节流和字符流

1.字节流 进行读取出文本的内容 try { FileInputStream fis=new FileInputStream(fileName); ...

2110

扫码关注云+社区

领取腾讯云代金券