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、代码实现:

        工具类:

package com;
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}

                实现下载

package com;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.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;/*** @author 86136*/
@WebServlet("/download")
public class FileName extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1、获取文件名称String filename = req.getParameter("filename");//2、获取ServletContext对象ServletContext servletContext = req.getServletContext();//3、根据文件名获取文件真实路径String path = servletContext.getRealPath("/img/" + filename);//使用缓冲字节流根据路径读取文件/*FileInputStream inp = new FileInputStream(path);*/BufferedInputStream inp = new BufferedInputStream(new FileInputStream(path));//4、指明文件MIME类型String mimeType = servletContext.getMimeType(filename);//5、设置响应的MIME类型resp.setContentType(mimeType);/*resp.setHeader("content-type",mimeType);*///5.1、获取浏览器信息String header = req.getHeader("user-agent");//5.2、解决中文名乱码问题, 根据浏览器类型,重新对文件名编码filename = DownLoadUtils.getFileName(header, filename);//6、以下载的方式打开 context-disposition:我这里必须大写才能下载到本地不知道为什么/*resp.setHeader("context-disposition","attachment;filename="+filename);*/resp.setHeader("Content-Disposition","attachment;filename=" + filename);//7、将数据写入到respServletOutputStream out = resp.getOutputStream();int len=0;while ((len = inp.read())!=-1){out.write(len);}/*byte[] buffer = new byte[1024*8];while ((len = inp.read(buffer)) != -1) {out.write(buffer, 0, len);}*/inp.close();out.close();}
}

        html文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body><a href="/img/美女.jpg">美女图片</a><br><a href="/img/诛仙.mp4">诛仙</a><br><a href="/download?filename=美女.jpg">美女图片下载</a><br><a href="/download?filename=诛仙.mp4">诛仙下载</a><br>
</body>
</html>

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339161.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

装饰器,状态管理和if判断(HarmonyOS学习第六课)

Builder装饰器-自定义构建函数 前面介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使方法进行数据传递。ArkUI还提供了一种更轻量的UI 元素复用机制Builder&#xff0c;Builder 所装饰的函数遵循build( )函数语法规则&#xff0c;开发者可以将重…

飞书API(11):阿里云MaxCompute分区表入库

一、引入 前面入库阿里云 MaxCompute 的数据都是读取之后直接写入&#xff0c;保留数据最新的状态&#xff0c;如果我要保留历史的状态&#xff0c;怎么办呢&#xff1f;MaxCompute 表有一个分区功能&#xff0c;可以自行定义分区。我们可以使用 MaxCompute 表的分区功能&…

vue3-调用API实操-调用开源头像接口

文档部分 这边使用是开源的API 请求地址: &#xff1a;https://api.uomg.com/api/rand.avatar 返回格式 : json/images 请求方式: get/post 请求实例: https://api.uomg.com/api/rand.avatar?sort男&formatjson 请求参数 请求参数说明 名称必填类型说明sort否strin…

云原生架构案例分析_2.云原生技术助力某汽车公司数字化转型实践

名词解释&#xff1a; 互联网 在“互联网”模式下&#xff0c;我们仅仅把互联网看作是一种传播工具、传播手段、传播渠道和传播平台&#xff0c;对于互联网的应用大体上是在既有的运作逻辑的基础之上&#xff0c;把互联网作为延伸传媒影响力、价值和功能的一种延伸型工具&…

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下&#xff0c;智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构&#xff0c;介绍其核心要素和应用实践&#xff0c;帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…

【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的医院管理系统&#xff0c;以提高医院管理效率&#xff0c;优化医疗服务流程&#xff0c;提升患者就诊体验…

软件定义汽车,通信连接世界 | 2024汽车软件与通信大会开幕

5月28日-30日&#xff0c;在江苏省工业和信息化厅、智能汽车安全技术全国重点实验室指导下&#xff0c;由中国中检所属中国汽车工程研究院股份有限公司&#xff08;下称&#xff1a;中国汽研&#xff09;主办&#xff0c;中汽院(江苏)汽车工程研究院有限公司承办的2024汽车软件…

学业辅导导师:文心一言智能体详细介绍和开发

一、前言 本期题目 开发方向&#xff1a;学习成长类 解读&#xff1a; AI技术在学习成长方向的应用正日益增多&#xff0c;本期赛题需围绕该方向开发智能体包括但不限于:作文辅导助手、个性化学习助手、考试助手、各垂类教育内容专家等 二、我的智能体&#xff1a;学业辅导…

SQL面试题练习 —— 波峰波谷

来源&#xff1a;字节今日头条 目录 1 题目2 建表语句3 题解 1 题目 有如下数据&#xff0c;记录每天每只股票的收盘价格&#xff0c;请查出每只股票的波峰和波谷的日期和价格&#xff1b; 波峰定义&#xff1a;股票价格高于前一天和后一天价格时为波峰 波谷定义&#xff1a;股…

带交互的卡尔曼滤滤波|一维滤波|源代码

背景 一维卡尔曼滤波的MATLAB例程&#xff0c;​背景为温度估计。 代码介绍 运行程序后&#xff0c;可以自己输入温度真实值&#xff1a; 以20℃为例&#xff0c;得到如下的估计值​&#xff1a; 滤波前的值和滤波后的值分别于期望值&#xff08;真实值&#xff09;作差…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…

6.3 Go 结构体(Struct)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Qt】初识

一、使用Label显示Hello World 1.ui设计 可以在Qt Designer中拖拽方式进行创建 2.代码方式 在myqwidget.cpp文件中添加下列代码 二、对象树 我们在堆上创建了QLabel类的对象。但是我们没有去delete&#xff0c;这样会产生内存泄漏吗&#xff1f; 答案是不会。label对象会在…

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程&#xff01; 什么是Docker&#xff1f;看这一篇干货文章就够了&#xff01; UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#…

centos7下安装MySQL,Oracle数据库

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

【Ambari】Docker 安装Ambari 大数据单机版本

目录 一、前期准备 1.1 部署 docker 1.2 部署 docker-compose 1.3 版本说明 二 、镜像构建启动 2.1 系统镜像构建 2.2 安装包源镜像构建 2.3 kdc镜像构建 2.4 集群安装 2.5 容器导出为镜像 三、Ubuntu环境安装测试 3.1 环境准备 3.2 集群容器启动 一、前期准备 1.…

【算法】理解堆排序

堆排序&#xff0c;无疑与堆这种数据结构有关。在了解堆排序之前&#xff0c;我们需要先了解堆的建立与维护方法。 堆 堆&#xff08;二插堆&#xff09;可以用一种近似的完全二叉树来表示&#xff0c;该二叉树除了叶子结点之外&#xff0c;其余节点均具有两个子女&#xff0c…

模板-初阶

引言&#xff1a; 在C&#xff0c;我们已经学过了函数重载&#xff0c;这使得同名函数具有多个功能。但是还有一种更省力的方法&#xff1a;采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前&#xff0c;通过一个故事引…

nginx的配置粗记

小白nginx的配置随笔&#xff08;随便记记&#xff09; 前言 我们都知道nginx有很多用途&#xff0c;比如&#xff1a;负载均衡&#xff0c;反向代理&#xff0c;网关路由&#xff0c;解决跨域等问题。我这次开发项目&#xff0c;用到的一些功能也涉及到了对nginx的配置&#…