JavaWeb---Response和Request对象介绍

请求,响应对象: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");
==================================================================
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值