欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 简单案例说明ServletContext

程序员文章站 2022-04-15 23:23:13
介绍说起ServletContext,一些人会产生误解,以为一个servlet对应一个ServletContext。其实不是这样的,事实是一个web应用对应一个ServletContext,所以ServletContext的作用范围是整个应用,明确这点很重要,这是基础中的基础。ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。...

介绍

说起ServletContext,一些人会产生误解,以为一个servlet对应一个ServletContext。其实不是这样的,事实是一个web应用对应一个ServletContext,所以ServletContext的作用范围是整个应用,明确这点很重要,这是基础中的基础。

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

获取:

通过request对象获取

request.getServletContext();

通过HttpServlet获取

this.getServletContext();

public class ContextServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request获取
        ServletContext context1 = request.getServletContext();

        //HttpServlet获取
        ServletContext context2 = this.getServletContext();
        System.out.println(context1 == context2); //true
    }

3. 功能:

  1. 获取MIME类型:
    * MIME类型:在互联网通信过程中定义的一种文件数据类型
    * 格式: 大类型/小类型 text/html image/jpeg
    获取:String getMimeType(String file)
public class ContextServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //HttpServlet获取
        ServletContext context = this.getServletContext();
        //定义文件名称
        String fileName = "a.jpg";
        //获取MIME类型
        String mimeType = context.getMimeType(fileName);
        System.out.println(mimeType);//image/jpeg
    }
  1. 域对象:共享数据
    1. setAttribute(String name,Object value)
    2. getAttribute(String name)
    3. removeAttribute(String name)
  • ServletContext对象范围:所有用户所有请求的数据

3. 获取文件的真实(服务器)路径

  1. 方法:String getRealPath(String path)

  2. String b = context.getRealPath("/b.txt");//web目录下资源访问
    System.out.println(b);

String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println©;

String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);

public class ContextServletDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //HttpServlet获取
        ServletContext context = this.getServletContext();
        //获取文件的服务器路径
        String realPath = context.getRealPath("/b.txt");//web目录下资源
        String realPath1 = context.getRealPath("/WEB-INF/classes/a.txt");//src路径下资源
        System.out.println(realPath);
        System.out.println(realPath1);
    }

案例:

文件下载需求:
1. 页面显示超链接
2. 点击超链接后弹出下载提示框
3. 完成图片文件下载

分析

  1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
  2. 任何资源都必须弹出下载提示框
  3. 使用响应头设置资源的打开方式:
    * content-disposition:attachment;filename=xxx

步骤:

  1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
  2. 定义Servlet
    1. 获取文件名称
    2. 使用字节输入流加载文件进内存
    3. 指定response的响应头: content-disposition:attachment;filename=xxx
    4. 将数据写出到response输出流

简单的html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>download</title>
</head>
<body>
<a href="/xiang/img/tou.jpg">图片</a>
<hr>
<a href="/xiang/downloadServlet?filename=tou.jpg">图片</a>
</body>
</html>

servlet页面

package com.xiang.web.download;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author Xiang
 * @date 2020/07/14
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getParameter("filename");

        //文件服务器路径
        ServletContext context = this.getServletContext();
        String realPath = context.getRealPath("/img/"+filename);
        //字节流关联
        FileInputStream fis = new FileInputStream(realPath);

        //设置响应头
        //响应头类型
        String mimeType = context.getMimeType(filename);
        response.setHeader("content-type",mimeType);
        //响应头打开方式
        response.setHeader("content-disposition","attachment;filename="+filename);
        //输入流的数据写出到输出流中
        ServletOutputStream sos = response.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len =0;
        while ((len = fis.read(buff)) != -1){
            sos.write(buff,0,len);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

img图片路径
荐
                                                        简单案例说明ServletContext

本文地址:https://blog.csdn.net/xiangjunyes/article/details/107305516