尚硅谷-JavaWeb Day6 EL表达式、JSTL标签库、文件上传下载
1. EL表达式(Expression Language 表达式语言)
作用:主要代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据输出
原因:EL表达式输出数据比 jsp 的表达式脚本简洁
① 例:<% request.setAttribute("key","value") %>
表达式脚本输出 key 值:<%=request.getAttribute("key")%></br>
EL表达式输出:${key}
另:输出变量不存在或为null时,EL表达式输出空字符串(符合实际),表达式脚本输出null;
② EL表达式搜索域数据的顺序
EL主要是输出域对象中的数据(域对象中包含相同key数据时,EL表达式按照从小到大顺序搜索,找到就输出)
四个域对象
-
-
- pageContext(PageContextImpl 类):当前 jsp 页面范围内有效
- request(request 类):一次请求内有效
- session(session 类):一个会话范围内有效(打开浏览器访问服务器,知道关闭浏览器)
- application(ServletContext 类):整个web工程范围内有效(只要web工程不停,数据都在)
-
③ EL表达式输出复杂的 Bean 对象
EL表达式输出 Bean 的普通属性,数组属性,List集合属性,map集合属性(找的是属性的get方法,而不是属性本身)
④ EL表达式—运算
关系运算:==(或eq)、!=(或ne)、<(或it)、>(或gt)、<=(或le)、>=(或ge)
逻辑运算:&& 或 ||、|| 或 or、!或 not
算数运算:+、-、*、/ 或 div、% 或 mod
empty运算:判断数据是否为空(值为null、值为空串、Object数组且长度为0、list元素个数为0、map元素个数为0)
⑤ EL表达式的11个隐含对象(自己定义,可以直接使用)
变量 类型 作用
-
- pageContext pageContextImpl 可以获取 jsp 中的九大内置对象
- pageScope Map<String, Object> 可以获取 pageContext 域中的数据
- requestScopt Map<String, Object> 可以获取 request 域中的数据
- seesionScope Map<String, Object> 可以获取 seesion 域中的数据
- applicationScope Map<String, Object> 可以获取 ServletContext 域中的数据
- param Map<String, String> 可以获取请求参数的值
- paramValues Map<String, String[]> 可以获取请求参数的值(多值用)
- header Map<String, cookie> 可以获取请求头的值
- headerValues Map<String, String[]> 可以获取请求头的值(多值用)
- cookie Map<String, Cookie> 可以获取当前请求的Cookie信息
- initParam Map<String, String> 可以获取在 web.xml 中配置的<context-param>上下文参数
⑥ 获取四个特定域中的属性(不同域内同名变量,可以使用 域.变量名,如 requestScopt.key1)
-
- pageScope:pageContext 域
- requestScopt:request 域
- seesionScope:seesion 域
- applicationScope:ServletContext 域
⑦ pageContext 对象的使用
协议:<%=request.getScheme()%>;${ pageContext.request.scheme } 自动调scheme的get方法
服务器ip:<%=request.getServerName()%> ;${ pageContext.request.serverName } 同上
服务器端口:<%=request.getServerPort()%> ;${ pageContext.request.serverPort } 同上
获取工程路径:<%=getContextPath()%> ;${ pageContext.request.contextPath } 同上
获取请求方法:<%=request.getMethod()%> ;${ pageContext.request.method } 同上
获取客户端 ip 地址:<%=request.getRemoteHost()%> ;${ pageContext.request.remoteHost } 同上
获取会话的 id 编号:<%=request.getId()%> ;${ pageContext.request.id } 同上
2. JSTL 标签库(次重点)(替换 jsp 中的代码脚本简化)
① JSTL的五个不同功能的标签库
-
- 核心标签库:前缀 c;url:http://java.sun.com/jsp/jstl/core
- 格式化:前缀 fmt;url:http://java.sun.com/jsp/jstl/fmt
- 函数:前缀 fn;url:http://java.sun.com/jsp/jstl/fn
- 数据库(破坏javaEE三层结构)、xml(现在用json) 不使用
② 引入标签库:<%@ taglib prefix="xxxx" url="xxxx"%>
③ 使用步骤
导入 JSTL 标签库的 jar 包;taglibs-standard-impl.jar 和 taglibs-standard-spec.jar
使用 taglib 指令引入标签库;
④ core 核心库的使用(先使用:域对象.setAttribute(key,value) 往某个域保存数据)
<c:set />:可以往域中保存数据。
scope 属性设置保存到哪个域;var 属性设置 key;Value 属性设置值;
<c:if />:做 if 判断;
test 属性表示判断的条件(使用 EL 表达式输出)
<c:choose /><c:when /><c:otherwise />:多路判断;
choose 标签:开始选择判断
when 标签:表示每一种判断情况,test 属性表示当前这种判断情况的值;
otherwise 标签:表示剩下的情况
注:标签里不能使用 html 注释,需要使用 jsp 注释
when 标签的父标签一定是 choose 标签(特别是otherwise里的多路判断)
<c:foreach />:遍历;
遍历数值:begin 属性设置开始索引,end 属性设置结束索引,var 属性设置循环变量;
遍历Object数组:items 属性设置遍历的数据源(遍历的集合),var 属性设置循环变量;
遍历Map集合:同Object数组
遍历List集合:同Object数组
所有属性组合使用:
begin、end、var、items、step(遍历的步长)、varStatus(当前遍历到的数据状态)
3. 文件上传(重点)
① 步骤
-
- 要有一个 form 标签,method=post 请求
- form 标签的 encType 属性值必须为 multipart / form-data 值
- 在 form 标签中使用 input type=file 添加上传的文件
- 编写服务器代码接收,处理上传数据
② 注释
Context-Type:表示提交的数据类型
multipart / form-data:表单提交数据,以多段(每个表单项一个数据段)的形式拼接,二进制流的形式发送给服务器
boundary:表示每段数据的分隔符(-----xxxxxx 由浏览器每次随机生成,是每段数据的分界符,---xxx-- 结束标记)
4. 文件下载
① 下载流程
客户端:发请求给服务器需要下载的文件
服务器:
-
-
- 获取要下载的文件名
- 读取要下载的文件内容(通过 servletContext对象.getResourceAsStream() 可以读取)
- 把下载的文件内容回传给客户端
- 回传前,通过响应头告诉客户端返回的数据类型(通过 servletContext对象.getMimeType() 可以读取)
- 回传前,还需告诉客户端收到的数据是用于下载使用(还是使用响应头)
-
② 使用 Uer-Agent 可以判断当前浏览器应该使用何种编码;(火狐Base64,IE/谷歌URL)

浙公网安备 33010602011771号