荐 简单案例说明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. 功能:
-
获取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. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
3. 获取文件的真实(服务器)路径
-
方法:String getRealPath(String path)
-
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. 完成图片文件下载
分析
- 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
- 任何资源都必须弹出下载提示框
- 使用响应头设置资源的打开方式:
* content-disposition:attachment;filename=xxx
步骤:
- 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
- 定义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