Servlet的三大域对象是什么你知道吗乐字节

9次阅读

共计 3823 个字符,预计需要花费 10 分钟才能阅读完成。

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)

正文完
 0