【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.setAttribute、session.setAttribute或application.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 }
相关推荐
光锥智能9 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
行思理10 小时前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
小溪学编程10 小时前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
xyouyuweizhu11 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟11 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
liyi_hz200812 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象32712 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
鬼手点金12 小时前
KV Cache 未必是一次性的:可编辑、可组合的“笔记”
java·人工智能·笔记·学习·自动化·1024程序员节
摇滚侠12 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记