JSP - 表达式语言( Expression Language)
JSP表达式语言(EL)使得可以轻松访问存储在JavaBeans组件中的应用程序数据。 JSP EL允许您创建表达式(a)算术和(b)逻辑。 在JSP EL表达式中,您可以使用integers, floating point numbers, strings, the built-in constants true and false表示布尔值,以及null。
简单的语法
通常,在JSP标记中指定属性值时,只需使用字符串即可。 例如 -
<jsp:setProperty name = "box" property = "perimeter" value = "100"/>
JSP EL允许您为任何这些属性值指定表达式。 JSP EL的简单语法如下 -
${expr}
这里expr指定表达式本身。 JSP EL中最常见的运算符是. 和[] 。 这两个运算符允许您访问Java Bean和内置JSP对象的各种属性。
例如,上面的语法《jsp:setProperty》标签可以用类似的表达式编写 -
<jsp:setProperty name = "box" property = "perimeter"
value = "${2*box.width+2*box.height}"/>
当JSP编译器在属性中看到${}表单时,它会生成用于计算表达式的代码并替代expresson的值。
您还可以在模板文本中使用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} equals 9, but ${1 + (2 * 3)} equals 7 。
要停用EL表达式的评估,我们指定page指令的isELIgnored属性,如下所示 -
<%@ page isELIgnored = "true|false" %>
此属性的有效值为true和false。 如果为true,则EL表达式在静态文本或标记属性中出现时将被忽略。 如果为false,则由容器评估EL表达式。
EL中的基本操作符
JSP表达式语言(EL)支持Java支持的大多数算术和逻辑运算符。 下表列出了最常用的运算符 -
S.No. | 操作符和说明 |
---|---|
1 | . 访问bean属性或Map条目 |
2 | [] 访问数组或List元素 |
3 | ( ) 对子表达式进行分组以更改评估顺序 |
4 | + 加成 |
5 | - 减去或否定一个值 |
6 | * 乘法 |
7 | / or div 师 |
8 | % or mod Modulo(余数) |
9 | == or eq 测试平等 |
10 | != or ne 测试不平等 |
11 | 《 or lt 测试小于 |
12 | 》 or gt 测试大于 |
13 | 《= or le 测试小于或等于 |
14 | 》= or ge 测试大于或等于 |
15 | && or and 测试逻辑AND |
16 | || or or 测试逻辑OR |
17 | ! or not 一元布尔补 |
18 | empty 测试空变量值 |
JSP EL中的函数
JSP EL允许您在表达式中使用函数。 必须在自定义标记库中定义这些函数。 函数用法具有以下语法 -
${ns:func(param1, param2, ...)}
其中ns是函数的命名空间, func是func的名称, param1是第一个参数值。 例如,函数fn:length ,它是JSTL库的一部分。 此函数可用于获取字符串的长度,如下所示。
${fn:length("Get my length")}
要使用任何标记库(标准或自定义)中的函数,必须在服务器上安装该库,并且必须使用《taglib》指令将库包含在JSP中,如JSTL章节中所述。
JSP EL隐式对象
JSP表达式语言支持以下隐式对象 -
S.No | 隐含对象和描述 |
---|---|
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对象,您可以访问请求对象。 例如,要访问请求的传入查询字符串,可以使用以下表达式 -
${pageContext.request.queryString}
范围对象
pageScope, requestScope, sessionScope和applicationScope变量提供对存储在每个范围级别的变量的访问。
例如,如果需要在应用程序范围中显式访问box变量,则可以通过applicationScope变量作为applicationScope.box访问它。
param和paramValues对象
param和paramValues对象使您可以访问通常通过request.getParameter和request.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.getHeader和request.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>
输出有点像以下 -
<h1>User Agent Example</h1>
<div align="center">
<p>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)</p>
</div>
头对象返回单个字符串值,而headerValues对象返回字符串数组。