ServletContext对象
▶ 概念:Web应用的全局变量
▶ 获取
1.通过request对象获取 request.getServletContext()
2.通过HttpServlet获取 this.getServletContext()
▶ 功能
❶ 获取MIME类型( 在互联网通信过程中定义的一种文件数据类型)
MIME类型格式:大类型/小类型
(例如:text/html
,image/jpeg
)
获取:getMimeType(String file)
(为什么可以获得呢?因为web.xml中存有所有的文件后缀名(扩展名)与MIME类型的映射)
补充:给响应头设置MIME类型response.setHeader("content-type", context.getMimeType(...))
❷ 共享数据(因为ServletContext对象是个域对象)
域对象的范围是:Web项目
相关方法:setAttribute()
,getAttribute()
,removeAttribute()
❸ 获取文件真实路径(即"真正的Web项目"中的文件的完整路径)
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/a.txt"); // Web目录下的资源
String realPath = context.getRealPath("/WEB-INF/b.txt"); // WEB-INF目录下的资源
String realPath = context.getRealPath("/WEB-INF/classes/c.txt"); // src目录下的资源
// 可以看出,传入参数的目录起点为Web根目录(★☆★)
文件下载案例
我们把待下载的图片等静态文件放在Web目录下,如果要下载则必须先能定位到这些静态文件
此时,就不能像Servlet动态资源那样使用资源路径或者虚拟目录+资源路径了
你必须定位到服务器中"真正的web",因此必须使用realPath——这就用到了ServletContext对象
这个案例比较常用,且用到了知识点很零碎——一定要理解+掌握
关键思路:
- 我们需要一个Servlet用来下载。可如何让这个Servlet可以下载不同的资源呢?需要在url中传递filename请求参数
- 如何实现下载呢?将静态文件的字节流拷贝到response响应流中,且设置响应头——以附件形式打开资源,即下载
代码实现+细节注释
<!-- url中传递请求参数 -->
<a href="/loli/downloadServlet?filename=loli.jpg">下载loli.jpg</a>
<a href="/loli/downloadServlet?filename=loli.gif">下载loli.gif</a>
<a href="/loli/downloadServlet?filename=loli.avi">下载loli.avi</a>
@WebServlet("/downloadServlet")
public class downloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
*【简要思路】
* 根据请求参数找到文件(还要找realPath) + 复制字节流到response + 设置响应头打开资源方式为附件打开(下载)
*
*【细节】
* 根据不同的浏览器版本,设置不同的filename编码方式,转化filename字符串——解决中文乱码问题(通过工具类实现,网上找)
* 设置响应头(文件MIME类型,以附件形式打开资源 即下载)
*/
String filename = request.getParameter("filename");
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/image/" + filename);
FileInputStream fis = new FileInputStream(new File(realPath));
String agent = request.getHeader("user-agent");
filename = DownLoadUtils.getFileName(agent, filename);
response.setHeader("content-type", context.getMimeType(filename));
response.setHeader("content-disposition", "attachment;filename" + filename);
ServletOutputStream sos = response.getOutputStream();
byte[] buffer = new byte[1024 * 8];
int len = 0;
while((len = fis.read(buffer)) != -1){
sos.write(buffer, 0, len);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
End ♬
by a Lolicon ✪