【Java Web】EL表达式

文章目录

举例一个简单的用户信息展示场景,包含用户的姓名和年龄。

下面分别用 JSP 脚本和 EL 表达式两种方式实现这个功能。

使用 JSP 脚本

jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head><title>用户信息</title></head>
    <body>
        <%
        Map<String, Object> user = new HashMap<>();
        user.put("name", "张三");
        user.put("age", 25);
        request.setAttribute("user", user);
        %>
        <p>用户名: <%= ((Map)request.getAttribute("user")).get("name") %></p>
        <p>年龄: <%= ((Map)request.getAttribute("user")).get("age") %></p>
    </body>
</html>

创建Map模拟用户数据,并将其作为请求属性设置。然后使用 <%= ... %> 语法从Map中获取并显示用户的姓名和年龄。

使用 EL 表达式

isELIgnored="false" 开启 EL 表达式(idea2023自动开启)

jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head><title>用户信息</title></head>
    <body>
        <%
        Map<String, Object> user = new HashMap<>();
        user.put("name", "张三");
        user.put("age", 25);
        request.setAttribute("user", user);
        %>
        <p>用户名: ${user.name}</p>
        <p>年龄: ${user.age}</p>
    </body>
</html>

该例同样设置了用户数据为请求属性,但使用了 ${...} 这样的EL表达式来引用这些属性。

EL表达式

EL(Expression Language)表达式是JavaServer Pages (JSP) 技术的一部分,它提供了一种方便的方法来访问和处理存储在JavaBeans组件中的数据。使用EL表达式的优点包括简化页面上的代码、提高可读性以及更好地分离业务逻辑与表示层。

EL 表达式标准格式:${expression}

  • expression 可以是任何有效的表达式,包括变量、方法调用等。
操作符 描述 示例
点操作符(. 访问对象的属性 ${news.title}
方括号操作符([] 访问对象的属性 访问属性或集合元素 ${news["title"]} == ${news.title} ${newsList[0]} & ${map['key']}

EL严格区分大小写,严格按规范书写,养成良好编码习惯

运算符

EL 不仅提供了访问和操作数据的方法,还包含了一系列运算符来支持基本的算术、比较和逻辑操作。这些运算符使得可以在 JSP 页面中直接进行简单的计算和条件判断。

运算符 说明
( ) 改变执行的优先级,例如 ${3\*(4+5)}
+,-,*,/,% 算术运算符
==,!=,>,>=,<,<= 关系运算符
&&,||,! 逻辑运算符
?: 条件运算符,例如 ${a>b?1:2}
empty,not empty 用来检查变量是否(不)为空或null,例如 ${empty user.name}
in,not in 检查左边的操作数是否(不)是右边集合的一个元素,例如 ${'admin' in roles}

为了避免 JSP 混淆运算符和页面关键字,很多运算符都有替代写法。

关系运算符 范例 结果
== 或 eq 5 = = 5 或 {5 == 5}或 5==5或{5 eq 5} true
!= 或 ne 5 ! = 5 或 {5 != 5}或 5!=5或{5 ne 5} false
< 或 lt 3 < 5 或 {3 < 5}或 3<5或{3 lt 5} true
> 或 gt ${3 > 5}或{3 gt 5} false
<= 或 le 3 < = 5 或 {3 <= 5}或 3<=5或{3 le 5} true
>= 或 ge 3 > = 5 或 {3 >= 5}或 3>=5或{3 ge 5} false
逻辑运算符 范例
&& 或 and ${user.age >= 18 && user.isAdmin == true}
||或 or ${user.isAdmin == true || user.isModerator == true}
! 或 not ${!empty user.name}

错误示范

jsp 复制代码
${param.password1} == ${param.password2} 
${ ${param.password1 } == ${ param.password2 } }
  • 分别解析 ${param.password1}${param.password2} 为字符串,且 == 将被视为纯文本而不是比较运算符
  • EL 表达式不允许嵌套使用花括号 {}

正确示例

在 JSP 页面中根据密码是否匹配来执行某些逻辑,可使用 <c:if> 标签结合 EL 表达式实现

jsp 复制代码
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head><title>密码比较示例</title></head>
    <body>
        <c:if test="${param.password1 == param.password2}">
            <p>两次输入的密码一致。</p>
        </c:if>
        <c:if test="${param.password1 != param.password2}">
            <p>两次输入的密码不一致,请重新输入。</p>
        </c:if>
    </body>
</html>

EL功能

获取对象属性

使用EL表达式可以直接访问JavaBean对象的属性,前提是该对象已经通过某种方式(如request.setAttributesession.setAttributeapplication.setAttribute)设置到了作用域中。

jsp 复制代码
${bean.propertyName}
jsp 复制代码
<%
    News news = new News();
    news.setTitle("今日新闻");
    request.setAttribute("news", news);
%>
<p>新闻标题: ${news.title}</p>

获取集合元素

对于数组、列表和映射,可以通过索引来访问特定的元素。

  • 数组/列表:

    ${list[0]}
    
  • 映射:

    ${map['key']}
    
jsp 复制代码
<%
    List<String> list = Arrays.asList("第一条新闻", "第二条新闻");
    Map<String, String> map = new HashMap<>();
    map.put("first", "第一条新闻");

    request.setAttribute("list", list);
    request.setAttribute("map", map);
%>

<p>列表中的第一条新闻: ${list[0]}</p>
<p>映射中的第一条新闻: ${map['first']}</p>

数据处理运算

EL支持基本的算术运算符,可以用来进行简单的计算。假设需要计算总页数:

jsp 复制代码
<%
    int totalRecordCount = 100;
    int pageSize = 10;
    request.setAttribute("totalRecordCount", totalRecordCount);
    request.setAttribute("pageSize", pageSize);
%>

<p>总页数: ${totalRecordCount / pageSize}</p>

屏蔽常见异常

如果尝试访问一个不存在的属性或空对象,EL默认不会抛出异常,而是返回空字符串或null。这有助于提高程序的健壮性。

jsp 复制代码
<% // 没有设置username %>
<p>用户名: ${username}</p>
<!-- 输出为空 -->

自动类型转换

EL会根据上下文自动进行类型转换。例如,如果从作用域中获取的对象是News类型,那么${news}会自动转换为News类型的对象。

jsp 复制代码
<%
    News news = new News();
    news.setTitle("今日新闻");
    request.setAttribute("news", news);
%>
<% // 相当于 (News) request.getAttribute("news") %>
<p>新闻对象: ${news}</p>
<!-- 这里通常会输出news对象的toString()方法的结果 -->

EL访问作用域

作用域 Java代码取值 EL取值
请求作用域 request.getAttribute("news"); ${ requestScope.news }
会话作用域 session.getAttribute("username"); ${ sessionScope.username }
程序作用域 application.getAttribute("count"); ${ applicationScope.count }
页面作用域 pageContext.getAttribute("userNum"); ${ pageScope.userNum }
相关推荐
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹3 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫4 小时前
泛型(2)
java
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石4 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶5 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb