1. EL
- EL(Expression Language,表达式语言):简化JSP开发中的对象引用,从而规范页面代码,增强程序的可读性和可维护性
1.1 EL的语法格式
${表达式}
-
注意:如果在JSP页面中要显示字符串"
"${"
,必须在前面加上符号"\"
或者写成"${${}"
-
案例:
<!--在servlet中设置属性name--> request.serAttribute("name", "why"); <!--在jsp中的两种获取方式--> <%=request.getAttribute("name")%> ${name}<!--使用EL表达式-->
-
EL表达式特点
- EL可以与JS语句结合使用
- 可以自动进行类型转换(通过EL获取两个字符串数值的和,可以直接使用
+
进行连接) - 不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象
- 在EL中,可执行算术、逻辑、关系和条件运算等
- 可获取pageContext对象,进而获取其他内置对象
- 除法运算时,如果除数为0,返回无穷大(Infinity),不返回错误
- 可以访问JSP的作用域
1.2 EL中的标识符
- 不能以数字开头
- 不能是EL中的关键字
- 不能是EL中的隐式对象
- 不能包含单引号、双引号、减号、正斜线等特殊字符
1.3 EL中的关键字
and eq gt true instanceof
or ne le false empty
not lt ge null div mod
1.4 EL中的变量
-
EL中的变量是一个基本的存储单元,不用事先定义就可以直接使用
${password} <!--password就是一个变量,通过表达式就可以访问变量password的值-->
1.5 EL中的常量
-
布尔常量:true和false
-
整型常量:pow(-2, 63) ~ pow(2, 63) - 1之间
-
浮点型常量:4.9E-324 ~ 1.8E308之间
-
字符串常量:字符串本身包含的单引号或双引号和反斜杠都需要用
"\"
进行转义 -
Null常量:表示变量引用的对象为空,它只有一个值,用null表示
1.6 EL访问数据
-
点运算符(
.
)${user.name} <!--访问user对象中的name属性-->
-
中括号运算符(
[]
)${user["name"]}
-
应用情况
- 二者某种情况下可以互换,例如:
${user.name}
等价于${user["name"]}
- 中括号还可以访问List集合或数组中指定索引的某个元素;例如:
${users[0]}
- 二者可以相互结合使用,例如:
${users[0].name}
- 二者某种情况下可以互换,例如:
1.7 EL中的运算符
-
算术运算符
算术运算符 说明 算术表达式 + 加 ${3 + 4} - 减 ${3 - 4} * 乘 ${3 * 4} / 或 div 除 ${10 / 2} 或 ${10 div 2} % 或 mod 取模(取余) ${10 % 4} 或 ${10 mod 4} - 除法运算时,商为小数
+
不能连接两个字符串,如果连接两个不可以转换为数值型的字符串,抛出异常,否则自动转换为数值型,然后进行加法
-
比较运算符
比较运算符 说明 算术表达式 == 或 eq 等于 ${1 == 2} 或 ${1 eq 2} != 或 ne 不等于 ${1 != 2} 或 ${1 ne 2} < 或 lt 小于 ${1 < 2} 或 ${1 lt 2} > 或 gt 大于 ${1 > 2} 或 ${1 gt 2} <= 或 le 小于等于 ${1 <= 2} 或 ${1 le 2} >= 或 ge 大于等于 ${1 >= 2} 或 ${1 ge 2} - 为了避免页面产生标签冲突,后面四种采用第二种表示方式
- 如果运算符后面是数字,则在运算符和数字之间至少要有一个空格
-
逻辑表达式
逻辑运算符 说明 算术表达式 && 或 and 逻辑与 ${true && false} 或 ${true and false} || 或 or 逻辑或 ${true || false} 或 ${true or false} ! 或 not 逻辑非 ${! true} 或 ${not true} -
empty运算符
- 判断对象是否为空,该运算符是前缀运算符,用于确定对象或变量是否为null或空
${empty expression}
- null:表示足够变量没有指明任何对象
- 空:这个变量所属的对象内容为空
-
条件运算符
${A ? B : C}
-
EL中运算符的优先级
优先级 运算符 1 [] . 2 () 3 -(unary) not ! empty 4 * / div % mod 5 + -(binary) 6 < > <= >= lt gt le ge 7 == != eq ne 8 && and 9 || or 10 ?:
2. EL隐式对象
隐式对象名称 | 描述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象 |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
seesionScope | 代表seesion域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 一个保存了所有请求参数的Map对象 |
paramValues | 一个保存了所有请求参数的Map对象,对于某个请求参数,返回的是一个String类型的数组 |
header | 一个保存了所有HTTP请求头字段的Map对象 |
headerValues | 一个保存了所有HTTP请求头字段的Map对象,返回String类型数组 |
cookie | 获取使用者的Cookie值,Cookie的类型是Map |
initParam | 一个保存了所有Web应用初始化参数的Map对象 |
2.1 pageContext对象
- 用法:
${pageContext.response.characterEncoding}
<!--获取response对象中的characterEncoding属性-->
- 不要将EL中的隐式对象和JSP中的隐式对象混淆,只有pageContext对象是它们共有的,其他隐式对象则毫不相关
2.2 Web域相关对象
- 4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息
<body>
<% pageContext.setAttribute("username", "why");%>
<% request.setAttribute("bookName", "java web");%>
<% session.setAttribute("username", "it");%>
<% application.setAttribute("bookName", "java");%>
\${pageScope.username}的值为: ${pageScope.username} <br/>
\${requestScope.bookName}的值为: ${requestScope.bookName} <br/>
\${sessionScope.bookName}的值为: ${sessionScope.username} <br/>
\${applicationScope.bookName}的值为: ${applicationScope.bookName} <br/>
</body>
- 使用EL获取某个域对象中属性时,也可以不指定查找域,而直接引用域中的属性名称,他会按照page、request、session、application的顺序依次查找
2.3 访问环境信息的隐式对象
-
param对象用于获取请求参数的某个值,它是Map类型,与
request.getParameter()
方法相同,使用EL获取时,如果参数不存在,返回空字符串${param.name}
- 如果一个请求参数有多个值,使用param获取时,只返回第一个值
-
如果一个请求参数有多个值,可以使用paramValues对象获取请求参数的所有值,返回请求参数所有值所组成的数组
${paramValues.name[i]}
2.4 Cookie对象
-
用法示例
Cookie对象的信息:${cookie.userName} Cookie对象的名称:${cookie.userName.name} Cookie对象的值:${cookie.userName.value}
2.5 initParam对象
-
initParam对象用于获取Web应用初始化参数的值
-
maven导jar包
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
-
用法:
<!--在web.xml中初始化参数author--> <context-param> <param-name>author</param-name> <param-value>hao</param-value> </context-param>
${initParam.author}
3. JSTL(标准标签库)
-
核心标签库:用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签
指令格式:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
格式标签库:国际化/格式化标签库包含实现Web应用程序的国际化标签和格式化标签。例如:设置JSP页面的本地信息、时区等
指令格式:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
SQL标签库:访问和操作数据库的标签,这套标签不经常使用
指令格式:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
XML标签库:对XML文档中的数据进行操作的标签,例如:解析xml文件,输出xml文档中的内容等
指令格式:
<%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %>
-
函数标签库:提供了一套自定义EL函数,包含JSP网页制作经常需要用到的字符串操作
指令格式:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
4. JSTL中的Core标签库
4.1 表达式标签
4.1.1 <c:out>
标签
- 将一段文本内容或表达式的结果输出到客户端,如果输出的文本内容包含需要进行转义的字符,
<c:out>
标签会默认它们进行HTML编码转换后再输出
<!--没有标签体的情况-->
<c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>
<!--有标签体的情况-->
<c:out value="value" [escapeXml="{true|false}"]>
defaultValue
</c:out>
<!--
value:指定输出的文本内容
default:当value为null时所输出的默认值,该属性是可选的(中括号中的属性都是可选的),没有指定默认值,则默认输出空字符串
escapeXml:是否将>、<等特殊字符进行HTML编码转换后再输出,默认值为true
-->
4.1.2 <c:remove>
移除标签
- 移除指定的JSP范围内的变量
<c:remove var="name" [scope="范围"]/>
<!--
var:指定要移除的变量名
scope:指定变量的有效范围,可选择:page\request\session\application,默认值为page;
如果没有指定变量的有效范围,将在4个域中查找要移除的变量并删除
-->
4.2 流程控制标签
4.2.1 <c:if>
标签
<!--没有标签体的情况-->
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>
<!--有标签体的情况-->
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
body content
</c:if>
<!--
test:设置逻辑表达式
var:指定逻辑表达式中变量的名字
scope:指定var变量的作用范围,默认值为page
-->
4.2.2 <c:choose>
、<c:when>
、<c:otherwise>
标签
<!--
<c:choose>没有属性
在它的标签体中只能嵌套一个或多个<c:when>、0个或1个<c:otherwise>
并且同一个<c:choose>中,<c:when>必须在<c:otherwise>前面
-->
<c:choose>
<!--只有一个test属性,为布尔类型,支持动态值,可以是一个条件表达式-->
<c:when test="testCondition">
Body content
</c:when>
<!--没有属性,必须作为最后分支出现,所有<c:when>的test不成立时,才执行-->
<c:otherwise>
conditional block
</c:otherwise>
</c:choose>
4.3 循环标签
<!--迭代包含多个对象的集合-->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
<!--迭代指定范围内的集合-->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
<!--
var:将当前迭代到的元素保存到page域中的名称
items:指定将要迭代的集合对象
varStatus:指定将当前迭代状态信息的对象保存到page域中的名称
begin:指定从集合中第几个元素开始迭代
end:指定迭代到集合中哪个位置结束
step:指定迭代的步长,即迭代因子的增量
-->
<!--
varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量
这个变量包含了从集合中取出元素的状态信息
使用<c:forEach>标签的varStatus属性可以获取一下信息:
count:表示元素在集合中的序号,从1开始计数
index:表示当前元素在集合中的索引,从0开始计数
first:表示当前元素是否为集合中的第一个元素
last:表示当前元素是否为集合中的最后一个元素
-->
4.4 URL相关标签
<!--使用value属性指定参数的值-->
<c:param name="name" value="value"></c:param>
<!--在标签体中指定参数的值-->
<c:param name="name">
parameter value
</c:param>
<!--
name:参数的名称
value:参数的值,当使用<c:param>标签为一个URL地址附加参数时,它会自动对参数值进行URL编码
例如:"中国" => "%e4%b8%ad%e5%9b%bd"后再附加到URL地址后面
-->
<!--没有标签实体的情况-->
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
</c:url>
<!--有标签实体的情况-->
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
<c:param>标签
</c:url>
<!--
value:指定构造的URL
context:指定导入同一个服务器下其他Web应用的名称
var:指定将构造的URL地址保存到域对象的属性名称
scope:将构造好的URL保存到域对象中
-->