ServletContext对象
概念
代表整个web应用, 可以和程序的容器(服务器)来通信
获取ServletContext对象
- 通过request对象获取
request.getServletContext()
- 通过HttpServlet获取
this.getServletContext()
两个方法获取的是同一个对象
功能
获取MIME类型
- MIME类型: 在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/ 小类型
例如:text/html, image/jpep
获取:String getMineType(String filename)
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletContext对象获取
ServletContext context = this.getServletContext();
//定义文件名称
String filename = "a.jpg";
//获取MIME类型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
}
域对象: 共享数据
void setAttribute(String name, Object value)
Object getAttribute(String name)
void removeAttribute(String name)
ServletContext对象范围: 所有用户的所有请求(不同浏览器访问服务器的不同资源也可以获取)
生命周期长, 作用范围大
会造成内存压力大, 谨慎使用
获取文件的真实(服务器)路径
这里的真实路径指的是在tomcat服务器中的路径, 不是本地IDEA工作空间的路径
-
方法:
String getRealPath(String path)
以IDEA中编译后的target文件夹下以项目名命名的文件夹为根目录, 例如项目名为filter, 则编译后target下的目录结构如下:
在maven webapp项目中各目录与获取真实路径应该写的目录对应关系
resources/resources.txt -> /WEB-INF/classes/resources.txt (resources下面的文件会被编译到classes文件夹下)
src/src.txt -> 没有
webapp/webapp.txt -> /webapp.txt
webapp/WEB-INF/WEB-INF.txt -> WEB-INF/WEB-INF.txt
实例:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletContext对象获取
ServletContext context = this.getServletContext();
//获取文件的真实路径
String realPath = context.getRealPath("/b.txt");//webapp目录下资源访问
System.out.println(realPath);
String realPath2 = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(realPath2);
String realPath3 = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(realPath3);
}
下载文件案例:
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求参数, 文件名称
String filename = req.getParameter("filename");
//2. 使用字节输入流加载文件进内存
//2.1 找到文件服务路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2 用字节流关联
FileInputStream fileInputStream = new FileInputStream(realPath);
//3. 设置response的响应头
//3.1 设置响应头类型: content-type
String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型
resp.setHeader("context-type", mimeType);
//3.2 设置响应头打开方式: content-disposition
resp.setHeader("content-disposition", "attachment;filename=" + filename);
//4. 将输入流的数据写出到输出流中
ServletOutputStream outputStream = resp.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while ((len = fileInputStream.read(buff)) != -1) {
outputStream.write(buff, 0, len);
}
fileInputStream.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}