# request对象和response对象的原理

  • request和response对象是由服务器创建的
  • request对象是来获取请求信息,response对象是来设置响应消息

request对象继承体系结构

ServletRequest  - - 接口
   | 继承
HttpServletRequest  - - 接口
   | 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)

request功能

  1. 获取请求信息数据

    1. 获取请求行数据
      GET /PAG /demo1?name=zhangsan HTTP/1.1

      方法:

       1. 获取请求方式:GET
       **String getMethod()**
       2. 获取虚拟目录:/PAG
       **String getContextPath()**
       3. 获取servlet路径:/demo1
       **String getServletPath()**
       4. 获取get方式请求参数:name=zhangsan
       **String getQueryString()**
       5. 获取请求URL:/PAG/demo1
       **String getRequestURI() :   /PAG/demo1
       StringBuffer getRequestURL():  http://localhost/PAG/demo1**
       6. 获取协议及版本:HTTP/1.1
       **String getProtocol()**
       7.  获取客户机的IP地址:
       **String getRemoteAddr()**   
      
    2. 获取请求头数据

    方法:
    (*)String getHeader(String name):通过请求体的名称获取请求头的值
    Eumeration<String> getHeaderNames():获取所有的请求头名称

    1. 获取请求体数据

    请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
    步骤:

     - 获取流对象
     `BufferedReader getReader():  获取字符输入流,只能操作字符数据`
     ` ServletInputStream getInputStream(): 获取字节输入流,可以操作所有类型数据`
     - 再从流对象中拿数据
    
  2. 其他功能:

    1. 获取请求参数通用方式
      1. String getParameter(String name):根据参数名称获取参数值
      2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
      3. Eumeration<String> getHeaderNames():获取所有的请求头名称
      4. Map<String,String[]> getParameterMap():获取所有参数的map集合

    中文乱码问题:
    get方式:tomcat 8 已经将get方式乱码问题解决了
    post方式:会乱码
    解决:在获取参数前,设置request的编程request.serCharterEncoding(“utf-8”);

    1. 请求转发:一种在服务器内部的资源跳转方式

    步骤:
    通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)


    **特点: 浏览器地址栏路径不发生变化 只能转发到当前服务器内部资源中 转发是一次请求** 3. 共享数据 **域对象:一个有作用范围的对象,可以在范围内共享数据 request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据 方法:** `void setAttribute(String name,Object obj):存储数据 Object getAttitude(String name):通过键获取值 void removeAttribute(String name):通过键移除键值对` 4. 获取ServletContext `ServletContext getServletContext()`