Jsp技术入门指南【八】利用EL表达式开发无脚本的JSP页面
前言
- 在之前的博客中,我们已经深入剖析了JSP页面的核心结构,从基础语法到动态交互的实现,逐步揭示了动态网页开发的底层逻辑。
- 通过这些内容的学习,相信我们已经对JSP的开发有了更清晰的认识,并且掌握了高效开发动态Web应用的关键技能。
接下来,我们将继续深入JSP的世界,探索EL表达式的强大功能。
EL表达式是JSP技术中用于简化页面代码、提升开发效率的重要工具。它不仅能够让页面更加简洁,还能有效避免脚本注入等安全问题。通过掌握EL表达式的高级用法,我们将能够更加灵活地处理页面数据,进一步提升开发效率和应用性能。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
一、什么是EL?
一句话总结:EL是JSP中用来简化Java代码的“轻量级表达式”,专门用于读取数据(替代<%= %>
脚本),避免在页面中写大量Java代码,让页面更干净!
核心优势:
- 不用写
request.getAttribute("key")
,直接${key}
就能取值 - 自动按作用域顺序查找(page → request → session → application)
- 支持对象、集合、数组的快速访问
二、EL如何访问作用域?
JSP有4个作用域,EL提供了对应的“隐式对象”来访问:
作用域 | EL隐式对象 | 示例(假设属性名是name ) |
---|---|---|
页面级(page) | pageScope |
${pageScope.name} |
请求级(request) | requestScope |
${requestScope.name} |
会话级(session) | sessionScope |
${sessionScope.name} |
应用级(application) | applicationScope |
${applicationScope.name} |
2.1 对比传统脚本 vs EL
- 场景:从request中取属性
r
- 传统脚本(老写法):
<%= request.getAttribute("r") %> <!-- 麻烦!要写完整代码 -->
- EL新写法(3种方式):
${requestScope.get("r")} <!-- 显式指定作用域+get方法 --> ${requestScope.r} <!-- 直接用属性名(推荐!) --> ${r} <!-- 省略作用域,EL会自动按顺序查找! -->
2.2 EL的“自动搜索机制”
如果省略作用域前缀(如${r}
),EL会按 page → request → session → application 的顺序查找,直到找到第一个匹配的属性名!
举例:
如果request和session中都有属性s
,${s}
会优先返回request中的值(因为request作用域更小,优先级更高)。
三、EL运算规则:什么能相加?什么不能?
看下面的代码示例,先自己猜结果,再看解释:
<%
request.setAttribute("a", 11); <!-- 整数 -->
request.setAttribute("b", 22); <!-- 整数 -->
request.setAttribute("c", "33"); <!-- 字符串(数字形式) -->
request.setAttribute("d", "dd"); <!-- 字符串(非数字形式) -->
%>
${a + b} <!-- 11 + 22 = 33(数字相加,正常运算) -->
${a + c} <!-- "1133"(数字+数字字符串,转为字符串拼接) -->
${a + d} <!-- 报错!(数字+非数字字符串,无法运算) -->
${c + c} <!-- "3333"(数字字符串相加,转为字符串拼接) -->
- 总结运算规则:
- 数字+数字:正常算术加法(如11+22=33)
- 数字+数字字符串(如
"33"
):转为字符串拼接(如11+“33”=“1133”) - 数字+非数字字符串(如
"dd"
):直接报错!(EL无法处理) - 字符串+字符串:只要其中一个不是纯数字,就拼接(如"33"+“33”=“3333”)
四、EL如何访问集合和数组?
EL可以直接访问Java中的List
、数组、Map
,语法比传统脚本简单10倍!
4.1 访问List/数组(通过索引)
代码示例:
<%
List<String> list = new ArrayList<>();
list.add("a"); // 索引0
list.add("b"); // 索引1
list.add("c"); // 索引2
request.setAttribute("list", list);
int[] num = {1, 2, 3}; // 数组,索引0是1
session.setAttribute("num", num);
%>
<!-- 访问List的第3个元素(索引2) -->
老写法:<%= ((List) request.getAttribute("list")).get(2) %> <!-- 麻烦!要强制转换 -->
新写法:${list[2]} 或 ${list.get(2)} <!-- 直接用索引或get方法,EL自动处理 -->
<!-- 访问数组的第1个元素(索引0) -->
新写法:${num[0]} <!-- 和List语法一样! -->
4.2 访问Map(通过键)
代码示例:
<%
Map<String, String> map = new HashMap<>();
map.put("k1", "key1");
map.put("k2", "key2");
application.setAttribute("map", map);
%>
<!-- 访问键为"k1"的值 -->
老写法:<%= ((Map) application.getAttribute("map")).get("k1") %> <!-- 繁琐! -->
新写法:${map.k1} 或 ${map["k1"]} <!-- 两种方式都可以! -->
<!-- 注意:如果键包含特殊字符(如空格、点),必须用[] -->
${map["user.name"]} <!-- 正确!键有"."时用[] -->
${map.user.name} <!-- 错误!会被当成属性嵌套访问 -->
五、EL常用的隐式对象:
除了作用域隐式对象(pageScope
等),EL还有一些常用的“内置对象”,比如:
param
:获取请求参数(相当于request.getParameter("key")
)用户名:${param.username} <!-- 等价于 request.getParameter("username") -->
header
:获取请求头(如User-Agent
)浏览器:${header["User-Agent"]} <!-- 注意特殊字符用[] -->
initParam
:获取web.xml中的全局初始化参数网站名:${initParam.siteName} <!-- 对应web.xml中的<context-param> -->
六、总结:
- 简洁:去掉
<%= %>
脚本,代码更干净. - 自动作用域搜索:
${key}
自动按page→request→session→application
查找,不用手动指定作用域对象 - 集合友好:直接用
list[索引]
、map.key
访问集合,省去强制类型转换 - 安全:避免脚本注入风险,新手写错了会报错提示(不像脚本可能隐藏bug)
记住一句话:只要是“从作用域/集合中取值”,就用EL表达式${ }
,告别繁琐的Java脚本
以上就是这篇博客的全部内容,下一篇我们将继续探索JSP的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |