EL 表达式全称 Expression Language,也就是表达式语言,是 JavaWeb 开发里面 JSP 页面专用的轻量表达式,主要作用就是在 JSP 页面直接读取域对象里面保存的数据,替代原来繁琐的 JSP 脚本小脚本,不用写 Java 代码就可以完成取值运算和输出,很多初学者一开始不理解它的价值,是因为还习惯用 jsp 小脚本写 java 代码,代码冗余还很难维护,EL 表达式就是专门解决页面取值麻烦这个痛点。学习的时候第一步了解 EL 表达式的基础语法格式,第二步掌握四大内置域对象的查找顺序,第三步学习运算符 隐式对象,第四步掌握常见报错原因,最后结合 Servlet 传值到 JSP 的完整流程做练习。学会 el 表达式之后,JSP 页面代码会大幅精简,前后端分离之前的经典 JavaWeb 项目开发效率明显提升,也能看懂老项目里面大量 el 表达式代码。
基础定义
全称 Expression Language,简称 EL 表达式
所属技术 JavaWeb JSP 规范
核心功能 从 pageContext request session application 四大域读取数据,支持算术运算 逻辑运算 比较运算,还可以访问对象属性 数组集合元素
基础语法格式 { } 里面,这是最基础识别标志
四大域查找规则
el 表达式取值的时候,如果没有指定域,会按照从小到大的域顺序依次查找,找到就停止
查找顺序 page 域 pageScope request 域 requestScope session 域 sessionScope application 域 applicationScope
如果四个域都找不到对应 key,el 表达式不会抛出空指针,页面默认输出空白,这个是非常重要特点
核心功能对照表
| 功能分类 | 说明 | 示例 |
|---|---|---|
| 读取普通 key 值 | 获取域中保存的字符串 基本类型 | ${userName} |
| 对象属性取值 | 调用对象 getter 属性 | ${user.name} |
| 数组集合取值 | 下标访问数组 List 元素 | ${list[0]} |
| Map 取值 | 通过 key 读取 map 里面的值 | ${map[userKey]} |
| 运算计算 | 算术 比较 逻辑运算 | ${1+2>3} |
常用隐式对象
pageScope 获取 page 域数据
requestScope 获取 request 域数据
sessionScope 获取 session 域数据
applicationScope 获取 application 域数据
param 获取请求单个参数,相当于 request.getParameter
paramValues 获取请求多值参数数组
header 获取请求头信息
initParam 获取 web.xml 里面全局初始化参数
cookie 获取 cookie 对象
运算符说明
算术运算符 + - / %
比较运算符 == != > < >= <=
逻辑运算符 and or not
空判断运算符 empty,判断对象是否为 null 空字符串 空集合,这个是高频使用运算符,写法 ${empty obj}
常见开发问题
问题 1 el 表达式原样输出 ${xxx},没有解析
原因 老版本 JSP 默认没有开启 el 表达式,需要在 page 指令添加 isELIgnored false,或者 web.xml 修改 jsp 配置
问题 2 对象属性取不到值
原因 JavaBean 没有写对应的 getter 方法,el 表达式底层是依靠 getXxx 读取属性,不是直接访问私有成员变量
问题 3 同名 key 跨域冲突
原因 没有显式指定 scope,el 按顺序找到前面域的值,解决办法写全 requestScope.xxx sessionScope.xxx
使用优势和局限
优势 页面不用写 Java 小脚本,代码简洁,可读性更好,自动处理空值不会直接空指针报错
局限 只能做读取和简单运算,不能编写复杂业务逻辑,不能定义变量,不能写循环语句,循环一般搭配 JSTL 标签库一起使用
【常见问题】
问题 1 el 表达式介绍里面 el 表达式的基础语法是什么
回答 1 el 表达式介绍里面 el 表达式基础语法是 ${表达式},所有 el 表达式内容都要写在大括号美元符号里面,JSP 容器会自动解析里面的取值和运算。
问题 2 el 表达式介绍里面不指定域的时候查找顺序是什么
回答 1 el 表达式介绍里面,el 表达式默认查找顺序是 pageScope requestScope sessionScope applicationScope,从小到大依次查找,找到匹配 key 就停止取值。
问题 3 el 表达式介绍里面为什么 el 表达式输出原样不解析
回答 3 el 表达式介绍里面,el 表达式原样输出一般是 JSP 页面开启了 isELIgnored,页面指令设置为 true 就会忽略 el 表达式,改成 false 就可以正常解析 el 表达式。
问题 4 el 表达式介绍里面 el 表达式能不能写复杂业务代码
回答 4 el 表达式介绍里面 el 表达式只支持取值和简单运算,不能编写复杂业务逻辑,复杂循环判断一般搭配 JSTL 标签库配合 el 表达式使用。
【免责申明】
本文为 JavaWeb el 表达式技术学习参考,内容基于 JSP 规范,不同 Tomcat 版本 规范版本存在细微差异,实际项目请结合对应版本文档验证,不作为生产环境唯一开发标准。


