ServletContext对象 +文件下载案例

 

ServletContext对象

 
▶ 概念:Web应用的全局变量

▶ 获取

1.通过request对象获取		request.getServletContext()
2.通过HttpServlet获取	this.getServletContext()

▶ 功能

获取MIME类型( 在互联网通信过程中定义的一种文件数据类型)

MIME类型格式:大类型/小类型(例如:text/htmlimage/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对象
 
这个案例比较常用,且用到了知识点很零碎——一定要理解+掌握

关键思路:

  1. 我们需要一个Servlet用来下载。可如何让这个Servlet可以下载不同的资源呢?需要在url中传递filename请求参数
  2. 如何实现下载呢?将静态文件的字节流拷贝到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 ✪

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值