概念
- SerlvetContext对象代表整个web应用,可以和程序的容器(服务器)来通信
获取
-
通过request对象获取
request.getServletContext();
-
通过HttpServlet获取
this.getServletContext();
// ServletContext对象获取 ServletContext servletContext1 = request.getServletContext(); ServletContext servletContext2 = this.getServletContext(); System.out.println(servletContext1); // org.apache.catalina.core.ApplicationContextFacade@429db069 System.out.println(servletContext2); // org.apache.catalina.core.ApplicationContextFacade@429db069 System.out.println(servletContext1==servletContext2); // true
功能
获取MIME类型:
- MIME类型:在互联网通信过程中定义的一中文件数据类型
- 格式:大类型/小类型 text/html
- 获取:
String getMimeType(String file)
// ServletContext对象获取 ServletContext servletContext = request.getServletContext(); // 定义文件名称 String filename="a.jpg"; String mimeType = servletContext.getMimeType(filename); System.out.println(mimeType); // image/jpeg
域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
-
ServletContext对象的范围:所有用户所有请求的数据
// 文件ServletContextDemo3.class // ServletContext对象获取 ServletContext servletContext = request.getServletContext(); // 设置数据 servletContext.setAttribute("nihao","hello");
// 文件ServletContextDemo4.class // ServletContext对象获取 ServletContext servletContext = request.getServletContext(); Object nihao = servletContext.getAttribute("nihao"); System.out.println(nihao);
获取文件的真实(服务器)路径:
String getRealPath(String path)
// ServletContext对象获取 ServletContext servletContext = request.getServletContext(); // ‘/’代表web文件夹,web目录下的a.txt String realPath = servletContext.getRealPath("/a.txt"); // web目录下WEB-INF下的b.txt String realPath1 = servletContext.getRealPath("/WEB-INF/b.txt"); // src目录下的c.txt String realPath2 = servletContext.getRealPath("/WEB-INF/classes/c.txt"); System.out.println(realPath2);
练习
-
文件下载
需求: 页面显示连接 点击超链接后弹出下载提示框 点击图片完成下载
@WebServlet("/downloadservlet") public class DownLoadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取请求参数,获取文件名称 String filename = request.getParameter("filename"); // 2、使用字节输入流加载文件进内存 // 2.1、找到文件的服务器路径 ServletContext servletContext = this.getServletContext(); String realPath = servletContext.getRealPath("/WEB-INF/classes/"+filename); System.out.println(realPath); // 2.2、用字节流关联 FileInputStream fileInputStream = new FileInputStream(realPath); // 3、设置response的响应头 // 3.1、设置响应头类型 String mimeType = servletContext.getMimeType(filename); response.setHeader("content-type",mimeType); // 3.2、设置响应头打开方式 response.setHeader("content-disposition","attachment;filename="+filename); // 4、将输入流的数据写出到输出流中 ServletOutputStream outputStream = response.getOutputStream(); byte[] buff=new byte[1024*8]; int len=0; while ((len=fileInputStream.read(buff))!=-1){ outputStream.write(buff,0,len); } fileInputStream.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
<a href="/day24_war_exploded/downloadservlet?filename=cat.jpg">下载图片</a>