EL 表达式
全称:Expression Language,一种写法非常简洁的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于 ECMAScript 和 XPath
传统方式在jsp中获取作用域的数据的缺陷
- 书写比较繁琐
- 需要导包
- 需要强转
<
EL 表达式的作用
让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请求数据的写法。也会搭配 Jstl 来进行使用。
<
语法结构:${表达式} 自带响应功能
El表达式的使用
El表达式获取请求数据
获取用户请求数据(请求实体)
- ${param.键名} 获取请求实体中一个键一个值的数据
- ${paramValues.键名} 获取请求实体中同键不同值的数据,返回的是String数组,可以使用角标直接获取 例如:爱好
<
获取请求头数据
- ${header} 返回所有的请求头数据,键值对形式
- ${header["键名"]} 返回指定的键的请求头数据
- ${headerValues["键名"]} 返回指定键名的多个值
<
获取Cookie数据
- ${cookie} 获取所有的Cookie对象 键值对
- ${cookie.Cookie对象的键名} 获取存储了指定Cookie数据的Cookie对象
- ${cookie.Cookie对象的键名.name} 获取存储了指定Cookie数据的Cookie对象的存储的键
- ${cookie.Cookie对象的键名.value}获取存储了指定Cookie数据的Cookie对象的存储的值
<
EL表达式获取作用域数据
作用域对象:pageContext request session application
作用域数据:我们使用setAttribute方法存储的数据
获取:
- 普通字符串数据 ${键名}
- 对象数据 ${键名.属性名}
- 集合数据:list集合 ${键名[角标]}
- 集合数据:Map集合 ${map集合作用域存储的键名.map集合存储的数据的键名}
作用域数据查找顺序:如果找到了则不再查找,如果找不到,则继续查找下一个作用域,如果四个作用域中都没有则什么都不显示
pageContext->request->session->application
指定作用域获取数据:
- ${pageScope.键名} 指明获取pageContext作用域中的数据
- ${requestScope.键名} 指明获取request作用域中的数据
- ${sessionScope.键名} 指明获取session作用域中的数据
- ${applicationScope.键名} 指明获取application作用域中的数据
<
EL表达式逻辑运算
算术运算 +,-,*,/ 在EL表达式中可以直接进行算术运算
${算术表达式} 例如 :${1+2}
注意:+表示算术运算,不能进行字符串连接
逻辑运算 && || !
${逻辑表达式}
注意:没有单& 和单|
比较运算 == != >,>=,<,<=
${比较表达式}
三目运算
${条件?值:值}
<
EL表达式的empty判断
${empty 键名} 作用:判断该键是否有存储有效数据
empty关键字用于判断是否为空(当值为null或者是没有内容时),返回true,否则返回false
not empty(!empty)用于判断是否非空(当值不为null或者是有内容时),返回true,否则返回false
<
JSTL的概念
JSTL:JSP标准标签库,是apache针对EL表达式的扩展。
JSTL的作用:用来提升在 JSP 页面的逻辑代码的编码效率,使用标签来替换逻辑代码的直接书写,高效,美观,整洁,易读
JSTL库的分类:
- 通用标签:c作为前缀(掌握):if标签,forEach标签
- 格式化标签(格式化处理):fmt作为前缀(掌握):formatDate标签(格式化展示日期)
- 函数标签(调用函数):fn作为前缀(了解)
- XML标签(操作xml文档):了解
- SQL标签(执行SQL语句):了解
标签的使用步骤:
- 下载jstl的jar文件,并添加到项目中(如果利用myeclipse创建的web项目自动添加)
- 使用taglib指令引入标签库: <%@taglib uri="标签库的uri" prefix="标签的前缀"%>
- 使用标签
- 引入标签库<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
基本标签
out标签:
<c:out value="${表达式}" default="默认值"></c:out>
作用:结合EL表达式将数据响应给浏览器,如果EL表达式没有取到数据则可以使用default属性声明默认值。
set标签:
<c:set value="数据" var="键名" scope="作用域名"></c:set>
作用:将数据存储到指定的作用域中,默认是pageContext作用域
注意:scope的值为:page request session application
remove标签:
<c:remove var="要删除数据的键名" scope="作用域名"/>
作用:删除作用域中的数据,默认是删除四个作用域中的符合要求的数据。但是可以通过scope属性指明要删除的作用域数据。
注意:
- 使用pageContext.removeAttriute("键名"),此方法会将四个作用域中的符合要求的数据全部删除
- 使用pageContext.removeAttriute(String name,int scope)指明要删除的作用域中的数据 scope的值为 1pageContext,2request ,3 session,4 application
- 使用request.removeAttibute("键名") 删除当前作用域符合要求的数据
- 使用session.removeAttibute("键名") 删除当前作用域符合要求的数据
- 使用application.removeAttibute("键名") 删除当前作用域符合要求的数据
<
逻辑标签:
单分支判断标签 (if标签):等同于java中的if结构(判断)
<c:if test="${表达式}">数据</c:if>
作用:可以根据el表达式进行一定程度的单分支逻辑判断。
注意:test属性中书写的是EL表达式,或者说是EL表达式的逻辑表达式。
该标签只能进行EL表达式相关的逻辑判断。不能进行EL表达式不能获取的数据的逻辑处理
<!-- 单分支判断标签 -->
多分支判断标签 choose/when标签(判断):等同于java中的多重if...else if结构
<
注意:符合条件后只会执行一个分支,其他分支不会执行。
<!--多分支逻辑判断 -->
循环标签 forEach标签(循环):等同于java中的高级for-each循环
<c:foreach>
循环体
</c:foreach>
属性:
- begin:声明循环的开始位置
- end:声明循环的结束位置
- step:声明循环的步长
- varStatus:声明变量记录循环状态 ,例如变量名:i
注意:记录的数据存储到了作用域中可以直接使用El表达式进行获取
示例
- ${i.index} 获取当次循环的下标
- ${i.count} 获取当次循环的次数
- ${i.first} 判断是否是第一次循环
- ${i.last}判断是否是最后一次循环
- items:声明要遍历的数据,可以是集合和数组等
注意:要使用EL表达式来获取
- var:声明变量记录每次遍历的结果。可以做循环体中使用使用EL表达式获取遍历出来的数据
<!--循环标签 -->
循环标签遍历集合
遍历List集合
<!-- 遍历List集合 -->
遍历map集合
<!--遍历map集合 -->
fmt标签(格式化)
<%
Date now=new Date();
request.setAttribute("now", now);
%>
${now}
El 表达式和 Jstl 修改项目
创建用户信息界面(userList.jsp) 复制模板 更改<tr>中的信息 点击查询用户信息请求发送DataServlet 在DataServlet中创建selUserInfo方法 获取所有的用户信息 将数据存储进request作用域对象中,请求转发给userList.jsp 在userList.jsp中获取DataServlet中流转过来的用户数据,显示给浏览器。
userList.jsp
<%@ page language="java" import="java.util.*,com.sxt.pojo.*" pageEncoding="utf-8"%>
DataServlet中的selUserInfo方法
//查询用户信息
login.jsp中登录和注册代码的修改
<!--声明jstl代码块 -->