什么是EL表达式
一种写法非常简洁的表达式。语法简单易懂,便于使用。可以让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请 求数据的写法。也会搭配 Jstl 来进行使用。
为什么要使用EL表达式
首先要知道传统的脚本语言有以下缺陷,那么为了让我们的jsp编写更加方便,更加简化,就要学习EL表达式了。
1、书写繁琐,可阅读性极差。
2、获取实体类数据需要导包。
3、类型强制转换。
El表达式的语法:
EL表达式的语法:
${表达式} ---->el表达式自带响应功能。
在学习EL表达式的使用之前,先复习一下作用域。
首先在jsp中内置对象有9种,其中有4个作用域,
分别为pageContext --->PageContext,
request --->HttpServletRequest
session --->HttpSession
application --->ServletContext
El表达式的使用:
获取用户请求数据(请求实体):
${param.键名} --->获取请求实体中一个键一个值的数据。
${paraValues.键名} --->获取请求实体中同键不同值的数据,返回的时字符串数组,可以通过下标直接取值。
获取请求头数据:
${header} --->返回所有请求头数据,键值对形式。
${header["键名"]} --->返回指定的建的请求头数据。
${headerValues["键名"]} --->获取请求实体中同键不同值的数据,返回的时字符串数组,可以通过下标直接取值。
获取Cookie数据:
${cookie} --->获取所有cookie对象的键值对信息。
${cookie.Cookie对象的键名} --->获取了存储了指定的Cookie数据的Cookie对象
${cookie.Cookie对象的键名.name} --->获取了存储了指定的Cookie数据的Cookie对象的键
${cookie.Cookie对象的键名.value} --->获取了存储了指定的Cookie数据的Cookie对象的值
获取作用域数据
${pageScope.键名} --->指明获取pageContext作用域中的数据
${requestScope.键名} --->指明获取request作用域中的数据
${sessionScope.键名} --->指明获取session作用域中的数据
${applicationScope.键名} --->指明获取application作用域中的数据
在使用的时候,需要注意的是,作用域的查找顺序。
作用域查找顺序:
根据作用域大小以此进行查找(从小到大),pageContext--->request--->session--->application。
取值时会先从pageContext中查找,如果找不到,那么就去下一个作用域找,如果四个作用域中都没有对应的值,那么返回为空,页面什么都不显示。
需要注意的是,session作用域的问题,当我们没有通过指定查找时,在seesion中有的话,再次查找,那么返回的值还是session。因session的有效期一直都没有消失。
指定作用域获取数据:
${pageScope.键名} --->指明获取pageContext作用域中的数据
${requestScope.键名} --->指明获取request作用域中的数据
${sessionScope.键名} --->指明获取session作用域中的数据
${applicationScope.键名} --->指明获取application作用域中的数据
JSTL表达式
JSTL是在EL表达式上的一种扩展,在jsp页面使用其可以非常方便的进行数据处理。(JSTL标签是依赖于EL表达式的)。
首先,我们要使用JSTL的话,需要以下流程
1、在web项目下导入jstl的jar包,如果在myEclipese中话,那么在把项目发布到Tomcat 时,你会发现,默认是有jar包的,如果使用其他工具开发的话别忘记导入jar包。
2、引入标签。<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>。uri地址可以根据需求进行改动,学习过程中还是选择这个核心库标签进行学习。
完成以上操作后,就可以开始使用JSTL标签啦。
JSTL的基本标签学习:
out标签:<c:out value="${表达式}" default="默认值"></c:out>
set标签:<c:set value="数据" var="键名" scope="作用域名"></c:set>,默认的是pageContext作用域。
remove标签:<c:remove var="键名" scope="作用域名"/>
remove标签在删除的时候要使用scope指定作用域,如果不指定那么默认是pageContext作用域,作用域是从小到大开始查找的,所以pageContext会一直找到application作用域中,遇到同名不同值的都是删除。
JSTL的逻辑标签学习:
逻辑标签分为以下:
单分支判断标签,也就是相当于java中的if语句,只是没有else,可以通过两个if来完成对应的操作。
单分支判断标签:<c:if test="${逻辑表达式}">数据</c:if>
可以根据el表达式进行一定程度的单分支逻辑判断。
多分支判断标签,个人理解的是java中的if - else if()-else if()....else{}。
多分支判断标签:
<c:choose>
<c:when test="${表达式}"></c:when>
<c:when test="${表达式}"></c:when>
..
<c:otherwise></c:otherwise>
</c:choose>
循环标签:需要注意的是循环遍历数组或容器。这里理解的使相当于java中的增强for循环,取值时结合EL表达式,也可以在循环中通过下述的一些属性做出一些判断。
for(类型 变量名 :数组或容器){
${取值}
}
<c:foreach>
循环体
</c:foreach>
属性:
begin:声明循环的开始位置
end:声明循环的结束位置
step:声明循环的步长
varStatus:声明变量记录循环状态 ,例如变量名:i
注意:记录的数据存储到了作用域中可以直接使用El表达式进行获取
${i.index} 获取当次循环的下标
${i.count} 获取当次循环的次数
${i.first} 判断是否是第一次循环
${i.last} 判断是否是最后一次循环
循环数组或容器:
<c:foreach items="${数组或容器}" var="变量名">
循环体
</c:foreach>