Java基础(29)表达式语言(EL)的隐式对象及其作用

497 阅读3分钟

表达式语言(Expression Language,简称EL)是JSP 2.0及以上版本中引入的一种简化页面代码编写的语言,它提供了一种在JSP页面中更容易使用JavaBean属性及集合的方式。EL主要用于简化对Java代码的调用,特别是从后端到前端的数据传输。

EL定义了一套隐式对象,这些对象可以直接在EL表达式中使用,而不需要显式声明。以下是EL中的一些常见隐式对象及其作用:

1. pageScope

  • 作用:包含当前页面作用域内所有属性的Map。
  • 访问方式:pageScope['attributeName']

2. requestScope

  • 作用:包含当前请求作用域内所有属性的Map。
  • 访问方式:requestScope['attributeName']

3. sessionScope

  • 作用:包含当前会话作用域内所有属性的Map。
  • 访问方式:sessionScope['attributeName']

4. applicationScope

  • 作用:包含应用作用域(ServletContext)内所有属性的Map。
  • 访问方式:applicationScope['attributeName']

5. param

  • 作用:包含请求参数的Map,所有参数的值类型都是String。
  • 访问方式:param['paramName']

6. paramValues

  • 作用:包含请求参数的Map,它允许一个参数有多个值,因此Map的值是String数组。
  • 访问方式:paramValues['paramName'][index]

7. header

  • 作用:包含HTTP请求头的Map,所有头信息的值类型都是String。
  • 访问方式:header['headerName']

8. headerValues

  • 作用:包含HTTP请求头的Map,允许头信息有多个值,值是String数组。
  • 访问方式:headerValues['headerName'][index]

9. cookie

  • 作用:包含请求中所有的Cookie对象的Map,可以直接访问每个cookie的值。
  • 访问方式:cookie['cookieName'].value

10. initParam

  • 作用:包含所有初始化参数的Map(如web.xml中配置的)。
  • 访问方式:initParam['paramName']

源码级解析

EL是由JSP容器实现的,我们通常不直接处理其源码。但是,我们可以通过理解EL表达式是如何被解析和执行的来更深入地了解其工作原理。

当JSP页面被请求时,容器会解析页面上的EL表达式。容器内部将EL表达式转换为一个抽象语法树(AST),然后按照这个树来计算表达式的值。计算过程中,容器会检查隐式对象的Map,以及显式设置的属性,从而获取相应的值。

代码演示

一个简单的例子,使用param隐式对象输出请求中的参数值:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL Implicit Objects Demo</title>
</head>
<body>
Hello, ${param.name}!
</body>
</html>

假设请求URL是http://example.com/hello.jsp?name=John,页面会输出:

Hello, John!

在这个例子中,${param.name}是一个表达式,其中param是隐式对象,而name是请求参数的名字。

JSP容器在解析这个表达式时,会从param隐式对象中获取name参数的值,并将其输出到页面上。如果没有传递name参数,输出会是Hello, !,因为param.name将解析为null

EL表达式提供了一种简洁高效的方式来访问后台数据。通过使用EL隐式对象,开发者可以在JSP页面中以极简的代码实现数据访问和展示。