表达式语言(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页面中以极简的代码实现数据访问和展示。