Servlet的三大域对象

  1. request域对象

    在一次申请中无效。申请转发无效,重定向生效。

  2. session域对象

    在一次会话中无效。申请转发和重定向都无效,session销毁后生效。

  3. servletContext域对象

    在整个应用程序中无效。服务器敞开后生效。

文件上传和下载

在上网的时候咱们经常遇到文件上传的状况,例如上传头像、上传材料等;当然除了上传,遇见下载的状况也很多,接下来看看咱们 servlet 中怎么实现文件的上传和下载。

文件上传

文件上传波及到前台页面的编写和后盾服务器端代码的编写,前台发送文件,后盾接管并保留文件,这才是一个残缺的文件上传。

前台页面

在做文件上传的时候,会有一个上传文件的界面,首先咱们须要一个表单,并且表单的申请形式为 POST;其次咱们的 form 表单的 enctype 必须设为"multipart/form-data",即 enctype="multipart/form-data",意思是设置表单的类型为文件上传表单。默认状况下这个表单类型是 "application/x-www-form-urlencoded", 不能用于文件上传。只有应用了multipart/form-data 能力残缺地传递文件数据。

<!--    文件上传表单        1. 表单提交类型 method="post"        2. 表单类型 enctype="multipart/form-data"        3. 表单元素类型  文件域设置name属性值--><form method="post" action="uploadServlet" enctype="multipart/form-data">    姓名:<input type="text" name="uname" > <br>    文件:<input type="file" name="myfile" > <br>    <button type="submit">提交</button></form>

后盾实现

应用注解 @MultipartConfig 将一个 Servlet 标识为反对文件上传。 Servlet 将 multipart/form-data 的 POST 申请封装成 Part,通过 Part 对上传的文件进行操作。

package com.xxxx.servlet;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import java.io.IOException;@WebServlet("/uploadServlet")@MultipartConfig // 如果是文件上传表单,肯定要加这个注解public class UploadServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // 设置申请的编码格局        request.setCharacterEncoding("UTF-8");        // 获取一般表单项 (文本框)        String uname = request.getParameter("uname"); // "uname"代表的是文本框的name属性值        // 通过 getPart(name) 办法获取Part对象 (name代表的是页面中file文件域的name属性值)        Part part = request.getPart("myfile");        // 通过Part对象,获取上传的文件名        String fileName = part.getSubmittedFileName();        // 获取上传文件须要寄存的门路 (失去我的项目寄存的实在门路)        String realPath = request.getServletContext().getRealPath("/");        // 将文件上传到指定地位        part.write(realPath + fileName);    }}

文件下载

文件下载,行将服务器上的资源下载(拷贝)到本地,咱们能够通过两种形式下载。第一种是通过超链接自身的个性来下载;第二种是通过代码下载。

超链接下载

当咱们在 HTML 或 JSP 页面中应用a标签时,原意是心愿可能进行跳转,但当超链接遇到浏览器不辨认的资源时会主动下载;当遇见浏览器可能间接显示的资源,浏览器就会默认显示进去,比方 txt、png、jpg 等。当然咱们也能够通过 download 属性规定浏览器进行下载。但有些浏览器并不反对。

默认下载

<!-- 当超链接遇到浏览器不辨认的资源时,会主动下载 --><a href="test.zip">超链接下载</a>

指定 download 属性下载

<!-- 当超链接遇到浏览器辨认的资源时,默认不会下载。通过download属性可进行下载 --><a href="test.txt" download>超链接下载</a>

download 属性能够不写任何信息,会主动应用默认文件名。如果设置了download属性的值,则应用设置的值做为文件名。当用户关上浏览器点击链接的时候就会间接下载文件。

后盾实现下载

实现步骤

  1. 须要通过 response.setContentType 办法设置 Content-type 头字段的值, 为浏览器无奈应用某种形式或激活某个程序来解决的 MIME 类型,例 如 "application/octet-stream" 或 "application/x-msdownload" 等。
  2. 须要通过 response.setHeader 办法设置 Content-Disposition 头的值 为 "attachment;filename=文件名"
  3. 读取下载文件,调用 response.getOutputStream 办法向客户端写入附件内容。
package com.xxxx.servlet;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class DownloadServlet extends HttpServlet {    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // 设置申请的编码        request.setCharacterEncoding("UTF-8");        // 获取文件下载门路        String path = getServletContext().getRealPath("/");        // 获取要下载的文件名        String name = request.getParameter("fileName");        // 通过门路失去file对象        File file = new File(path + name);        // 判断file对象是否存在,且是否是一个标准文件        if (file.exists() && file.isFile()) {            // 设置响应类型 (浏览器无奈应用某种形式或激活某个程序来解决的类型)            response.setContentType("application/x-msdownload");            // 设置头信息            response.setHeader("Content-Disposition", "attachment;filename=" + name);            // 失去输出流            InputStream is = new FileInputStream(file);            // 失去输入流            ServletOutputStream os = response.getOutputStream();            // 定义byte数组            byte[] car = new byte[1024];            // 定义长度            int len = 0;            // 循环 输入            while ((len = is.read(car)) != -1) {                os.write(car, 0, len);            }            // 敞开流 开释资源            os.close();            is.close();        } else {            System.out.println("文件不存在,下载失败!");        }    }}

加VX理解点我扫码支付
学习更多常识,请退出企鹅群:1080355292,入群暗号(33)