Java EL表达式
外观
Java EL表达式[编辑 | 编辑源代码]
表达式语言(Expression Language, EL)是JSP 2.0引入的核心特性,用于简化JSP页面中的数据访问和操作。它提供了一种简洁的语法来访问JavaBean属性、集合元素、隐式对象等,避免了传统JSP脚本(如`<% %>`)的复杂性。
核心特性[编辑 | 编辑源代码]
- 自动类型转换
- 空值安全(Null-safe)访问
- 支持运算符和函数调用
- 访问作用域变量(request/session/application等)
- 与JSTL无缝集成
基本语法[编辑 | 编辑源代码]
EL表达式以`${`开始,以`}`结束:
<!-- 访问简单属性 -->
${user.name}
<!-- 访问集合元素 -->
${users[0].email}
<!-- 使用运算符 -->
${age >= 18 ? "成人" : "未成年"}
隐式对象[编辑 | 编辑源代码]
EL提供11个内置隐式对象:
对象类型 | 说明 |
---|---|
pageScope | page作用域变量 |
requestScope | request作用域变量 |
sessionScope | session作用域变量 |
applicationScope | application作用域变量 |
param | 请求参数(单值) |
paramValues | 请求参数(多值) |
header | HTTP请求头 |
headerValues | HTTP请求头(多值) |
cookie | Cookie值 |
initParam | 上下文初始化参数 |
pageContext | 提供JSP页面上下文访问 |
详细使用示例[编辑 | 编辑源代码]
属性访问[编辑 | 编辑源代码]
<!-- 假设有JavaBean: com.example.User -->
<jsp:useBean id="user" class="com.example.User" scope="request"/>
${user.name} <!-- 相当于 user.getName() -->
${user['name']} <!-- 另一种访问方式 -->
集合操作[编辑 | 编辑源代码]
<!-- 访问List -->
${userList[0].name}
<!-- 访问Map -->
${countryMap['CN']}
运算符[编辑 | 编辑源代码]
EL支持多种运算符:
<!-- 示例 -->
${(x + y) * z}
${empty shoppingCart ? "购物车为空" : "有商品"}
实际应用案例[编辑 | 编辑源代码]
用户登录信息显示[编辑 | 编辑源代码]
<!-- 检查登录状态 -->
<c:if test="${not empty sessionScope.user}">
欢迎,${sessionScope.user.name}!
您的权限是:${sessionScope.user.role}
<c:if test="${sessionScope.user.role == 'ADMIN'}">
(管理员模式)
</c:if>
</c:if>
表单处理[编辑 | 编辑源代码]
<!-- 显示表单错误 -->
<div class="error">
${param.error == '1' ? '用户名或密码错误' : ''}
</div>
<!-- 记住用户名 -->
<input type="text" name="username"
value="${cookie.rememberedUsername.value}"/>
高级特性[编辑 | 编辑源代码]
方法调用[编辑 | 编辑源代码]
从EL 3.0开始支持直接调用方法:
${user.getFullName(true)} <!-- 传递参数 -->
Lambda表达式[编辑 | 编辑源代码]
EL 3.0引入Lambda支持:
<%-- 计算阶乘 --%>
${factorial = n -> n == 1 ? 1 : n * factorial(n-1); factorial(5)}
常见问题[编辑 | 编辑源代码]
页面模块:Message box/ambox.css没有内容。
EL表达式在JSP默认是启用的,如果发现表达式不执行,检查以下配置: |
- 页面指令:`<%@ page isELIgnored="false" %>`
- web.xml配置:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
</jsp-property-group>
</jsp-config>
最佳实践[编辑 | 编辑源代码]
- 优先使用EL而非Scriptlet
- 对可能为null的对象使用`empty`检查
- 复杂逻辑应移至后台处理
- 避免在EL中编写过长表达式