EL表达式

一、EL表达式介绍

  • Expression language---表达式语言

  • 在jsp页面中获取数据的一种简单方式(只能获取数据,不能修改数据)

  • 在jsp2.0中开始引入

语法格式

${expression}

在jsp页面的任何静态部分均可通过以上格式来获取到指定表达式的值

二、EL获取数据(从四大域中获取属性)

1、EL表达式中的四大域
  • pageContext:变量只在定义的页面有效,作用域为当前页面
  • request:变量在一个请求中有效,即变量可以从一个页面转移到另一个页面,作用域为一个请求
  • session:变量在一个会话中有效,可跨越多个页面,作用域为一个会话
  • application:由于在服务器端,因此作用域是整个项目工程
2、默认查找

如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值

      <%@ page language="java" contentType="text/html; charset=UTF-8"
            pageEncoding="UTF-8"%>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"    "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        </head>
        <body>
            <%
                pageContext.setAttribute("name", "linjie");
                request.setAttribute("name", "lucy");
                session.setAttribute("name", "king");
                application.setAttribute("name", "bilibili");
            %>
            name=${name }
        </body>
        </html>

输出:name=linjie

3、查找效率

使用EL内置对象,从指定域中获取数据,提高了查找效率

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("name", "linjie");
        request.setAttribute("name", "lucy");
        session.setAttribute("name", "king");
        application.setAttribute("name", "bilibili");
    %>
    name=${applicationScope.name }
</body>
</html>

输出:name=bilibili

4、小结

jsp只能从四大域中获取指定的数据

没有指定查找范围,默认从小到大查找指定属性的值

四大域的大小关系: pageContext<request<session<application

三、EL中的内置对象

EL有11个内置对象,这里主要详细讲解域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型

名称 类型 描述
pageScope java.util.Map 获取pageContext域属性,相当于pageContext.getAttribute("xxx")
requestScope java.util.Map 获取request域属性,相当于request.getAttribute("xxx")
sessionScope java.util.Map 获取session域属性,相当于session.getAttribute("xxx")
applicationScope java.util.Map 获取application域属性,相当于application.getAttribute("xxx")
param java.util.Map 对应参数,是一个Map,其中key是参数,value是参数值,适用于单值的参数,相当于request.getParameter("key")
paramValues java.util.Map 对应参数,是一个Map,其中key是参数,value是多个参数值,适用于多值的参数,相当于request.getParameterValues("key")
initParam java.util.Map 获取web.xml中内的参数,${ initParam.xxx},xxx就是标签内的值,进而得到中的值
pageContext javax.servlet.ServletContext 可以获取JSP中request、response、session、servletContext、servletConfig等九大内置对象
cookie java.util.Map 用于获取cookie,Map<String,Cookie>,其中key是cookie的name,value是cookie对象,例如${cookie.JSESSIONID.value }就是获取sessionId
header java.util.Map 对应请求头,是一个Map,其中key表示头名称,value是单个头值,适用于单值的请求头,相当于request.getHeader("key")
headerValues: java.util.Map 对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值的请求头,相当于request.getHeaders("key")
1、域属性相关的四个

pageScope、requestScope、sessionScope、applicationScope

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        pageContext.setAttribute("name", "linjie");
        request.setAttribute("name", "lucy");
        session.setAttribute("name", "king");
        application.setAttribute("name", "bilibili");
    %>

    name=${applicationScope.name }<br>
    name=${pageScope.name }<br>
    name=${sessionScope.name }<br>
    name=${requestScope.name }<br>
</body>
</html>

输出:

name=bilibili

name=linjie

name=king

name=lucy

2、其他重要内置对象
  • pageContext
package linjie.com;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Regster extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    <form action="${pageContext.request.contextPath }/regster" method="POST">
        xxx<input type="text" name="name"/><br>
        yyy<input type="text" name="age"/><br>
        <input type="submit" value="点击">
    </form>
</body>
</html>

输出:web工程的根目录

  • param

其底层实际调用request.getParameter()

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    <form action="${pageContext.request.contextPath }/show.jsp" method="POST">
        xxx<input type="text" name="name"/><br>
        yyy<input type="text" name="age"/><br>
        <input type="submit" value="点击">
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    name=${param.name }<br>
    age=${param.age }<br>
</body>
</html>

客户端浏览器输入:xxx:zhangsan yyy:20

输出结果:name=zhangsan age=20

  • paramValues

获取请求中的指定参数的所有值,其底层实际调用request.getParameterValues()

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    <form action="${pageContext.request.contextPath }/show.jsp" method="POST">
        xxx<input type="text" name="name"/><br>
        yyy<input type="text" name="age"/><br>

        爱好:
        <input type="checkbox" name="hobby" value="sleep">睡觉
        <input type="checkbox" name="hobby" value="play">玩
        <input type="checkbox" name="hobby" value="eat">吃
        <input type="submit" value="点击">
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    name=${param.name }<br>
    age=${param.age }<br>


    hobby[0]=${paramValues.hobby[0] }<br>
    hobby[1]=${paramValues.hobby[1] }<br>
</body>
</html>

  • initParam

获取初始化参数,其底层调用的是ServletContext.getInitParameter()

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>07eltttt</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

<!--初始化参数 -->
  <context-param>
    <param-name>name</param-name>
    <param-value>张三</param-value>
  </context-param>


  <servlet>
    <display-name>Regster</display-name>
    <servlet-name>Regster</servlet-name>
    <servlet-class>linjie.com.Regster</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Regster</servlet-name>
    <url-pattern>/regster</url-pattern>
  </servlet-mapping>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    name=${initParam.name }
</body>
</html>

输出:name=张三

四、EL访问Bean对象

1、什么是Bean对象

JavaBean对象是公共java类,但为了编辑工具识别,需满足以下三点:

  • 有一个public默认构造器(例如无参构造器)
  • 属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写
  • 需要序列化。这个是框架,工具跨平台反映状态必须的
2、如何访问

EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法

package com.zjj.stu;
/*
 *Bean 
 */
public class Demo {
    private String name;
    private int age;
    public Demo(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return super.toString();
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="linjie.com.Demo"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Demo test=new Demo("zhangsan",12);
        request.setAttribute("ELttt", test);
    %>
    name=${requestScope.ELttt.name }<br>
    age=${requestScope.ELttt.age }<br>

    <!-- 若访问为null的对象的属性,EL是不会抛出空指针异常的,只是不显示而已 -->
    names=${requestScope.ELtttxx.name }<br>

</body>
</html>

输出:

name=zhangsan

age=test

names= (实际上这里输出了一个空字符)

五、EL访问数组中的数据

1、访问简单数组的数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>     
<body>
    <%
        String[] names={"xlj","lucy","king"};
        pageContext.setAttribute("names", names);
    %>
    name[1]=${names[1] }<br>

    <!-- 若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示 -->
    names[5]=${names[5] }<br>
</body>
</html>
2、访问对象数组中的数据
package com.zjj.stu;
/*
 *Bean 
 */
public class Stu {
    private String sname;
    private String address;
    public Stu() {
        super();
    }

    public Stu(String sname, String address) {
        super();
        this.sname = sname;
        this.address = address;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
     return super.toString();
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="linjie.com.*"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%
        Stu[] stus=new Stu[3];
        stus[0]=new Stu("xlj","A");
        stus[1]=new Stu("lucy","B");
        stus[2]=new Stu("kingA","C");
        pageContext.setAttribute("stus",stus);
    %>
    stus[1].Sname=${stus[1].sname }
</body>
</html>

输出:stus[1].Sname=lucy

六、EL获取list中数据

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        List<String> names=new ArrayList<String>();
        names.add("xlj");
        names.add("lucy");
        pageContext.setAttribute("names", names);
    %>

    <!-- 因为List底层是数组,所以可以这样写 -->
    names[1]=${names[1] }<br>
</body>
</html>

输出:names[1]=lucy

注意:EL可以通过下标索引访问List,但无法访问Set,因为Set中没有索引概念

七、EL访问Map

通过${对象.key}的格式获取

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("age", 20);
        map.put("name", "zhangsan");
        pageContext.setAttribute("map", map);
    %>
    name=${map.name }<br>
    age=${map.age }<br>
</body>
</html>

输出:

name=zhangsan

age=20

八、EL中的运算符

1、常用运算符
  • 算术运算符:+、-、*、/、%(不支持++、--)
  • 关系运算符:==、!=、>、>=、<、<=
  • 逻辑运算符:!、&&、||、not、and、or
  • 条件运算符:?:
  • 取值运算符:{}、点号(.)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--算术运算符--%>
1+2 = ${1+2}<br>

<%--关系运算符--%>
1==2 = ${1 == 2}<br>
1!=2 = ${1 != 2}<br>

<%--逻辑运算符--%>
true&&false = ${true && false}<br>
true||false = ${true || false}<br>

<%--
条件运算符
表达式为true,选择前者
--%>
${2+3>4 ? 5 : 4}<br>
${2+3<4 ? 4 : 5}
</body>
</html>

2、判空(empty)运算符

返回类型为Boolean型,结果为null返回true,反之返回false

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Title</title>
</head>
<body>
<%
    String name1=null;
    String name2="";
    List<String> name3=new ArrayList<String>();

    pageContext.setAttribute("name1", name1);
    pageContext.setAttribute("name2", name2);
    pageContext.setAttribute("name3", name3);
%>
empty对于没有定义的变量,运算结果为true:
empty namex=${empty namex }<br>

empty对于null的引用,运算结果为true:
empty name1=${empty name1 }<br>

empty对于为空串的String引用,运算结果为true:
empty name2=${empty name2 }<br>

empty对于没有元素的数组或集合,运算结果为true:
empty name3=${empty name3 }<br>
</body>
</html>

九、EL总结

  • EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
  • EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
  • EL不会抛出空指针异常,只会不显示
  • EL不会抛出数组越界异常,只会不显示
  • EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)

参考资料

[EL表达式详解]: https://blog.csdn.net/w_linux/article/details/79850223
[JSP中EL表达式的用法详解(必看篇)]: https://www.jb51.net/article/105314.html
原文地址:https://www.cnblogs.com/stublog/p/14115371.html