EL表达式和JSTL
第七章 EL表达式和JSTL
数据和功能重复使用,便于移植,Sun公司提出“JavaBean技术”,使用JavaBean技术可以对这些数据和功能进行封装,做到一次编写,到处运行。
为了降低JSP页面的复杂度,增强代码重用性,Sun公司制定了一套标准标签库JSTL,同时为了获取Servlet域对象中存储的数据,JSP2.0规范里提供EL表达式。
7.1 初识JavaBean
概述
重复使用的软件组件,本质上就是Java类。
- 必须具有一个 公共的无参构造方法。
- 提供公共的get set方法
BeanUtils工具
方法声明 | 功能描述 |
---|---|
static void populate(Object bean,Map<String,?extends Object> properties) | 根据指定的名称/值为相应的JavaBean属性设置值 |
static void setProperty(Object bean,String name,Object value) | 根据指定的属性值,传入的类型要求能转换成相应的属性的类型 |
static String getProperty(Object bean,String name) | 返回指定bean指定属性的值,返回值为String类型 |
7.2 EL表达式
为了获取Servlet域对象中存储的数据,代码更简洁方便
EL中标识符正斜杠
使用符号标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。EL标识符由任意大小写字母、数字和下划线组成。
- 不能那个以数字开头
- 不能是EL中的关键字
- 不能是隐式对象
- 不能包含单引号(’)、(")、(-)和 (/)等特殊字符。
EL中的关键字
and eq gt true instanceof or ne le false empty not lt ge null div mod
EL中的变量
${product}
常量
EL中的常量又称为字面量,它是不能改变的数据。
- 布尔常量
true or false - 整型常量
取值范围是Java语言定义的常量Long.MIN_VALUE 到 Long.MAX_VALUE 之间 - 浮点数常量 双精度
- 字符串常量
本身包含的单引号双引号反斜杠需要进行转义, 前面再加个反斜杠() - Null常量
Null常量用于表示变量引用的对象为空,只有一个值null
EL中的运算符
点运算符(.) 方括号运算符( [] ) 算术运算符( + - * /或div %或mod )
比较运算符
==(eq) !=(ne) <(it) >(gt) <=(le) >=(ge)
避免与JSP页面的标签产生冲突,后面四重通常用括号内的。
逻辑运算符
&&(and) ||(or) !(not)
empty运算符
判断某个对象是否为null或者" "
${empty var}
变量不存在,变量值为null, 变量为集合且不包含任何元素
条件运算符
${A?B:C}
“()”运算符
优先级
优先级 | 运算符 |
---|---|
1 | [] |
2 | () |
3 | - not ! empty |
4 | * / div % mod |
5 | + - |
6 | < > <= >= lt gt le ge |
7 | == != eq ne |
8 | && and |
9 | or 短路或 |
10 | ? : |
注意: EL表达式取值,没有数组的下标越界,没有空指针异常,没有字符串的拼接。
EL隐式对象
隐含对象名称 | 描述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象 ,可以获取jsp其他八个隐式对象 |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScpope | 代表application域中用于保存属性的Map对象 |
param | 保存所有请求参数的Map对象 |
paramValues | 保存所有请求参数的Map对象,对于某个请求参数,返回的是一个String类型数组 |
header | 保存了所有HTTP请求头字段的Map对象 |
headerValues | 保存所有HTTP请求头字段的Map对象,返回String类型数组 |
cookie | 用来取得使用者的cookie,cookie类型是Map |
initParam | 保存了所有Web应用的初始化参数的Map对象 |
7.3 JSTL
降低JSP页面的复杂度,增强代码重用性。Sun公司定制了一套标准标签库,简称JSTL。
什么是JSTL
JSTL虽然被称为标准标签库,实际上这个标签库由5个不同的标签库共同组成
标签库 | 标签库的URI | 建议使用前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
l18n | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
- Core
核心标签库 实现Web应用通用操作的标签 。例如 <c:out> <c:if> <c:forEach> - l18n
国际化或格式化标签,包含实现Web应用中国际化标签和格式化标签。例如,JSP页面的本地信息,设置JSP页面的时区,使日期按照本地格式显示等。 - SQL标签库
包含用于访问数据库和对数据库中的数据进行操作的标签。数据库中获得数据库连接,从数据库表中检索数据等。一般不用 - XML
一个操作文档的标签库,包含对XML文档中数据进行操作的标签。解析XML文件,输出XML文档中的内容,迭代处理XML文档中的元素。处理XML文档很方便 - Functions
函数标签库,提供一套自定义EL函数,包含了JSP网页制作者经常用到的字符串操作。
<%@ taglib uri=" xxx " prefix="x" %>
//使用taglib指令导入Core标签库
Core标签库
- <c:out>
<c:out value="value" [default="defaultValue"] // 默认值
[escapeXml="true|false"]/>//特殊字符是否HTML转码
- <c:if>
<c:if text="textCondition" var="result" //条件 变量
[scope="{page | request | session | application }"] > //变量范围
标签体 //条件为真执行标签体
</c:if>
- <c:choose>
有点类似switch,与<c:when> <c:otherwise>
<c:choose>
<c:when test="${xxx}">
xxx
</c:when>
<c:otherwise>
xxx
</c:otherwise>
</c:choose>
- <c:forEach>
对集合对象进行循环迭代操作,Set List Map 数组 等
//语法1: 迭代包含多个对象的集合
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] - [end="end"] - [step="step"]
body content
</c:forEach>
//语法2: 迭代指定范围的集合
<c:forEach [var="varName"] - [varStatus="varStatusName"] begin="begin"
end="end" [step="step"]>
body content
</c:forEach>
- var当前迭代元素保存到page域中的名称
- items 用于指定要迭代的集合
- varStatus 指定当前迭代状态信息的对象保存到page域中的名称
- begin从第几个元素开始迭代 索引从0开始 没有指定items 从begin指定值开始迭代
- step迭代步长 迭代因子的增量
varStatus内属性
- count:集合内序号 1开始
- index: 索引 0开始
- first 是否为集合中第一个元素
- last 是否为集合中最后一个元素
- <c:param> 和<c:url>
前者获取参数,后者用于重新构造URL
<c:param>一般嵌套在<c:url>中,在URL地址中附加参数
- value,指定构造的URL
- context 指定导入同一服务器下其他Web应用的名称
- var 属性 指定构造的URL保存到域中的属性名称
- scope属性 指定保存到域对象