12-EL 表达式

一、概述

EL 是缩写,全程是Experssion Language,表达式语言。作用就是替代 JSP 页面中数据访问时的复杂编码。语法很简单,就是这个${变量名}。废话不多说,先体验一下效果,新建el.jspel2.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 值。

二、查找

  1. 默认查找顺序

    我们看一下下面代码:

    <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呢?

  2. 指定查找❓

    指定查找需要加个前缀:

    • pageContext:${pageScope.name}
    • request: ${requestsScope.name}
    • session: ${sessionScope.name}
    • application: ${applicaitonScope.name}
  3. 级别关联

    新建一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值