【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 }
相关推荐
TDengine (老段)2 小时前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
心随雨下2 小时前
Tomcat日志配置与优化指南
java·服务器·tomcat
Kapaseker2 小时前
Java 25 中值得关注的新特性
java
wljt2 小时前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动2 小时前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
canonical_entropy2 小时前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert3182 小时前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式
不是株3 小时前
JavaWeb(后端进阶)
java·开发语言·后端
编程火箭车3 小时前
【Java SE 基础学习打卡】02 计算机硬件与软件
java·电脑选购·计算机基础·编程入门·计算机硬件·软件系统·编程学习路线