一、概述
EL
是缩写,全程是Experssion Language
,表达式语言。作用就是替代 JSP 页面中数据访问时的复杂编码。语法很简单,就是这个${变量名}
。废话不多说,先体验一下效果,新建el.jsp
与 el2.jsp
:
<%--el.jsp--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
request.setAttribute("name", "tom");
request.getRequestDispatcher("el2.jsp").forward(request, response);
%>
</body>
</html>
<%--el2.jsp--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
String name = (String) request.getAttribute("name");
%>
<%=name%>
<hr/>
${name} <%-- 这个就是 EL 表达式--%>
现在刷新一个 http://localhost:8080/el.jsp
,看看效果是不是一样!!!
${变量名} 就是域对象中取值,我们使用 requst 设置了 name ,EL 表达式就可以将值取出来。域对象就是page、request、session、application 。他可以非常便捷的取出域对象中保存的数据,前提是我们的域对象必须先有 setAttribute,EL 相当于在简化 getAttribute。
S{变量} 中的变量 就是 setAttribute 对应的 key 值。
二、查找
-
默认查找顺序
我们看一下下面代码:
<body> <% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); // request.getRequestDispatcher("el2.jsp").forward(request, response); %> ${name} </body>
猜一下,我打赌页面显示 applicaiton!!!
嗯,我错了。😏EL
对于 4 种域对象的查找顺序:pageContext->request->session->applicaiton
。按照这种顺序进行查找,找到立即返回,在 application 中也无法找到,则返回 null。我要是非取出session
呢? -
指定查找❓
指定查找需要加个前缀:
- pageContext:${pageScope.name}
- request: ${requestsScope.name}
- session: ${sessionScope.name}
- application: ${applicaitonScope.name}
-
级别关联
新建一个
User.java
package com.sunshine.entity; /** * @author 田港 * @version 1.0 * @date 2021-04-02 22:25 */ public class User { private Integer id; private String name; private Double score; public User(Integer id, String name, Double score) { this.id = id; this.name = name; this.score = score; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getScore() { return score; } public void setScore(Double score) { this.score = score; } }
然后我们在
el.jsp
中<% User user = new User(1, "张三", 86.5); pageContext.setAttribute("user", user); %> ${user}
访问
http://localhost:8080/el.jsp
,会发现是全类名+@+哈希值,实质上就是在调用 User 类的toString
方法。给我们这个 哈希值没啥用,所以我们一般会对这个toString()
方法进行重写,修改User.java
,添加代码如下:@Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", score=" + score + '}'; }
然后现在页面的结果就是
User{id=1, name='张三', score=86.5}
。下面我们要分别将 id,name,score 分别展示出来😙<table> <tr> <th>编号</th> <th>姓名</th> <th>成绩</th> </tr> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.score}</td> </tr> </table>
EL
表达式就是中间层的东西,实质上,就拿${user.id}
来说,这个最终会转换为((User)pageContext.getAttribute("user")).getId()
;
那么,问题来了,既然${user.id}
可以拿到值,那么${user.id=3}
是不是可以赋值呢?亲自试一下吧🙂我们一般不用这么赋值的。${user.id}
不是跟属性绑定,是在跟方法绑定
三、EL 表达式
<%
pageContext.setAttribute("num1", 10);
pageContext.setAttribute("num2", 11);
%>
${num1>num2}
<%-- 结果为 true --%>
支持 || && ! < > <= >= ==
,其中 &&
可以用 and
替代,||
可以用 or
替代,!
可以用not
替代,==
可以用eq
替代,!=
用ne
替代,<
用lt
替代,>
用gt
替代。<= le
,>= ge
。