HTTP 中 ServletContext 對象

一、獲取 ServletContext 對象

ServletContext 對象代表整個 web 應用,可以和程序的容器進行通信,即和服務器通信,用來交互數據,獲取 ServletContext 對象有兩種方法:

1、通過 request 對象獲取

  • request.getServletContext();

2、通過 HttpServlet 獲取

  • this.getServletContext();
//獲取 ServletContext 對象的兩種方法
ServletContext SC1 = request.getServletContext();
ServletContext SC2 = this.getServletContext();

二、ServletContext 功能

1、獲取 MIME類型

  • MIME 類型:在互聯網通信過程中定義的一種文件數據類型
  • 格式:大類型/小類型      eg:text/html       image/jpeg
  • 獲取方法:String getMimeType(String file)
//獲取MIME類型
ServletContext SC1 = request.getServletContext();
String name = "a.jpg";
String mime = SC1.getMimeType(name);
System.out.println(mime);

2、域對象:共享數據

  • setAttribute(String name,Object value):獲取值
  • getAttribute(String name):通過名稱獲取值
  • removeAttribute(String name):通過名稱移除值

ServletContext 對象範圍:所有用戶請求的數據

3、獲取文件的真實路徑

在開發過程中,會有配置資源文件需要加載,而配置資源文件所放的位置會有不同,這時就需要獲取文件的真實路徑

  • 方法:String getRealPath(s),對於參數 s 的要求(以 a.txt 爲例):
    • 配置文件放在 web 目錄下:"/a.txt"
    • 配置文件放在 WEB-INF 目錄下:"/WEB-INF/a.txt"
    • 配置文件放在 src 目錄下:"/WEB-INF/classes/a.txt"

三、實現文件下載

步驟:

  1. 定義html頁面,編輯超鏈接 href 屬性,指向 Servlet,傳遞資源名稱 filename
  2. 定義 Servlet 
    1. 獲取文件名稱
    2. 使用字節輸入流加載文件進內存
    3. 指定 response 的響應頭
    4. 將數據寫到 response 輸出流

Java文件:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //獲取請求參數(文件名稱)
    String filename = request.getParameter("filename");

    //使用字節輸入流加載進內存
    //找到文件服務器路徑
    ServletContext SC = this.getServletContext();
    String realPath = SC.getRealPath("/pic/" + filename);

    //用字節流關聯
    FileInputStream FIS = new FileInputStream(realPath);
    //設置response相應頭
    String name = SC.getMimeType(filename);
    //設置響應頭類型
    response.setHeader("content-type",name);
    //設置響應頭的打開方式
    response.setHeader("content-disposition","attachment;filename=" + filename);

    //將輸入流的數據寫到輸出流中
    ServletOutputStream SOS = response.getOutputStream();
    byte[] buf = new byte[1024 * 4];
    int lenth;
    while ((lenth = FIS.read(buf)) != -1){
        SOS.write(buf,0,lenth);
    }
    FIS.close();
}

HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Download</title>
</head>
<body>
<a href="/servletContext?filename=1.jpeg" >圖片</a>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章