request请求对象、response响应对象(笔记)

request请求对象、response响应对象

1.请求和响应的概述:
什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。
什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。

  1. HttpServletResponse对象
    HttpServletResponse是一个接口,它的父接口是ServletResponse ,在开发中通常使用HttpServletResponse
    响应信息分为三部分:响应行、响应头、响应正文(响应体)
    1.发送状态码的相关方法:

    >>>设置状态码:       
        setStatus(int sc) :参数就是状态码。
            常见的状态码: 200 响应成功                
                          404 请求资源找不到
                          302 重定向
                          500 服务器代码出异常。
    
    >>>错误信息方法:
        sendError(int sc) :参数状态码
        setStatus(int sc, String sm) :第一个参数表示状态码,第二个参数就状态码的描述。
    
        比如:
            response.sendError (404, "chapter04项目的请求资源不存在");

    1.2发送响应消息头相关的方法:
    响应消息头的数据格式: key-value的形式, 有的是一个key,一个value,有的是一个key, 多个value

    >>> 1.设置响应消息头:
        *一个keys,一个value 
            setHeader(String key , String value);
            比如: setHeader("aa", "AA");
            如果: setHeader("aa", "AA");
            setHeader("aa", "BB");
            最终的结果: aa这个头对应的值就是BB 
    
        * 一个key, 对应多个value
            addHeader(String key , String value);
            比如: addHeader("aa", "AA"); 
            addHeader("aa", "BB");
            最终的结果: aa这个头对应的值AA和BB
    
            比如:
                //与响应消息头相关的方法
                // 在用户名和密码输入 错误的情况下,重新回到登录页面让用户重新数据
                //1. 设置状态码
                response. setStatus (302);
                //2.设置响应头,完成重定向到登录页面
                response. setHeader ("Location", "/chapter04/ login.html");
    
    >>> 2.设置响应数据的长度: setContentLength(int src)方法
    
    >>> 3.设置处理乱码的方法:
        * setCharacterEncoding(String a);参数就是一个码表格式,比如: "utf -8"
        * setContentType(String a);参数代表响应数据的类型和码表格式,比如: "text/html ;charset=utf-8"

    1.3发送响应体相关的方法:
    第一个方法: get0utputStream() ,通过response向浏览器返回图片、视频等=进制数据的文件,当然也可以向浏览器、
    返回文本数据。

    比如:
        //字节流对象,向浏览器返回数据
        Servlet0utputStream out = response. getOutputStream();
        String value=" itcast";
        out . write(value. getBytes());
    
    第二个方法: getWriter() ,通常response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。
    
    比如: 
        //字符流向浏览器输出数据
        PrintWriter pw = response.getWriter();
        String value="itcast---";
        //pw.print(value);
        pw.write(value);

    1.4解决中文输出的乱码问题
    第一种方式:字节流向浏览器输出中文,会不会乱码:可能会出现乱码。
    出现乱码的原因:服务器端的编码格式和浏览器的编码格式不一致引起的。

        比如:
            //1.处理字节流的中文乱码问题
            String data="中 国";
            Servlet0utputStream out = response.get0utputStream();
            //2.处理乱码:服务器端的编码和浏览器端的编码保持一致。
            //3.让浏览器端的编码也是utf-8
            response.setHeader( "Content-Type" , "text/html;charset=utf-8");
            //4.让服务器端的中文编码格式是utf-8
            out.write(data.getBytes("utf-8"));
    
    处理字节流的中文乱码问题两种方式:
        >>>>第一种: response.setHeader("Content-Type", "text/html; charset=utf-8");
        >>>>第二章: response.setContentType("text/html ;charset=utf-8");
    
    第二种方式:字符流向浏览器输出中文,会不会乱码:肯定乱码。
    乱码个形式: ? ?, 这个问号就表示中文的编码格式是采用iso8859-1编码的,这种编码格式不支持中文。
    
        处理原则:让浏览器和服务器的编码保持-致:
            //1.处理字符流的中文乱码问题
            //2.处理服务器的编码,让这个编码支持中文
            response.setCharacterEncoding("utf-8");
            //3.处理器浏览器端的编码:
            response.setHeader( "Content-Type", "text/html ;charset=utf-8");
            String data="中国";
            //4.获取字符流
            PrintWriter pw = response.getWriter();
            pw. print(data); 
    
    处理字符流的中文乱码问题:
        >>>第一种方式: response.setCharacterEncoding( "utf-8");
                       response.setHeader("Content-Type", "text/html;charset=utf-8");
        >>>第二种方式: response.setContentType(" text/html ;charset=utf-8");
    
    结论:在处理字符流和字节流输出中文乱码时,都采用response.setContentType(”text/html;charset=utf-8");
    
    注意:
        常见的编码格式:
            GBK GB18030 GB2312 :都是支持中文的编码格式,当然支持其它一些字符。
            UTF-8 :万能码表格式,支持所有的字符。
            IS0-8859-1:不支持中文。

    1.5实现网页的定时跳转并刷新:
    定时跳转:从-一个注册页面跳转到登录页面,输入之前注册的用户名和密码。
    代码如下:
    // 1.定时跳转:需要用到Refresh响应头
    response.setHeader("Refresh","5;URL=/chapter04/login. html");
    定时刷新:在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。
    代码如下:
    response.setHeader("Refresh","5");
    response.getWriter().print(new Date());

    1.6实现重定向
    实现重定向相关的方法:

    第一种方式: 302和Location配合使用,实现重定向。
    response.setStatus(302);
    response.setHeader("Location" ,"/chapter04/login.html");
    第二种方式: sendRedirect("/chapter04/login.html");
    重定向通过登录案例来完成:
    需求分析:在登录页面输入用户名和密码,在LoginServlet里面,判断用户名和密码是否正确。
    如果输入错误,会重新定向到登录界面,如果正确,跳转到欢迎页面。
    获取登录页面提交的用户名和密码: request.getParameter()方法。

    重定向的特点: 
        1.浏览器地址栏发生变化
        2.发送了两次请求。都是由浏览器发送的请求
    
    重定向的路径:由于是浏览器发送得到请求,所以路径必须要带项目名称,比如: /chapter04/welcome.html ;

3.HttpServletRequest请求对象
HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。
请求消息:请求行,请求头,请求参数。
1.获取请求行消息的相关方法:
常用的请求行方法:

1.获取请求提交的方式: getMethod();
2.获取请求的协议: getProtocol();
3.获取项目名称: getContextPath();

  1. 获取servlet路径: getServletPath();
    5.获取请求路径:getRequsetURI(), getRequestURL();
    uri对应的值: /项目名称/servlet路径
    url对应的值: http: //localhost: 8080/uri
    2.获取请求消息头相关的方法
        >>> 1.根据消息头,获取值:String value = getHeader(消息头的名称);
        >>> 2.获取所有的消息头: Enumeration er = getHeaderNames();

        根据Referer请求消息头,做一个防盜链的案例:
            难点:怎么判断这个发起的下载请求是从别的网站上发起的?
            解决方法:根据Referer请求头对应的值,是否包含了服务器的名称如果包含,就说明是从本网站下载的,否则就不是。

    3.获取请求参数相关的方法: .
        >>> 1.根据name属性值,获取用户输入的值: String value = getParameter(name属性对应的值);
        >>> 2.根据name属性值,获取用户选择的值: String[] vaules = getParameterValues (name属性对应的值);
        >>> 3.没有参数,获取所有值: Map<String ,String[]> map = getParameterMap();

    4.解决请求参数的中文乱码问题:
        中文乱码处理分两种情况:

            第一种情况:处理get方式提交的中文乱码
                       使用的String的构造方法解决的中文乱码: new String(字节数组,编码格式);
                       代码: String newvalue = new String(value.getBytes ("IS08859-1"),"utf-8");
            第二种情况:处理post请 求的中文乱码问题: :
                       post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是IS08859-1,不支持中文
                       处理方法:把request缓冲区的编码给设置成支持中文的码表格式。
                       代码: request.setCharacterEncoding("utf-8");

    5.通过Requset对象传递数据
        什么域对象:在一定的范围内,可以存值和取值。
        request域对象:在一次请求中,可以存值和取值。
            >>>存值: setAttribute(String key,Object obj);
            >>>取值: object obj = getAttribyte(String key);
            >>>移除: removeAttribute(String key);

4、RequestDispatcher接口
在开发中访问到一-个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向
方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
得到转发对象: RequestDispatcher forward0bj = request.getRequestDispatcher("另一个资源的路径");

    常用方法:
        >>> 1.实现请求转发: forwardObj.forward(request,response);
        >>> 2.实现请求包含: forward0bj.include(request,response);

    1.请求转发:
        特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值得传递。
        转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。
      请求重定向:
        特点:发送了两次请求,响应了两次,不能喝request域对象配合使用。
        重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。

    2.请求包含:
        特点:发送一次请求,请求包含是由服务器完成。
        请求包含路径:在服务器内部完成的,路径不需要携带项目名称。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值