【博学谷学习记录】超强总结,用心分享|请求与响应知识week16

目录

Request

Response

Request对象方法

获取请求参数的方法

请求参数中文乱码的问题

post请求乱码

get请求乱码

request请求转发

Response响应对象

response重定向

重定向的路径选择

重定向动态添加虚拟目录

Response响应字符数据

Response响应字节数据


Request

Request对象是用来封装请求数据的对象

作用:

        1.获取请求的数据

        2.浏览器发送请求到后台服务器

        3.后台服务器会将请求来的数据存入到一个对象中

Response

response对象是用来封装响应数据的对象

作用:

        1.设置响应数据

        2.后台需要将处理完的数据结果返回给前端

        3.后台会将服务器解析response对象,拼接结果

Request对象方法

获取请求方式:String getMethod()

获取虚拟目录(项目访问路径):String getContextPath()

获取URL(统一资源定位符):StringBuffer getRequtestURL()

获取URI(统一资源标识符):String getRequtestURI()

获取请求方式的请求参数:String getQueryString()

获取请求头的数据:String getHeader(String name)

获取请求体的数据:

                                字节数据:1.ServletInputStream getInputStream()

                                字符数据:2.BufferReader getReader()

注意:BufferReader流是通过request对象来获取的,请求完成后request对象会被销毁,BufferReader流也会自动关闭,不需要手动关闭流

获取请求参数的方法

1.先是去获取请求方式,再根据不同的请求类型。应用不同的参数获取方式

//获取请求方式
String method = req.getMethod();
//获取请求参数
String params = "";
if("GET".equals(method)){
     params = req.getQueryString();
}else if("POST".equals(method)){
     BufferedReader reader = req.getReader();
     params = reader.readLine();
}

2.request对象已经将上述获取请求参数的方法进行了封装,只需要使用request的方法即可

先获取参数map集合,再根据名称获取参数数组值或者是参数值。

//获取所有参数Map集合
Map<String,String[]> map = request.getParameterMap()
//根据名称获取参数值(数组)
String[] map = request.getParameterValues(String name)
//根据名称获取参数值(单个值)
String name = request.getParameter(String name)


请求参数中文乱码的问题

post请求乱码

问题的由来

POST的请求参数是通过request的getReader()来获取流中的数据

TOMCAT在获取流的时候采用的编码是ISO-8859-1

ISO-8859-1编码是不支持中文的,所以会出现乱码

解决方法

将页面的编码格式改为UTF-8

将tomcat获取流数据的编码格式设置为UTF-8

通过request.setCharaterEncoding("UTF-8")设置编码

get请求乱码

应为浏览器发送请求的过程会对数据进行编码会采用UTF-8的方式编码,而后台接收到请求会按照默认的ISO-8859-1的方式进行解码。两种解码方式不一样,会导致乱码

//1. URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2. URL解码
String decode = URLDecoder.decode(encode, "ISO-8859-1");

request请求转发

请求转发指的是一种在服务器内部的资源跳转方式

浏览器发送请求给服务器,服务器中对应的资源接收到请求

资源A处理完请求后将请求发送给资源B,请求从资源A到资源B的过程就叫请求转发

请求转发的实现方式:request.getRequestDispatcher("资源B的路径").forward(req,resp)

在请求转发之前,将数据存入到request域对象中,在转发过去的时候再从request对象中获取

可以实现转发多个资源数据共享

特点:浏览器的地址栏路径并不会发生变化、只能转发到当前的服务器内部资源

Response响应对象

response重定向

重定向:一种资源跳转的方式

(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求

(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径

(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫==重定向==

重定向的实现

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

简化方式:

resposne.sendRedirect("/request-demo/resp2")

重定向的路径选择

规则:

1.浏览器:需要加虚拟目录,就是项目访问的路径

2.服务器端:不需要添加虚拟目录

特点:

浏览器的地址栏路径会发生变化,因为重定向发生时候会发送两次请求,所以地址会发生变化

重定向动态添加虚拟目录

//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/servlet路径");

Response响应字符数据

通过Response对象获取字符输出流:response.getWriter();

设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");

再通过字符输出流写数据:write("");

一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流

Response响应字节数据

获取字节输出流:response.getOutputStream()

通过字节流写数据:write(字节数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值