Jsp技术入门指南【八】利用EL表达式开发无脚本的JSP页面

发布于:2025-04-21 ⋅ 阅读:(17) ⋅ 点赞:(0)


前言

  • 在之前的博客中,我们已经深入剖析了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"(数字字符串相加,转为字符串拼接) -->  
  • 总结运算规则:
  1. 数字+数字:正常算术加法(如11+22=33)
  2. 数字+数字字符串(如"33"):转为字符串拼接(如11+“33”=“1133”)
  3. 数字+非数字字符串(如"dd"):直接报错!(EL无法处理)
  4. 字符串+字符串:只要其中一个不是纯数字,就拼接(如"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还有一些常用的“内置对象”,比如:

  1. param:获取请求参数(相当于request.getParameter("key")
    用户名:${param.username}  <!-- 等价于 request.getParameter("username") -->  
    
  2. header:获取请求头(如User-Agent
    浏览器:${header["User-Agent"]}  <!-- 注意特殊字符用[] -->  
    
  3. initParam:获取web.xml中的全局初始化参数
    网站名:${initParam.siteName}  <!-- 对应web.xml中的<context-param> -->  
    

六、总结:

  1. 简洁:去掉<%= %>脚本,代码更干净.
  2. 自动作用域搜索${key}自动按page→request→session→application查找,不用手动指定作用域对象
  3. 集合友好:直接用list[索引]map.key访问集合,省去强制类型转换
  4. 安全:避免脚本注入风险,新手写错了会报错提示(不像脚本可能隐藏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

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到