EL表达式.md

shuyepl 2022-07-12 21:17:09
Categories: Tags:

EL 表达式的作用

Excepssion Language(表达式语言)。EL 表达式可以代替 JSP 中的 java 代码,让 JSP 文件中的程序看起来更加整洁,美观。它最主要的作用是从某个作用域中取出数据,将其转成字符串,最后输出给浏览器。

基本语法格式

${表达式}

普通数据的取法

假如你在 request 中绑定了一个数据

request.setAttribute("username", "root");

使用 EL 表达式取出这个数据值的方式是

${username}
<%-- 不可以添加双引号,添加了双引号之后会被当做普通字符串处理,直接输出到浏览器 --%>

在 EL 表达式中,调用对象的 get 方法,不需要在对象的后面写上 get 方法,当成属性调用就可以了

${user.username}    
<%-- 这里的 user 是有一个对应的对象,这个对象里面有一个 username 属性 --%>
<%-- 也可以使用下面的方法取出这个东西 --%>
${user["username"]}

底层会去调用对象对应属性的 get 方法,也就是说,只要在 Java 程序中有一个 getXXX 方法,你就能通过上面的表达式去调用这个 get 方法,而不用管这个 get 方法是否有与之对应的属性。(这个 get 方法如果没有遵循驼峰命名方式的话是没有问题的,但,规范,还是遵守比较好)

取出在 map 中的数据

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%
    // 创建 map 集合
    Map<String, String> map = new HashMap<>();
    // 往 map 中存入数据
    map.put("username", "zhangsan");
    map.put("password", "123");
    // 将 map 绑定到 request 中
    request.setAttribute("userMap", map);
%>

<%-- 将数据取出并输出到浏览器中 --%>
${userMap.username}
${userMap.password}
${userMap["username"]}
${userMap["password"]}

取出在数组中的数据

<%@ page contentType="text/html;charset=UTF-8" %>

<%
    // 创建数组
    String[] names = {"zhangsan", "lisi", "wangwu"};
    // 往 request 中绑定数组
    request.setAttribute("names", names);
%>

<%-- 取出数据 --%>
${names[0]}
${names[1]}
${names[2]}

如果数组的下标越界了,什么也不会在浏览器上显示。

取 List 集合中的数据

格式和上面取数组中的数据一样。

取数据的优先级

在没有指定范围的情况下,如果不同的域里面绑定了相同 name 值的对象,那么在取对象的时候,优先从较小的域中取数据。

如何指定读取数据的范围

在 EL 表达式中有四个隐式的对象:pageScope、requestScope、sessionScope、applicationScope 。

在 EL 表达式里面显示带上这些隐式的对象,后面加上一个点 . ,就可以指定从那个域中取出相应的数据了,下面是一个例子

<%@page contentType="text/html;charset=UTF-8" %>

<%
    // 在四个域中绑定相同的数据
    session.setAttribute("data", "session");
    request.setAttribute("data", "request");
    pageContext.setAttribute("data", "pageContext");
    application.setAttribute("data", "application");
%>

${pageScope.data}
${requestScope.data}
${sessionScope.data}
${applicationScope.data}

取数据的时候写错了

使用 <%=%> 调用 request 的 getAttribute() 方法去数据的话会得到 null 。

如果使用 EL 表达式去取的话什么也取不到,在浏览器上什么也没有。

所以,EL 表达式相当于下面的代码

<%=request.getAttribute("name") == null ?  "" : request.getAttribute("name")%>

使用指令设置是否忽略 EL 表达式

<%@page isELIgnored="true" %>

true 表示忽略 EL 表达式,忽略后 EL 表达式就变成普通的字符串了。这个方式是将所有的 EL 表达式都忽略的,但有时候只想要忽略一两个 EL 表达式,这个时候可以直接在想忽略的 EL 表达式前面加上 \ 就行了,不用上面的这个指令。

EL 表达式中常用的隐式对象

pageContext

这个 pageContext 对应于 JSP 中的内置对象 pageContext ,通过 JSP 中 pageContext 的一系列 get 方法可以获取到很多对象。

例如在 JSP 中有使用下面这段代码可以获取 request 对象

<%pageContext.getRequest() %>

而在 EL 表达式中对应的获取 request 对象的方式为

${pageContext.request}

那么依次类推的,在 JSP 中获取项目根目录的方式为

<%=((HttpServletRequest)pageContext.getRequest()).getContextPath() %>

在 EL 表达式中获取这个根路径的方式为

${pageContext.request.contextPath}

param

<%=request.getParameter("name")%>

等价于

${param.name}

如果一个 name 对应于多个 value 的话,这个方式只能获取到第一个 value ,如果想要获取多个 value 的话,使用下面的这个隐式对象。

paramValues

${paramValues.name}

使用上面这条语句获取到的是一个字符串的数组,等同于

<%=request.getParameterValues("name")%>

所以,如果想要获取这个数组里面的元素,需要使用下标

${paramValues.name[0]}<br>
${paramValues.name[1]}<br>
${paramValues.name[2]}<br>

在测试上面这些代码时浏览器中填写的路径是

localhost:9000/cookie/example4.jsp?name=zhangsan&name=wangwu&name=lisi

initParam

在 xml 文件中配置如下

<context-param>
    <param-name>pageSize</param-name>
    <param-value>20</param-value>
</context-param>
<context-param>
    <param-name>pageNum</param-name>
    <param-value>5</param-value>
</context-param>

注意:一个 context-param 标签里面只能配置一个 param-name 标签和一个 param-value 标签,如果配置多个的话,我这边试了一下,好像只能读取到最后一个 pram-name 和 最后一个 param-value 中的信息。

在 JSP 中,内置对象 application 对应于 ServletContext ,application 对象就可以获取到 xml 中的配置信息

<%=application.getInitParameter("pageSize")%>
<%=application.getInitParameter("pageNum")%>

而在 EL 表达式中可以通过 initParam 来获取这些配置信息

${initParam.pageNum}
${initParam.pageSize}

EL 表达式中的运算符

算术运算符

+ - * / %

示例

${10 + 20}       <%-- 30 --%>
${10 + "20"}    <%-- 30 --%>

在 EL 表达式中 + 运算符只会做求和运算,不会做字符串拼接。

${10 + "abc"}  
<%-- 500 报错 --%>
<%-- java.lang.NumberFormatException: For input string: "abc" --%>

关系运算符

== != > >= < <= eq gt lt

示例

${"abc" == "abc"}     <%-- true --%>

EL 表达式中的 == 实际上是调用了 equals 方法。eq 和 == 是等价的。

!= 运算符运行的时候也会去调用 equals 方法,就是将 equals 方法的结果非了一下而已。

逻辑运算符

! && || not and or

! 和 not 的作用是一样的。

条件运算符

? :

取值运算符

[] .

empty 运算符

判断是否为空,空就是 true

${empty param.name}