web核心66-day09笔记(ServletContext, response, file download)

web核心66-day09笔记(ServletContext, response, file download)


1.引出ServletContext项目管家

servlet:
    运行在服务器端小程序
    servlet编写
    ....
    servletConfig------
        getServletContext--------->ServletContext

2.ServletContext的获取方式

    this.getServletConfig().getServletContext()
    this.getServletContext()

3.ServletContext是什么?

servlet上下文 就是项目的管理者  管家
ServletContext 生命周期(了解):
    出生:
        它是在服务器启动创建的,而且这个对象,一个项目只会创建一个;
    死亡:
        服务器关闭的时候;

4.ServletContext有什么用:

1.1.操作项目下任意资源(方法)
    1) getRealPath("资源路径");
    //返回项目下的任意的一个资源(无论是否真实存在)的 在项目发布后的真实磁盘目录
        返回值= tomcat家目录+/webapps+项目名/资源路径
    2) getResourceAsStream("资源路径");//返回你在项目下的任意的一个资源,直接返回输入流
        资源路径写法:
            必须/打头 项目根目录的意思
        自动判断资源是否存在,不存在返回null
    3)应用场景:文件上传和下载
        文件上传的时候需要获取 项目发布后的真实磁盘路径,然后上传到此处;
        文件下载的时候需要获取 项目文件的输入流.

1.2.提供了一些其他的辅助功能
    getMimeType("文件名 不管文件在哪"); 返回一个数据类型
        getMimeType("1.png")--> image/png
        getMimeType("xxx.gif")--> image/gif
        getMimeType("xxx.html")--> text/html
        getMimeType("xxx.xml")--> application/xml

1.3.提供了多个servlet之间数据通信功能:(因为一个项目只会创建一个ServletContext对象)
    一组xxAttribute();
        getAttribute("属性名")     获取属性
        setAttribute("属性名",属性值) 设置属性
        removeAttribute("属性名")  删除属性

1.4.获取全局配置参数(应用:框架中为配置文件配置地址)
    servlet规范中 允许我们为项目 整体设置一些参数

    例如:在web.xml中添加  
    
        班级名
        66期
    

    String value = getInitParameter(参数名)
 
  

5.response:响应

5.1.响应行:
    协议/版本 状态码 状态码说明
        setSatus(int code);//设置状态码 1xx-3xx
        setSatus(int code,String message);//既可以设置状态码也顺便设置说明

        sendError(int code);//设置状态码 4xx-5xx
        sendError(int code,String message);//既可以设置状态码也顺便设置说明

    如果你要设置的是 4xx-5xx 鼓励使用sendError

5.2.响应头:key/value  是一些辅助信息      
    1) setHeader("名字","值");//允许设置响应头和值
        以下方法了解,不用
        setDateHeader("名字",Long 值);//允许设置响应头和值
        setIntHeader("名字",int 值);//允许设置响应头和值

    2) addHeader("名字","值");//允许设置响应头和值
        以下方法了解,不用
        addDateHeader("名字",Long 值);//允许设置响应头和值
        addIntHeader("名字",int 值);//允许设置响应头和值

    3) 例子:
        setHeader("xx","yy")
        setHeader("xx","zz")
        setHeader会覆盖,想都保留,改用addHeader
    4) 常用响应头:
        Content-Type: 设置响应回去的内容的类型
            (替代方法:response.setContentType("text/html;charset=utf-8");)
        Location: 配合302状态码 重定向效果
        refresh: 定时刷新  值规范  秒值;url='刷新的地址' ---没用
            (定时刷新用js做: 详见refresh.html文档)
        Content-Disposition: 文件下载(详见 6案例 和 7文件下载工具类)
            response.setHeader("content-disposition","attachment;filename="+"不同浏览器编码后的文件名字");
                不同浏览器编码后的文件名字 = DownLoadUtils.getName(request.getHeader("user-agent"),name)
                response.setHeader("Content-Disposition","attachment;filename="+ DownLoadUtils.getName(request.getHeader("user-agent"),name));

    5)  //重定向   设置状态码,设置响应头 location 标识跳转地址
        /*response.setStatus(302);
        response.setHeader("location","http://localhost/xjj");*/

        response.sendRedirect("http://localhost/xjj"); ------>重定向

5.3.响应体:放置请求要的正文内容
    1) getWriter()//获取字符输出流----------->返回字符串 html代码
        response.getWriter().print("你好");
    2) getOutPutStream()//获取字节输出流----->返回压缩包 mp3 图片
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write("哈哈哈哈".getBytes());

    //注意:
        两流互斥 tomcat8以后不报错 但是不能同时用

7.文件下载(文件名不支持中文问题):

1.如果是火狐浏览器
    对文件名进行base64编码
2.如果其他浏览器 
    对文件名进行utf-8编码
3.工具类DownLoadUtils(针对不同浏览器,对文件名进行编码)
    方法:String getName("浏览器名","下载的文件名")

8.验证码举例:

作用:
    防止暴力攻击
    访问服务器  服务器可以给随机生成一个验证码图片
---------------------以下内容为 应用案例 ------------------------------------

案例1 统计网站的访问次数(ServletContext对象应用)

要求:
    每次你访问任何一个servlet,都要记录下来 被访问了一次,
    提供一个servlet,访问它的时候,把网站整个被访问了多少次 显示出来

案例2 文件下载

需求:
    在服务器有一个download.html  页面提供一些文件下载的连接 
    点击一下 就得下载文件
技术:
    servletContext
    response

一.案例完成文件下载的方式:

    实现方案一 简单到爆炸 但是很少用----------->不能保护你的资源               
    实现方案二 编码的方式

二.编写Servlet 帮我下载文件

    1) 好处:可以控制逻辑,是否允许下载,从而保护资源;
    2) 文件下载代码实现重点:(两个头一个流)
        (1) 设置一个content-type的响应头 告知浏览器 我返回时什么类型的文件(=请求中想下载的文件类型)
        (2) 设置下载头:告知浏览器 此次给你是一个用来下载的文件 即使你认识这个格式也不要打开
            response.setHeader("content-disposition","attachment;filename="+"不同浏览器编码后的文件名字");
                不同浏览器编码后的文件名字 = DownLoadUtils.getName(request.getHeader("user-agent"),name)
                response.setHeader("Content-Disposition","attachment;filename="+ DownLoadUtils.getName(request.getHeader("user-agent"),name));
        (3) 通过字节流输出人家想要的内容或者文件

   3) 代码实现步骤:
        (1) 编辑下载的web页面, download.html (注意事项如下:)
            a.下载链接到DownloadServlet,链接添加下载的文件名信息 href="http://localhost/download?filename=1.txt"

        (2) 生成DownloadServlet类

        (3) 设置响应头 content-type 属性 (注意事项如下:)
            a.响应头contet-type属性即为resquest中要下载的文件类型; -- response.setContentType(mimeType);
            b.因此先获取request参数值:下载的文件名 -- request.getParameter("filename");
            c.再利用项目管家得到文件类型 -- this.getServletContext().getMimeType(filename);

        (4) 设置响应头下载属性 content-disposition:attachment;filename="下载的文件名"  (需导入 工具类DownLoadUtils)
            a.获取请求中浏览器类型:request.getHeader("user-agent")
            b.浏览器兼容问题,需要利用DownLoadUtils工具类,将filename按要求编码 -- "下载的文件名" = DownLoadUtils.getName(request.getHeader("user-agent"),filename)
            c.response.setHeader("content-disposition","attachment;filename="+"下载的文件名");

        (5) 通过管家获取输入流,响应获取输出流
            a.this.getServletContext().getResourceAsStream("/WEB-INF/download/"+filename);
            b.response.getOutPutStream()

        (6) 利用IOUtils工具类输出下载文件给浏览器 (需导入commons-io-1.4.jar 工具包org.apache.commons.io.IOUtils;)
            a. IOUtils.copy(inputStream,outputStream);      

本节重点总结:

servletContext 管家  
response对象
案例一 统计网站访问次数
案例二 从网站下载文件

你可能感兴趣的:(notes)