8. EL & JSTL & 文件上传下载

1. EL表达式

1.1 介绍

  • EL全称Expression Language,表达式语言
  • EL表达式主要用于代替jsp页面中的表达式脚本在jsp页面中进行数据的输出
  • EL表达式的格式:${表达式}
  • jsp脚本输出null值时,显示的是null字符串;EL表达式输出null值时,输出的是空串
  • EL表达式主要是输出域对象中的数据,当4个域中都有相同key的数据时,EL表达式会按4个域从小到大的顺序进行搜索,找到就输出

1.2 EL表达式输出Bean对象

<%
    Person person = new Person();
    ----对person对象进行初始化----
    pageContext.setAttribute("p",person);
%>

输出Person:${p}<br/>
输出name字符串:${p.name}<br/>
输出phones数组:${p.phones}<br/>
输出cities集合:${p.cities[1]}<br/>
输出map集合:${p.map.key1}<br/>

1.3 EL表达式中的运算
EL表达式支持多种运算符,语法:${运算表达式}

  • 关系运算:① ==或eq:等于;② !=或ne:不等于;③ <或lt:小于;④ >或gt:大于;⑤ <=或le:小于等于;⑥ >=或ge:大于等于
  • 逻辑运算:① &&或and:与运算;② ||或or:或运算;③ !或not:取反运算
  • 算术运算:① +:加法;② -:减法;③ *:乘法;④ /或div:除法;⑤ %或mod:取模
  • empty运算:用于判断一个数据是否为空。语法:${empty 对象}
  • 点运算和中括号运算:点运算可以输出Bean对象中某个属性的值,中括号运算可以输出有序集合中某个元素的值和map集合中某个key的value

1.4 EL表达式中11个隐含对象
EL表达式中11个隐含对象,是EL表达式自己定义的,可以直接使用:

变量类型作用
pageContextPageContextImpl可以获取jsp中的九大内置对象
pageScopeMap<String,Object>可以获取pageContext域中的数据
requestScopeMap<String,Object>可以获取Request域中的数据
sessionScopeMap<String,Object>可以获取Session域中的数据
applicationScopeMap<String,Object>可以获取ServletContext域中的数据
paramMap<String,String>可以获取请求参数的值
paramValuesMap<String,String[]>可以获取多个请求参数的值
headerMap<String,String>可以获取请求头的信息
headerValuesMap<String,String[]>可以获取多个请求头的信息
cookieMap<String,Cookie>可以获取当前请求的Cookie信息
initParamMap<String,String>可以获取在web.xml中配置的<context-param>上下文参数u
获取协议:${pageContext.request.scheme}<br>
获取服务器ip:${pageContext.request.serverName}<br>
获取服务器端口:${pageContext.request.serverPort}<br>
获取工程路径:${pageContext.request.contextPath}<br>
获取请求方法:${pageContext.request.method}<br>
获取客户端ip地址:${pageContext.request.remoteHost}<br>
获取会话id编号:${pageContext.session.id}<br>

2. JSTL

2.1 介绍

  • JSTL全称JSP Standard Tag Library——JSP标准标签库
  • EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本
  • JSTL由五个不同功能的标签库组成
功能范围URI前缀
核心标签库(重点)http://java.sun.com/jsp/jstl/corec
格式化http://java.sun.com/jsp/jstl/fmtfmt
函数http://java.sun.com/jsp/jstl/functionsfn
数据库(不使用)http://java.sun.com/jsp/jstl/sqlsql
XML(不使用)http://java.sun.com/jsp/jstl/xmlx

2.2 标签库的使用步骤

  • 导入jstl所需要的jar包,或导入maven依赖(需导入jstl和标签库两个依赖)
  • 使用taglib指令引入标签库
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2.3 使用core核心库
2.3.1 set标签

  • 作用:往域中保存数据,等同于:域对象.setAttribute(key,value)
  • scope属性:设置保存到哪个域,page表示PageContext域(默认值)
  • var属性:设置key
<c:set scope="request" var="abc" value="123"/>
${requestScope.abc}

2.3.2 if标签

  • 作用:用于判断
  • test属性:设置判断的条件,使用EL表达式输出
<c:if test="${10==10}">
    <h1>10等于10</h1>
</c:if>

2.3.3 choose、when、otherwise标签

  • 作用:多路判断,等同于switch - case - default
  • 注意:标签中要使用jsp注释,不能使用html注释
<%
    request.setAttribute("abc", 123);
%>
<c:choose>
    <c:when test="${requestScope.abc>150}">
        <h2>no.1</h2>
    </c:when>
    <c:when test="${requestScope.abc>120}">
        <h2>no.2</h2>
    </c:when>
    <c:otherwise>
        <h2>no.3</h2>
    </c:otherwise>
</c:choose>

2.3.4 forEach标签

  • 作用:遍历输出使用
  • begin和end属性:表示遍历的开始和结束索引,可以和items属性结合使用
  • step属性:遍历的步长
//普通遍历
<c:forEach begin="1" end="10" var="i">
    ${i}
</c:forEach>

//遍历对象类型的数组
<%
    request.setAttribute("arr",new String[]{"123","456","789"});
%>
<c:forEach items="${requestScope.arr}" var="item">
    ${item}
</c:forEach>

//遍历Map集合
<%
    HashMap<String, Object> map = new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="entry">
    ${entry}
    ${entry.key}
    ${entry.value}
</c:forEach>

3. 文件的上传和下载

3.1 文件的上传要求

  • 要有一个form标签,method=post请求
  • form标签的encType属性值必须为multipart/form-data值
  • 在form标签中使用input type=file添加上传的文件
  • 编写服务器代码接收、处理上传的数据
<form action="/EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
    用户名:<input type="text" name="username"/><br>
    头像:<input type="file" name="photo"> <br>
    <input type="submit" value="上传">
</form>

3.2 文件上传的Http协议内容介绍

  • Content-Type:表示提交的数据类型,其值为enctype的值。multipart/form-data表示提交的数据以多段的形式进行拼接(每一个表单项一个数据段),然后以二进制流的形式发送给服务器
  • boundary:表示每段数据的分隔符,由浏览器随机生成

3.3 在服务器中获取上传的文件信息
3.3.1 获取上传的文件信息
在Servlet中可以通过流的方式获取上传的文件信息:

ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024000];
int read = inputStream.read(buffer);
System.out.println(new String(buffer, 0, read));

3.3.2 解析上传的数据
有现成的jar包可用于解析上传的数据,导入commons-fileupload和commons-io两个jar包,其中ServletFileUpload类用于解析上传的数据,该类中提供了多种方法:

  • boolean isMultipartContent(HttpServletRequest request):判断当前上传的数据是否是多段的格式
  • List<FileItem> parseRequest(HttpServletRequest request):解析上传的数据为FileItem类型的列表

FileItem类中的方法用于辅助解析上传的数据:

  • boolean isFormField():判断当前表单项是否是普通的表单项,false表示为上传的文件
  • String getFieldName():获取当前表单项的name
  • String getString():获取当前表单项的值
  • String getName():获取上传的文件名
  • void write(File var1):将上传的文件写到var1所指向的硬盘位置
if (ServletFileUpload.isMultipartContent(req)) {
    FileItemFactory fileItemFactory = new DiskFileItemFactory();
    ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
    try {
        List<FileItem> fileItems = servletFileUpload.parseRequest(req);
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()) {
                System.out.println(fileItem.getFieldName());
                System.out.println(fileItem.getString("UTF-8"));
            } else {
                System.out.println(fileItem.getFieldName());
                System.out.println(fileItem.getName());
                fileItem.write(new File("D:/" + fileItem.getName()));
            }
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.4 文件下载的步骤

  • 客户端发请求告诉服务器要下载的文件
  • 服务器获取客户端要下载的文件名
  • 服务器通过响应头告诉客户端返回的数据类型,以及收到的数据是用于下载使用
  • 服务器读取要下载的文件内容
  • 服务器把下载的文件内容回传给客户端
String downloadFile = "smile.jpg";
ServletContext servletContext = getServletContext();
String mimeType = servletContext.getMimeType("/file/" + downloadFile);
System.out.println(mimeType);
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFile);
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFile);
OutputStream outputStream = response.getOutputStream();
IOUtils.copy(resourceAsStream, outputStream);

注意:要下载的文件若不在resource目录下,则要手动设置文件所在目录为Tomcat编译目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值