请求,响应对象:request和response
 流程:
     1.服务器接收请求后,先创建request和response对象,把请求数据封装到request对象中
     2.服务器调用Servlet的service()方法并把这两个对象传递给service()方法
     3.在service()中通过request对象获取请求数据,使用response对象向客户端完成响应
     4.每次请求服务器都会创建新的request和response对象                                                                                  每个请求有自己独自的request和response对象response响应对象:HttpServletResponse
     ServletResponse-->与协议无关的类型
     HttpServletResponse-->与http协议相关的类型
 response对象的功能分为以下四种:
     1.设置响应头信息
     2.发送状态码
     3.设置响应正文
     4.重定向
 ---------------------------------------------------------------------------------------------------------------
 响应头Header设置:Content-Type、Refresh、Location等等   键值对  
  setHeader(String name, String value):     适用于单值的响应头
  addHeader(String name, String value):    适用于多值的响应头
           response.addHeader("aaa", "A");
           response.addHeader("aaa", "AA");
     setIntHeader(String name, int value):       适用于单值的int类型的响应头
  addIntHeader(String name, int value):      适用于多值的int类型的响应头
  setDateHeader(String name, long value):适用于单值的毫秒类型的响应头
 ----------------------------------------------------------------------------------------------------------------
 状态码发送:
   sendError(int sc)                         发送错误状态码,例如404、500
   sendError(int sc, String msg)    发送错误状态码+错误信息
   setStatus(int sc)                          发送成功的状态码
 -----------------------------------------------------------------
 响应体(正文):通常是html、也可以是图片!
   response的两个流:
         ServletOutputStream    向客户端发送字节数据
              ServletOutputStream out = resopnse.getOutputStream();
      PrintWriter                      向客户端发送字符数据,需要设置编码。
              PrintWriter writer = response.getWriter();
                两个流不能同时使用
 -----------------------------------------------------------------
 重定向:设置302,设置Location
      sendRedirect(String location)方法
              response.setHeader("Location","路径") +
              response.setError(302)
 定时刷新:Refresh
         response.setHeader("Refresh","时间;URL=路径")
===================================================================
 request请求对象:HttpServletRequest
     request对象封装了客户端所有的请求数据!
     { 请求行,请求头,空行,请求体(GET没体)}
             请求数据就是为了获取数据的!
 获取常用信息
   request.getRemoteAddr()      获取客户端IP  
   request.getMethod()               获取请求方式,POST/GET
 获取请求头
        request.getHeader(String name)            单值头
   request.getIntHeader(String name)       单值int类型
   request.getDateHeader(String name)    单值毫秒类型
   request.getHeaders(String name)          多值请求头
 获取请求  
        request.getScheme();              获取协议,http
   request.getServerName();      获取服务器名,localhost
   request.getServerPort();         获取服务器端口 8080
   request.getContextPath();      获取项目名
   request.getServletPath();       获取Servlet路径,
   request.getQueryString();      获取参数部分,即问号后面的部分。                   u     se                   username=xxx&password=yyy
   request.getRequestURI();      获取请求URI=项目名+Servlet路径。
   request.getRequestURL();     获取请求URL=不包含参数的整个请求路径。
 请求参数:由客户端发送给服务器的!                                                                                                                  可能在请求体中(POST), 也可能在URL之后(GET)
 获取请求参数
        String getParameter(String name):                 获取指定名称的单值请求参数值
   String[] getParameterValues(String name):   获取指定名称的多值请求参数
   Enumeration<String> getParameterNames():获取所有请求参数名称
   Map<String,String[]> getParameterMap():      获取所有请求参数,key+value
 -------------------------------------------------------------------------------------------------------------------
 请求转发和请求包含
                一个请求需要多个Servlet协作,一个请求跨多个Servlet共同完成
     请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
     请求包含:由两个Servlet共同未完成响应体!(都留)
         无论是请求转发还是请求包含,都在一个请求范围内!
                 ---> 使用同一个request和response使用request获取RequestDispatcher对象,方法参数是被转发或包含Servlet的Servlet路径
       RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");//路径
            请求转发:rd.forward(request,response);
     请求包含:rd.include(request,response);
 请求转发与重定向区别
   请求转发是一个请求一次响应,重定向是两次请求两次响应
   请求转发地址栏不变化,重定向会显示后一个请求的地址
   请求转发只能转发到本项目其他Servlet,重定向还可以定向到其他项目(范围更大)
   请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出request  URI,即包含项目名! 
 -------------------------------------------------------------------------------------------------------
 request域
     Servlet中三大域对象:request、session、application,都有如下三个方法:
                void setAttribute(String name, Object value)
     Object getAttribute(String name)
                void removeAttribute(String name)
     同一请求范围内使用request.setAttribute()、request.getAttribute()来传值
              前一个Servlet调用setAttribute()保存值
              后一个Servlet调用getAttribute()获取值
     同一范围内只能使用请求转发和包含(一个请求),不能使用重定向(两个请求)
 ==================================================================
 编码:
             字符编码  请求编码  响应编码  URL编码 
 乱码原因:
    1.浏览器对来自服务器的数据的编码和解码方式不一致
         eg:浏览器gbk解码,发来的数据utf-8编码
     2.不支持中文的编码后本来是乱码,浏览器解码乱码,更成乱码!
         eg:服务器iso-xx编码中文数据=乱码,浏览器用gbk==解码乱码==》!!乱码
 字符编码:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系统默认编码,中国国标码)响应编码:
     第一步:response.setCharaceterEncoding()设置编码格式
       或者:response.setHeader("Content-Type", "text/html;charset=编码格式")
     第二步:response.getWriter()服务器再发送字符
         解释:服务器设置响应头给浏览器告知编码格式,浏览器就会才行对应解码方式请求编码:浏览器给服务器发送的参数的编码方式
    客户端首先向服务器请求页面(表单或者超链接)时,服务器响应编码是啥,客户端请求编码就是啥
     请求编码处理分为两种:GET和POST
          GET   请求参数不在请求体中 反解码成字节,再编码
         POST  请求参数在请求体中   获取参数前调用request.setCharacterEncoding("utf-8")URL编码:客户端与服务器之间传递参数用的一种方式
          客户端get请求使用中文没有URL编码,可能会丢失字节
          使用表单,表单提交数据直接采用URL编码,服务器自动解码
     URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。最后我们需要把链接中的中文参数,使用url来编码    
       * POST请求默认就使用URL编码!tomcat会自动使用URL解码!
   * URL编码:String username = URLEncoder.encode(username, "utf-8");
   * URL解码:String username = URLDecoder.decode(username, "utf-8");
 ==================================================================