1 EL

随着 JSP 技术的广泛应用,一些问题也随之而来:JSP 主要用于内容的显示,如果嵌入大量的 Java 代码以完成复杂的功能,会使得 JSP 页面难以维护,虽然可以将尽可能多的 Java 代码放到 Servlet 或者 JavaBean 中,但是对于 JavaBean 的操作及集合对象的遍历访问等还是不可避免地会用到 Java 代码。
为了简化 JSP 页面中对象的访问方式,JSP2.0 引入了一种简捷的语言——表达式语言(Expression Language,EL)。
EL 表达式可以使 JSP 写起来更加简单,它基于可用的命名空间嵌套属性对集合、操作符的访问符,映射到 Java 类中静态方法的可扩展函数以及一组隐式对象
在使用 EL 从 scope 中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。Web 服务器对于 request 请求参数通常以字符串类型来发送,在获取时需要使用 Java API 类操作,而且还需要进行强制类型转换,而 EL 可以避免这些类型转换工作,允许用户直接使用 EL 表达式获取值,而不必关心数据类型。

1.1 EL 基础语法

  1. ${EL表达式}
  2. ${person.name}

上述 EL 表达式由两部分组组成:

  • “.”操作符左边是一个 JavaBean 对象或 EL 隐含对象。
  • “.”操作符右边是一个 JavaBean 属性名或映射键。

与其等价的是:

${person["name"]}

上述 EL 表达式中使用了“[]”操作符,与“.”相比,“[]”操作符更加灵活。

  • “.”操作符要求左边是 JavaBean 对象或 EL 隐含对象,不能是数组或集合元素。
  • “[]”可以是 JavaBean 对象或 EL 隐含对象或数组或集合元素。

例如访问数组 a 中的第一个元素:

${a[0]}

“[]”中可以是属性、映射键或索引下标,并使用双括号括起来。
注意:大部分情况下,使用“.”的 方式更加简捷方便,但当要访问的内容只有在运行时才能决定时,就只能使用“[]”的方式,因为“.”后面只能是字面值,而“[]”中的内容可以是一个变量。

1.2 EL 隐含对象

类别 对象 描述
JSP pageContext 引用当前JSP页面的pageContext内置对象
作用域 pageScope 获得页面作用范围中的属性值,相当于pageContext.getAttribute()
requestScope 获得请求作用范围中的属性值,相当于request.getAttribute()
sessionScope 获得会话作用范围中的属性值,相当于session.getAttribute()
applicationScpe 获得应用程序作用范围中的属性值,相当于application.getAttribute()
请求参数 param 获得请求参数的单个值,相当于request.getParameter()
paramValues 获得请求参数的一组值,相当于request.getParameterValues()
HTTP请求头 header 获得HTTP请求头中的单个值,相当于request.getHeader()
headerValues 获得HTTP请求头中的一组值,相当于request.getHeadersValues()
Cookie cookie 获得请求中的Cookie值
初始化参数 initParam 获得上下文的初始参数值

1.3 EL 运算符

1.3.1 算术运算符

算术运算符 说明 范例 运算结果
+ ${1+2} 3
${2-1} 1
* ${2*3} 6
/ 或 div ${16 / 5}或${16 div 5} 3
% 或 mod 取余 ${16 % 5}或${16 mod 5} 1

1.3.2 关系运算符

关系运算符 说 明 范 例 运算结果
== 或 eq 等于 ${1==2}或${1 eq 2} false
!= 或 ne 不等于 ${2!=1}或${1 ne 2} true
< 或 lt 小于 ${2 < 3}或${2 lt 3 } true
> 或 gt 大于 ${16 > 5}或${16 gt 5} true
<= 或 le 小于等于 ${16 <= 5}或${16 le 5} false
>= 或 ge 大于等于 ${16 >= 5}或${16 ge 5} true

1.3.3 逻辑运算符

逻辑运算符 说明 范例 运算结果
&& 或 and 与运算 ${true && true}或${true and true} true
|| 或or 或运算 ${ true || false}或${true or false} true
! 或not 非运算 ${! true}或${not true } false

2 JSTL

2.1 JSTL 简介

JSTL —Java Server Pages Standard Tag Library,JSP 标准标签库
JSTL 有以下优点:

  • 针对JSP开发中频繁使用的功能提供了简单易用的标签,从而简化了JSP开发;
  • 作为JSP规范,以统一的方式减少了JSP中的Java代码数量,力图提供一个无脚本环境;
  • 在应用程序服务器之间提供了一致的接口,最大程度的提高了Web应用在各应用服务器之间的可移植性。

JSTL 提供的标签库分为5个部分:

  • 核心标签库
  • 国际化输出标签库
  • XML 标签库
  • SQL 标签库
  • EL 函数库

    2.2 核心标签库

    在 JSP 页面中使用核心标签库,需要使用 taglib 指令导入,核心标签库通常使用前缀“c”,语法格式如下:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    

    2.2.1 通用标签

(1):输出数据。
其语法格式如下:

<c:out value="value" />

其中,“value”表示要输出的数据,可以是一个 EL 表达式或静态值。
(2):设置指定范围内的变量值。
其语法格式如下:

<c:set var="name" value="value" scope="page|request|session|application" />

其中:

  • var:指定变量的名称。
  • value:设置变量的值。
  • scope:指定变量的范围,可以是 page、request、session 或 application,缺省为 page。

    2.2.2 条件标签

  • 2.2.2.1

    用于进行条件判断,其语法格式:

    <c:if test="condition" var="name" scope="page|request|session|application">
      // condition为true时,执行的代码
    </c:if>
    

    2.2.3 迭代标签

    JSTL提供迭代标签简化了迭代操作代码,包括: