JSP - 表达式语言 (EL)



JSP 表达式语言 (EL) 使得轻松访问存储在 JavaBean 组件中的应用程序数据成为可能。JSP EL 允许您创建(a)算术和(b)逻辑两种表达式。在 JSP EL 表达式中,您可以使用整数、浮点数、字符串、内置常量 true 和 false表示布尔值,以及 null。

简单语法

通常,当您在 JSP 标签中指定属性值时,只需使用字符串。例如 -

<jsp:setProperty name = "box" property = "perimeter" value = "100"/>

JSP EL 允许您为这些属性值中的任何一个指定表达式。JSP EL 的简单语法如下所示 -

${expr}

这里expr指定表达式本身。JSP EL 中最常见的运算符是.[]。这两个运算符允许您访问 JavaBean 和内置 JSP 对象的各种属性。

例如,上述语法<jsp:setProperty>标签可以用表达式编写,例如 -

<jsp:setProperty name = "box" property = "perimeter" 
   value = "${2*box.width+2*box.height}"/>

当 JSP 编译器在属性中看到${}形式时,它会生成代码来计算表达式并替换表达式的值。

您还可以在标签的模板文本中使用 JSP EL 表达式。例如,<jsp:text>标签只是将其内容插入 JSP 的主体中。以下<jsp:text>声明将<h1>Hello JSP!</h1>插入 JSP 输出中 -

<jsp:text>
   <h1>Hello JSP!</h1>
</jsp:text>

您现在可以在<jsp:text>标签(或任何其他标签)的主体中包含 JSP EL 表达式,使用与您用于属性的相同的${}语法。例如 -

<jsp:text>
   Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

EL 表达式可以使用括号来组合子表达式。例如,${(1 + 2) * 3} 等于 9,但 ${1 + (2 * 3)} 等于 7

要停用 EL 表达式的计算,我们如下所示指定页面指令的isELIgnored属性 -

<%@ page isELIgnored = "true|false" %>

此属性的有效值为 true 和 false。如果为 true,则在静态文本或标签属性中出现 EL 表达式时将被忽略。如果为 false,则容器将计算 EL 表达式。

EL 中的基本运算符

JSP 表达式语言 (EL) 支持 Java 支持的大多数算术和逻辑运算符。下表列出了最常用的运算符 -

序号 运算符 & 描述
1

.

访问 Bean 属性或 Map 条目

2

[]

访问数组或列表元素

3

( )

组合子表达式以更改计算顺序

4

+

加法

5

-

减法或值的否定

6

*

乘法

7

/ 或 div

除法

8

% 或 mod

取模(余数)

9

== 或 eq

测试相等性

10

!= 或 ne

测试不相等性

11

< 或 lt

测试小于

12

> 或 gt

测试大于

13

<= 或 le

测试小于或等于

14

>= 或 ge

测试大于或等于

15

&& 或 and

测试逻辑 AND

16

|| 或 or

测试逻辑 OR

17

! 或 not

一元布尔补码

18

empty

测试空变量值

JSP EL 中的函数

JSP EL 也允许您在表达式中使用函数。这些函数必须在自定义标签库中定义。函数用法具有以下语法 -

${ns:func(param1, param2, ...)}

其中ns是函数的命名空间,func是函数的名称,param1是第一个参数值。例如,函数fn:length是 JSTL 库的一部分。此函数可以按如下方式使用以获取字符串的长度。

${fn:length("Get my length")}

要使用任何标签库(标准或自定义)中的函数,您必须在服务器上安装该库,并且必须使用<taglib>指令在 JSP 中包含该库,如 JSTL 章节中所述。

JSP EL 隐式对象

JSP 表达式语言支持以下隐式对象 -

序号 隐式对象 & 描述
1

pageScope

页面范围内的作用域变量

2

requestScope

请求范围内的作用域变量

3

sessionScope

会话范围内的作用域变量

4

applicationScope

应用程序范围内的作用域变量

5

param

请求参数作为字符串

6

paramValues

请求参数作为字符串集合

7

header

HTTP 请求标头作为字符串

8

headerValues

HTTP 请求标头作为字符串集合

9

initParam

上下文初始化参数

10

cookie

Cookie 值

11

pageContext

当前页面的 JSP PageContext 对象

您可以在表达式中使用这些对象,就像它们是变量一样。以下示例将帮助您理解这些概念 -

pageContext 对象

pageContext 对象允许您访问 pageContext JSP 对象。通过 pageContext 对象,您可以访问 request 对象。例如,要访问请求的传入查询字符串,您可以使用以下表达式 -

${pageContext.request.queryString}

作用域对象

pageScope、requestScope、sessionScopeapplicationScope变量提供对存储在每个作用域级别的变量的访问。

例如,如果您需要显式访问 application 作用域中的 box 变量,您可以通过 applicationScope 变量访问它,如applicationScope.box

param 和 paramValues 对象

param 和 paramValues 对象允许您访问通常通过request.getParameterrequest.getParameterValues方法可用的参数值。

例如,要访问名为 order 的参数,请使用表达式${param.order}${param["order"]}

以下是访问名为 username 的请求参数的示例 -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "Accessing Request Param";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${param["username"]}</p>
      </div>
   </body>
</html>

param 对象返回单个字符串值,而 paramValues 对象返回字符串数组。

header 和 headerValues 对象

header 和 headerValues 对象允许您访问通常通过request.getHeaderrequest.getHeaders方法可用的标头值。

例如,要访问名为 user-agent 的标头,请使用表达式${header.user-agent}${header["user-agent"]}

以下是访问名为 user-agent 的标头参数的示例 -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "User Agent Example";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${header["user-agent"]}</p>
      </div>
   </body>
</html>

输出将类似于以下内容 -

User Agent Example

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)

header 对象返回单个字符串值,而 headerValues 对象返回字符串数组。

广告