Servlet的三大域對象是什么你知道嗎?--樂字節(jié)

Servlet的三大域對象

  1. request域對象

    在一次請求中有效。請求轉發(fā)有效,重定向失效。

  2. session域對象

    在一次會話中有效。請求轉發(fā)和重定向都有效,session銷毀后失效。

  3. servletContext域對象

    在整個應用程序中有效。服務器關閉后失效。

文件上傳和下載

? 在上網(wǎng)的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等;當然除了上傳,遇見下載的情況也很多,接下來看看我們 servlet 中怎么實現(xiàn)文件的上傳和下載。

文件上傳

? 文件上傳涉及到前臺頁面的編寫和后臺服務器端代碼的編寫,前臺發(fā)送文件,后臺接收并保存文件,這才是一個完整的文件上傳。

前臺頁面

? 在做文件上傳的時候,會有一個上傳文件的界面,首先我們需要一個表單,并且表單的請求方式為 POST;其次我們的 form 表單的 enctype 必須設為"multipart/form-data",即 enctype="multipart/form-data",意思是設置表單的類型為文件上傳表單。默認情況下這個表單類型是 "application/x-www-form-urlencoded", 不能用于文件上傳。只有使用了multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。

<!--
    文件上傳表單
        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>

后臺實現(xiàn)

? 使用注解 @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 屬性規(guī)定瀏覽器進行下載。但有些瀏覽器并不支持。

默認下載

<!-- 當超鏈接遇到瀏覽器不識別的資源時,會自動下載 -->
<a href="test.zip">超鏈接下載</a>

指定 download 屬性下載

<!-- 當超鏈接遇到瀏覽器識別的資源時,默認不會下載。通過download屬性可進行下載 -->
<a href="test.txt" download>超鏈接下載</a>

? download 屬性可以不寫任何信息,會自動使用默認文件名。如果設置了download屬性的值,則使用設置的值做為文件名。當用戶打開瀏覽器點擊鏈接的時候就會直接下載文件。

后臺實現(xiàn)下載

實現(xiàn)步驟

  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數(shù)組
            byte[] car = new byte[1024];
            // 定義長度
            int len = 0;
            // 循環(huán) 輸出
            while ((len = is.read(car)) != -1) {
                os.write(car, 0, len);
            }
            // 關閉流 釋放資源
            os.close();
            is.close();
        } else {
            System.out.println("文件不存在,下載失?。?);
        }
    }
}

加VX了解<a >點我掃碼領取</a>
學習更多知識,請加入企鵝群:1080355292,入群暗號(33)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容