当前位置: 移动技术网 > IT编程>开发语言>Java > 荐 简单案例说明ServletContext

荐 简单案例说明ServletContext

2020年07月16日  | 移动技术网IT编程  | 我要评论

介绍

说起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图片路径
在这里插入图片描述

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网