JAVA学习--Request Response

1. request:==获取==请求数据
● 浏览器会发送HTTP请求到后台服务器[Tomcat] ● HTTP的请求中会包含很多请求数据[请求行+请求头+请求体] ● 后台服务器
[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中 ● 所存入的对象即为request对象,所以我们可以从
request对象中获取请求的相关参数 ● 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关
业务
2. response:==设置==响应数据
● 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据 ● 把响应数据封装到response对象中 ● 后台服务器[Tomcat]
会解析response对象,按照[响应行+响应头+响应体]格式拼接结果 ● 浏览器最终解析结果,把内容展示在浏览器给用户浏览

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request对象 获取请求数据
String name = request.getParameter("name");//url?name=zhangsan
//使用response对象 设置响应数据
response.setHeader("content-type","text/html;charset=utf-8");
response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Post...");
}
}

3. Request对象
3.1 Request继承体系
[image]
​ ServletRequest和HttpServletRequest是继承关系,并且两个都是接口,接口是无法创建对象
​ 这个时候,我们就需要用到Request继承体系中的 RequestFacade : ● 该类实现了HttpServletRequest接口,也间接实现了
ServletRequest接口。 ● Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器[Tomcat]来调用的,所
以Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建 ● 要想了解RequestFacade中都提供了哪些方法,我们可以
直接查看JavaEE的API文档中关于ServletRequest和 HttpServletRequest的接口文档,因为RequestFacade实现了其接口就需要
重写接口中的方法
小结
● Request的继承体系为ServletRequest-->HttpServletRequest-->RequestFacade ● Tomcat需要解析请求数据,封装为request
对象,并且创建request对象传递到service方法 ● 使用request对象,可以查阅JavaEE API文档的HttpServletRequest
3.2 Request获取请求数据
​ HTTP请求数据总共分为三部分内容,分别是==请求行、请求头、请求体==,对于这三部分内容的数据,分别该如何获取,首先
我们先来学习请求行数据如何获取?
3.2.1 获取请求行数据
​ 请求行包含三块内容,分别是 请求方式 、 请求资源路径 、 HTTP协议及版本
对于这三部分内容,request对象都提供了对应的API方法来获取,具体如下: ● 获取请求方式: GET String getMethod() ● 获取虚
拟目录(项目访问路径): /request-demo String getContextPath() ● 获取URL(统一资源定位符): http://localhost:8080/request-
demo/req1 StringBuffer getRequestURL() ● 获取URI(统一资源标识符): /request-demo/req1 String getRequestURI() ● 获取请求
参数(GET方式): username=zhangsan&password=123 String getQueryString()
3.2.2 获取请求头数据
对于请求头的数据,格式为 key: value 如下:
所以根据请求头名称获取对应值的方法为:
String getHeader(String name)
3.2.3 获取请求体数据
​ 浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,请求体中的数据格式如下:
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是: ● 获取字节输入流,如果前端发送的是字节
数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
● 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
==注意== BufferedReader流是通过request对象来获取的,当请求完成后request对象就会被销毁,request对象被销毁后,
BufferedReader 流就会自动关闭,所以此处就不需要手动关闭流了。
小结
​ HTTP请求数据中包含了 请求行 、 请求头 和 请求体 ,针对这三部分内容,Request对象都提供了对应的API方法来获取对应的
值: ● 请求行 ● getMethod()获取请求方式 ● getContextPath()获取项目访问路径 ● getRequestURL()获取请求URL ●
getRequestURI()获取请求URI ● getQueryString()获取GET请求方式的请求参数 ● 请求头 ● getHeader(String name)根据请求头
名称获取其对应的值 ● 请求体 ● 注意: ==浏览器发送的POST请求才有请求体== ● 如果是纯文本数据:getReader() ● 如果是字节
数据如文件数据:getInputStream()
3.2.4 获取请求参数的通用方式
1.什么是请求参数? 为了能更好的回答上述两个问题,我们拿用户登录的例子来说明: 1.1 想要登录网址,需要进入登录页面 1.2
在登录页面输入用户名和密码 1.3 将用户名和密码提交到后台 1.4 后台校验用户名和密码是否正确 1.5 如果正确,则正常登录,
如果不正确,则提示用户名或密码错误 上述例子中,用户名和密码其实就是我们所说的请求参数。
2.什么是请求数据? 请求数据则是包含请求行、请求头和请求体的所有数据
3.请求参数和请求数据的关系是什么? 3.1 请求参数是请求数据中的部分内容 3.2 如果是GET请求,请求参数在请求行中 3.3 如果
是POST请求,请求参数一般在请求体中 对于请求参数的获取,常用的有以下两种:
GET方式:
String getQueryString()
POST方式:
BufferedReader getReader();
3.3请求参数中文乱码问题
3.3.1中文乱码解决方案
● POST请求和GET请求的参数中如果有中文,后台接收数据就会出现中文乱码问题 GET请求在Tomcat8.0以后的版本就不会出
现了 ● POST请求解决方案是:设置输入流的编码
request.setCharacterEncoding("UTF-8");
注意:设置的字符集要和页面保持一致
通用方式(GET/POST):需要先解码,再编码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
3.3.2 URL编码实现方式:
● 编码:
URLEncoder.encode(str,"UTF-8");
● 解码:
URLDecoder.decode(s,"ISO-8859-1");
3.4 Request请求转发
3.4.1 请求转发的实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
3.4.2需要使用request对象提供的三个方法:
● 存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
根据key获取值
Object getAttribute(String name);
根据key删除该键值对
void removeAttribute(String name);
3.4.3请求转发的特点
● 浏览器地址栏路径不发生变化 虽然后台从 /req5 转发到 /req6 ,但是浏览器的地址一直是 /req5 ,未发生变化 ● 只能转发到当前
服务器的内部资源 不能从一个服务器通过转发访问另一台服务器 ● 一次请求,可以在转发资源间使用request共享数据 虽然后台
从 /req5 转发到 /req6 ,但是这个只有一次请求
4. Response对象
● Request:使用request对象来-->获取-->请求数据 ● Response:使用response对象来-->设置-->响应数据
4.1 Response设置响应数据功能介绍
1 . 1.1响应行
对于响应头,比较常用的就是设置响应状态码:
void setStatus(int sc);
4.1.2响应头
设置响应头键值对:
void setHeader(String name,String value);
4.1.3响应体
对于响应体,是通过字符、字节输出流的方式往浏览器写, 获取字符输出流:
PrintWriter getWriter();
获取字节输出流
ServletOutputStream getOutputStream();
4.2 Respones请求重定向
4.2.1 重定向的实现方式:
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
4.2.2
4.3路径问题
●浏览器使用:需要加虚拟目录(项目访问路径) ● 服务端使用:不需要加虚拟目录 对于转发来说,因为是在**服务端**进行的,所以
不需要加虚拟目录 对于重定向来说,路径最终是由浏览器来发送请求,就需要添加虚拟目录。
4.4 Response响应字符数据
要想将字符数据写回到浏览器,我们需要两个步骤: ● 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();
● 通过字符输出流写数据: writer.write("aaa");
4.5 Response响应字节数据
要想将字节数据写回到浏览器,我们需要两个步骤: ● 通过Response对象获取字节输出流:ServletOutputStream outputStream
= resp.getOutputStream(); ● 通过字节输出流写数据: outputStream.write(字节数据);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值