• ServletContext


    一、ServletContext对象简介

            ServletContext 是应用上下文对象。每一个应用中只有一个 ServletContext 对象, 这个ServletContext 对象被所有Servlet所共享.

            在 Servlet 规范中,一共有 4 个域对象。ServletContext 就是其中的一个。它也是 web 应用中最大的作用域,也叫 application 域。它可以实现整个应用之间的数据共享!

    生命周期:应用一加载则创建,应用被停止则销毁。

    二、ServletContext对象的获取

            1、通过request对象获取

    ServletContext servletContext1 = req.getServletContext();
    System.out.println("servletContext1 = " + servletContext1);

            2、通过HttpServlet获取

    ServletContext servletContext2 = this.getServletContext();
    System.out.println("servletContext2 = " + servletContext2);

             注意:两个ServletContext是同一个对象,在一个应用中, ServletContext对象是唯一的!

    三、ServletContext对象的作用

            1、作为域对象

                    域对象指的是对象有作用域。也就是有作用范围。域对象可以实现数据的共享。不同作用范围的域对象,共享数据的能力也不一样。

                    在 Servlet 规范中,一共有 4 个域对象。ServletContext 就是其中的一个。它也是 web 应用中最大的作用域,也叫 application 域。它可以实现整个应用之间的数据共享!

    返回值方法名说明
    voidsetAttribute(String name,Object value)向域对象中存储数据
    ObjectgetAttribute(String name)通过名称获取域对象中的数据
    voidremoveAttribute(String name)通过名称移除域对象中的数据

            2、代码实现ServletContext对象

    //获取ServletContext对象 ServletContext作为域对象存储数据
    //ServletContext context1 = this.getServletContext();
    //获取ServletContext对象
    ServletContext context = req.getServletContext();
    

            3、向ServletContext对象存储数据

    //向ServletContext对象存储数据
    context.setAttribute("sex","女孩");

            4、从ServletContext对象中获取数据

    //从ServletContext对象中获取数据
    Object sex = context.getAttribute("sex");

            5、从ServletContext对象中删除数据

    context.removeAttribute("sex");

            6、根据文件名获取MIME类型

    //获取ServletContext对象
    ServletContext context = req.getServletContext();

    //根据文件名获取MIME类型

    String mimeType = context.getMimeType("a.html");

    //mimeType = text/html

    System.out.println("mimeType = " + mimeType);

    四、获取文件的真实(服务器)路径

            真实路径也叫服务器路径。举个例子,你在本地工作空间里存储着一份你的项目,同时你在你的服务器上也存储着同样的项目。那么你访问的时候是访问本地空间里的项目呢,还是访问服务器上的项目。显然是服务器上的路径。所以 真实路径也叫服务器路径。

    返回值方法名说明
    StringgetRealPath(String path)获取文件的真实路径

            1、项目结构

            

            2、获取web目录下的资源

    //获取ServletContext对象
    ServletContext context = req.getServletContext();
    //获取web目录下的资源
    String path = context.getRealPath("/b.txt");

            3、WEB-INF目录下的资源

    //获取ServletContext对象
    ServletContext context = req.getServletContext();

    String path1 = context.getRealPath("/WEB-INF/c.txt");

             4、获取src目录下的资源

    //获取ServletContext对象
    ServletContext context = req.getServletContext();

    //获取src目录下的资源

    String path2 = context.getRealPath("/WEB-INF/classes/a.txt");

     五、文件下载案例

            1、文件下载需要:

                    1、页面显示超链接

                    2、点击超链接后弹出下载提示

                    3、完成图片文件下载

            2、实现步骤:

                    1、定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

                    2、定义Servlet, 实现下载功能

                    3、获取文件名称

                    4、使用字节输入流加载文件进内存

                    5、指定response的响应头: content-disposition:attachment;filename=xxx

                    6、将数据写出到response输出流

            3、文件名中文乱码问题

                    文件名为中文, 下载时文件名显示错误

                    解决思路:
                         1. 获取客户端使用的浏览器版本信息
                         2. 根据不同的版本信息,设置filename的编码方式不同

                    提供的工具类:

            4、代码实现:

            工具类:

    1. package com;
    2. import sun.misc.BASE64Encoder;
    3. import java.io.UnsupportedEncodingException;
    4. import java.net.URLEncoder;
    5. public class DownLoadUtils {
    6. public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
    7. if (agent.contains("MSIE")) {
    8. // IE浏览器
    9. filename = URLEncoder.encode(filename, "utf-8");
    10. filename = filename.replace("+", " ");
    11. } else if (agent.contains("Firefox")) {
    12. // 火狐浏览器
    13. BASE64Encoder base64Encoder = new BASE64Encoder();
    14. filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    15. } else {
    16. // 其它浏览器
    17. filename = URLEncoder.encode(filename, "utf-8");
    18. }
    19. return filename;
    20. }
    21. }

                    实现下载

    1. package com;
    2. import javax.servlet.ServletContext;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.ServletOutputStream;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.BufferedInputStream;
    10. import java.io.FileInputStream;
    11. import java.io.IOException;
    12. /**
    13. * @author 86136
    14. */
    15. @WebServlet("/download")
    16. public class FileName extends HttpServlet {
    17. @Override
    18. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19. doPost(req, resp);
    20. }
    21. @Override
    22. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23. //1、获取文件名称
    24. String filename = req.getParameter("filename");
    25. //2、获取ServletContext对象
    26. ServletContext servletContext = req.getServletContext();
    27. //3、根据文件名获取文件真实路径
    28. String path = servletContext.getRealPath("/img/" + filename);
    29. //使用缓冲字节流根据路径读取文件
    30. /*FileInputStream inp = new FileInputStream(path);*/
    31. BufferedInputStream inp = new BufferedInputStream(new FileInputStream(path));
    32. //4、指明文件MIME类型
    33. String mimeType = servletContext.getMimeType(filename);
    34. //5、设置响应的MIME类型
    35. resp.setContentType(mimeType);
    36. /*resp.setHeader("content-type",mimeType);*/
    37. //5.1、获取浏览器信息
    38. String header = req.getHeader("user-agent");
    39. //5.2、解决中文名乱码问题, 根据浏览器类型,重新对文件名编码
    40. filename = DownLoadUtils.getFileName(header, filename);
    41. //6、以下载的方式打开 context-disposition:我这里必须大写才能下载到本地不知道为什么
    42. /*resp.setHeader("context-disposition",
    43. "attachment;filename="+filename);*/
    44. resp.setHeader("Content-Disposition",
    45. "attachment;filename=" + filename);
    46. //7、将数据写入到resp
    47. ServletOutputStream out = resp.getOutputStream();
    48. int len=0;
    49. while ((len = inp.read())!=-1){
    50. out.write(len);
    51. }
    52. /*byte[] buffer = new byte[1024*8];
    53. while ((len = inp.read(buffer)) != -1) {
    54. out.write(buffer, 0, len);
    55. }*/
    56. inp.close();
    57. out.close();
    58. }
    59. }

            html文件:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <a href="/img/美女.jpg">美女图片a>
    9. <br>
    10. <a href="/img/诛仙.mp4">诛仙a>
    11. <br>
    12. <a href="/download?filename=美女.jpg">美女图片下载a>
    13. <br>
    14. <a href="/download?filename=诛仙.mp4">诛仙下载a>
    15. <br>
    16. body>
    17. html>

            

  • 相关阅读:
    堆-c语言实现
    CTFHub技能树web之XSS
    MPJ: MyBatis-Plus-Join连表查询
    大一新生HTML期末作业 个人网页王嘉尔明星介绍网页设计与制作
    Python学习 -- 常用数据交换格式(CSV、XML、JSON)
    pandas使用to_datetime函数将时间字符串转化为时间对象、其中月份内容为字母而非数字(例如,“January 2, 2022“)
    Allavsoft Video Downloader Converter Mac(视频下载工具)
    使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
    ChatGpt接口流式输出解决方案
    Ubuntu下安装microk8s用代理解决无法拉取镜像问题
  • 原文地址:https://blog.csdn.net/qq_64011014/article/details/139395651