什么是EL表达式

一种写法非常简洁的表达式。语法简单易懂,便于使用。可以让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请 求数据的写法。也会搭配 Jstl 来进行使用。

为什么要使用EL表达式

首先要知道传统的脚本语言有以下缺陷,那么为了让我们的jsp编写更加方便,更加简化,就要学习EL表达式了。



1、书写繁琐,可阅读性极差。
2、获取实体类数据需要导包。
3、类型强制转换。




El表达式的语法:



EL表达式的语法:
		${表达式}  ---->el表达式自带响应功能。



在学习EL表达式的使用之前,先复习一下作用域。




es表达式 不包含_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>