JavaWeb基础知识day09——response和request

Response【ServletResponse接口--》HttpServletResponse接口】

组成:响应行、响应头、响应体

响应行

    作用:
        往浏览器写东西
    组成部分:
        响应行 响应头 响应体
    操作响应行 
        格式:
            协议/版本 状态码 状态码说明 例如:HTTP/1.1 200 OK
        状态码:
            1xx:已发送请求
            2xx:已完成响应
                200:正常响应
            3xx:还需浏览器进一步操作
                302:重定向 配合响应头:location
                304:读缓存
            4xx:用户操作错误
                404:用户操作错误.
                405:访问的方法不存在
            5xx:服务器错误
                500:内部异常
        常用方法:
            ★setStatus(int 状态码):针对于 1xx, 2xx, 3xx 
            了解 :
                sendError(int 状态码):针对于 4xx和5xx

响应头

操作响应头 
格式:key/value(value可以是多个值)
常用的方法:
    ★setHeader(String key,String value):设置值为字符串形式的响应头
        了解:setIntHeader(String key,int value):设置值为整型的响应头
        了解:setDateHeader(String key,long value):设置值为时间的响应头
    
    ★addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
        了解:addIntHeader(String key,int value):添加整形的响应头
        了解:addDateHeader(String key,long value):添加时间的响应头
常用的响应头:
    ★location:重定向
    ★refresh:定时刷新
    ★content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
    ★content-disposition:文件下载
    
    重定向:    
        方式1:
            ★response.sendRedirect("/day10/loc2");////结果为:location:http://localhost/day10/loc2
        方式2:
            response.setStatus(302);
            response.setHeader("location","/day10/loc2");//结果为:location:/day10/loc2
            
    定时刷新:
        方案1:设置头 refresh 
            response.setHeader("refresh","秒数;url=跳转的路径");
            response.setHeader("refresh","3;url=/day0901/login.htm");
        方案2:http的meta标签
            <meta http-equiv="refresh" content="3;url=/day10/refresh2.html">        
    mine类型:
        content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
            response.setContentType("text/html;charset=utf-8");        
    文件下载:
        content-disposition:设置文件下载
            response.setHeader("content-disposition","attachment;filename="+文件名称);

响应体

操作响应体:
    页面上要展示的内容
    常用方法:
        ★Writer getWriter():字符流
        ★ServletOutputStream getOutputStream() :字节流        
        自己写的东西用字符流,其他一概用字节流.
        
    处理响应中文乱码:
        方式1:★
            response.setContentType("text/html;charset=utf-8");
        方式2:理解
            response.setHeader("content-type", "text/html;charset=utf-8");
    注意:
        两个流互斥
        当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)

文件下载

文件下载:
下载方式:
    1.超链接下载
        <a href="/day10/download/day10.txt">下载 day10.txt</a>
        若浏览器能解析该资源的mime类型,则打开;若不能解析则下载;
    ★2.编码下载 通过servlet完成(设置两个头一个流【头:setContentType和content-disposition,流:getOutputStream】)
        <a href="/day10/download?name=day10.txt">下载 day10.txt</a>
        a.设置文件的mime类型
                //获取请求下载的文件名
            String filename = request.getParameter("name");
                //获取上下文
            ServletContext context = this.getServletContext();
                //获取文件的minetype
            String mimeType=context.getMimeType(filename);
                //设置响应头的minetype
            ★response.setContentType(mimeType);
        b.设置下载头信息 content-disposition
            ★response.setHeader("content-disposition", "attachment;filename="+filename);
        c.提供流
            //获取输入流
            InputStream is = context.getResourceAsStream("/download/"+filename);        
            //获取输出流
            ★ServletOutputStream os = response.getOutputStream();
        d.    int len = -1;
            byte[] by = new byte[1024];
            while(len=is.read(by)!=-1){
                os.write(by,0,len);
            }
            os.close();
            is.close();
    扩展:使用commons-io工具类
        对拷流:
            IOUtils.copy(is,os);
扩展:
    URLEncoder.encode(s, "utf-8"); 指定编码
    URLDecoder.decode(s8, "iso8859-1");指定解码
文件下载扩展:
    中文名称的文件名下载的时候名称会出现问题
    常见的浏览器需要提供文件名称的utf-8编码
    对于火狐来说需要提供文件名称的base64编码
        方案1:使用工具类【DownLoadUtils.java】
        方案2:网上的方式(8成好使)
            new String(filename.getByte("gbk"),"iso8859-1");

Request【ServletRequest接口--》HttpServletRequest接口】

request:请求
    作用:获取浏览器发送过来的数据
    组成部分:
        请求行 请求头 请求体

操作请求行 

    操作请求行 
        格式:
            请求方式  请求资源  协议/版本
        例如:请求行
            GET /day10/row?username=tom&password=123 HTTP/1.1
        常用方法:HttpServletRequest
            掌握
                ★String getMethod():获取请求方式    get/post
                ★String getRemoteAddr():获取ip地址    ip地址
                ★String getContextPath() :在java中获取项目名称    /day10    
            了解:
                String getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
                StringBuffer getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
                String getQueryString():获取请求的所有参数   username=tom&password=123
                String getProtocol():获取协议和版本     HTTP/1.1

    操作请求头

     格式:key/value(value可以是多个值)
    常用方法:
        ★String getHeader(String key):通过key获取指定的value (一个)            
        了解:
            Enumeration getHeaders(String name) :通过key获取指定的value(多个)
            Enumeration getHeaderNames() :获取所有的请求头的名称
            int getIntHeader(String key):获取整型的请求头
            long getDateHeader(String key):获取时间的请求头
    重要的请求头:
        user-agent:浏览器内核 msie firefox chrome
        referer:页面从那里跳转过来的 防盗链

操作请求体

参数 ★
    username=tom&password=123&hobby=drink&hobby=sleep
    常用方法:
         ★String getParameter(String key):获取一个值
         ★String[] getParameterValues(String key):通过一个key获取多个值
         ★Map<String,String[]> getParameterMap():获取所有的参数名称和值    

            =====getParameter=======
            username:tom
            ---------getParameterValues---------
            hobby:[drink, sleep]
            =====getParameterMap=======
            username::[tom]
            password::[123]
            hobby::[drink, sleep]

请求的中文乱码处理

请求的中文乱码:
        对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
        对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
        
        通用的方法【post和get请求】:
            new String(参数.getBytes("iso-8859-1"),"utf-8");
        针对于post请求来说:只需要将请求流的编码设置成utf-8即可【只能是post请求】
            request.setCharacterEncoding("utf-8");

域对象

域对象:
    request:
        创建:一次请求来的时候
        销毁:响应生成的时候
        作用:
            共享一次请求里面的数据
        请求转发(请求链,请求串)
            request.getRequestDispatcher("内部路径").forward(request,response);

面试题:请求转发和重定向区别?
    1.重定向发送两次请求、请求转发一次请求。
    2.重定向地址栏发生改变、请求转发地址栏不变。
    3.重定向是从浏览器发送、请求转发是从服务器内部发送。
    4.重定向不存在request域对象、请求转发可以使用request域对象。
    5.重定向是response的方法、请求转发是request的方法。
    6.重定向可以请求站外资源、请求转发只能请求站内资源。    

重定向和请求转发图形实例:

JavaWeb基础知识day09——response和request    

JavaWeb基础知识day09——response和request