EL表达式

EL表达式

转自 EL表达式详解 - 浅然言而信

一、介绍

  • Expression Language表达式语言
  • 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
  • 在JSP2.0开始引入概念
  • 在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值

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

四大域:(从上到下顺序是从小到大)

  • pageContext
  • request
  • session
  • application

如果没有使用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>

上面页面的运行结果是 linjie,即从pageContext中取数据

三、EL中的内置对象

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

1、${pageContext} 获取到 pageContext 对象,它不是在四个域里面去找,而是先在自己定义的对象中找,如果找到了就取出来。
2、${pageScope} 得到的是 page 域 (pageContext) 中保存数据的 Map集合。也就是指定在 page 域中查找。
3、${requestScope}、${sessionScope}、${applicationScope} 和上面的 pageScope 一样,都是在特定的域中检索数据。
4、${param} 获取存在 request 中请求参数的 Map,常用在数据回显上。
5、${paramValues} 获取存在 request 中请求参数名相同的值的 String[] 数组。
8、${header} 获取 HTTP 请求头的 Map 对象。
9、${headValues} 获取 HTTP 请求头值的 Map 对象
10、${cookie} 获取所有 cookie 的 Map 对象
11、${initParam} 获取保存所有 Web 应用初始化参数的 Map 对象
转自:[Mr_Demen
 - JSP的EL表达式中默认数据域及取值方式](https://blog.csdn.net/myspacedemen/article/details/78353635)

1、域属性相关(4个)

pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key(里面存放attribute键值,不存放param)
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
<%@ 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>

2、其他重要内置对象(4个)

2.1 pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取
  • 在EL中直接 ${pageContext.request} 即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象

重点:其中最常用的:${pageContext.request.contextPath},代表web应用下的根,可以看出下面action中的路径可读性更强了

// Regster.java
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);
    }

}
<!-- index.jsp -->
<%@ 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>
2.2 param(获取请求中的指定参数)
  • 这其实是底层调用 request.getParameter()
<!-- index.jsp -->
<%@ 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>
<!-- show.jsp -->
<%@ 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>
  • request.getParam(“key”)获取到的是请求url后面跟着的参数,例如www.baidu.com?username=张三

    request.getParam(“username”) 得到的值就是 张三,getParam 的所有结果都是字符串,因为url地址本身就是字符串,不指定类型

    request没有setParam方法,不能往里设置param的键值对

  • request.getAttribute 是获取在服务器端中 setAttribute 设置进去的值

    比如在服务端代码中,做一个页面跳转,A方法跳到B方法,可以在A方法中setAttribute设置键值对,再在B方法中getAttribute 取出来

2.3 paramValues
  • 获取请求中的指定参数的所以值,其底层实际调用 request.getParameterValues()
<!-- index.jsp -->
<%@ 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>
<!-- show.jsp -->
<%@ 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>
2.4 initParam
  • 获取初始化参数,其底层调用的是 ServletContext.getInitParameter()
<!-- web.xml -->
<?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>
<!-- index.jsp -->
<%@ 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>

四、EL访问Bean的属性

1、什么是 java bean

JavaBean是公共Java类,但是为了编辑工具识别

需要满足至少三个条件

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

2、EL访问Bean属性

  • EL可以通过 ${key.属性} 的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法
// Demo.java
package linjie.com;
/*
 *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();
    }

}
<!-- index.jsp -->
<%@ 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("linjie",12);
        request.setAttribute("ELttt", test);
    %>
    name=${requestScope.ELttt.name }<br>
    age=${requestScope.ELttt.age }<br>

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

</body>
</html>

requestScope 相当于 request 存放有attribute的地方,通过setAttribute和getAttribute来操作requestScope

五、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>
    <%
        String[] names={"xlj","lucy","king"};
        pageContext.setAttribute("names", names);
    %>
    name[1]=${names[1] }<br>

    <!-- 若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示 -->
    names[5]=${names[5] }<br>
</body>
</html>
package linjie.com;
/*
 *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();
    }

}
<!-- index.jsp -->
<%@ 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>

在这里EL表达式中没有指定从哪里取值,而是直接把用象名取值,这种操作会按照先后顺序从pageContext、request、session、application中取数据

六、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>

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

七、EL访问Map

<%@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", "xlj");
        pageContext.setAttribute("map", map);
    %>
    name=${map.name }<br>
    age=${map.age }<br>
</body>
</html>

八、EL中的运算符(empty)

1、常用运算符

  • 算术运算符:+、-、*、/、%(不支持++、–)
  • 关系运算符:==、!=、>、>=、<、<=
  • 逻辑运算符:!、&&、||、not、and、or
  • 条件运算符:?:
  • 取值运算符:[]、点号

2、empty运算符

用法为${empty 变量},结果为布尔值

<%@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>
    <%
        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函数

(这里面有图但typora存图有局限,EL函数基本不用吧,自己看懂后这里就不写了,可以去我转的原作者那里看)

因为EL本身不具有处理字符串能力,所以可以自定义EL函数

  • 定义函数(新建MyEL.java类)
  • 注册:先找到jsp2-example-taglib.tld,将头部以及注册函数复制到自己创建的.tld文件中(.tld放在WEB-INF下)
  • 在index.jsp中使用,使用时需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>

1、定义函数 MyEL.java

package linjie.com;

//自定义函数
//该类及其函数,需要在扩展名为.tld的xml文件中注册
//tld:tag library definition(标签库定义)
//xml文件是需要约束的,即需要配置文件头部。这个头部约束可以从一下文件中进行复制
//在Tomcat安装目录下:webapps\examples\WEB-INF\jsp2
//文件为:jsp2-example-taglib.tld

//这个.tld的xml文件,需要定义在当前web项目的WEB-INF目录下,在此目录下创建以.tld结尾的xml文件
//将jsp2-example-taglib.tld中头部复制到创建的xml文件中

//再将函数注册,还是在jsp2-example-taglib.tld底部中复制
public class MyEL {
    private static MyEL instance;
    public static MyEL getInstance() {
        if(instance==null)
        {
            instance=new MyEL();
        }
        return instance;
    }

    //字符串小写变大写
    public static String LowerToUpper(String str) {
        return str.toUpperCase();
    }
}

2、将jsp2-example-taglib.tld中头部部分以及底部的注册函数部分复制到自己创建的tld(在WEB-INF下)文件中

十、EL总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值