本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
简述:
ServletContext代表整个web应用,在Web容器启动时,会为Web应用程序建议一个全局唯一的ServletContext对象,用来和容器(服务器)来进行通信。例如当我们访问某个网站,会显示我们是第几位浏览者(即网站计数器),又或者是当我们会看到某网站时显示多少人在线,这两个例子都是使用该对象实现的,而不是操作数据或者文件,极大的节约了资源。
用法:
- 获取ServletContext对象
request.getServletContext():
通过request对象来获取该对象。this.getServletContext():
通过HttpServlet来获取该对象。
String getMimeType(String file):
获取MIME类型,该类型是互联网通信过程中定义的一种文件数据类型。- 格式:大类型/小类型 例
text/html
image/jpeg
如图示例
- 格式:大类型/小类型 例
- ServletContext对象是域对象,可以用来共享数据。
setAttribute(String name, Object value):
设置域中属性。getAttribute(String name):
得到域中属性。removeAttribute(String name):
移除域中属性。
String getRealPath(String path) :
获取文件的真实路径(服务器路径)。context.getRealPath("/b.txt"): // 获取web目录下的资源。
context.getRealPath("/WEB-INF/c.txt"); // WEB-INF目录下的资源。
context.getRealPath("/WEB-INF/classes/a.txt"); // src目录下的资源。
案例:
文件下载需求:
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件或视频文件下载
资源目录结构
页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/servletContext?type=img.jpg">下载图片</a><br>
<a href="/servletContext?type=video.mp4">下载视频</a>
</body>
</html>
Servlet代码
String parameter = request.getParameter("type");
ServletContext servletContext = request.getServletContext();
// 获得文件的mime类型
String mimeType = servletContext.getMimeType(parameter);
// 使用此响应头设置资源的打开方式,在这里我们设置用附件方式打开
response.setHeader("content-disposition", "attachment;filename=" + parameter);
// 设置响应头类型
response.setHeader("content-type", mimeType);
// 下载图片类型
if ("img.jpg".equals(parameter)) {
String path = servletContext.getRealPath("/img/" + parameter);
FileInputStream fileInputStream = new FileInputStream(path);
byte[] bytes = new byte[1024];
int length = 0;
ServletOutputStream outputStream = response.getOutputStream();
while ((length = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
}
fileInputStream.close();
}
// 下载视频类型
else if ("video.mp4".equals(parameter)) {
String path = servletContext.getRealPath("/video/video.mp4");
FileInputStream fileInputStream = new FileInputStream(path);
byte[] bytes = new byte[1024];
int length = 0;
OutputStream outputStream = response.getOutputStream();
while ((length = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
}
fileInputStream.close();
}