尚硅谷-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)

posted @ 2022-10-11 16:02  LinxhzzZ  阅读(38)  评论(0)    收藏  举报