简单了解request与response
本文对 request、 response 简单描述,未涉及到具体的浏览器缓存、重定向、请求转发等代码部分。
一、Web服务器,浏览器,代理服务器
在看 response、request 对象之前,先来了解一下 Web服务器,浏览器,代理服务器 三者之间的关系。
当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?
实际上我们输入 URL 后,我们的浏览器给Web服务器发送了一个 Request, Web 服务器接到Request 后进行处理,生成相应的 Response,然后发送给浏览器, 浏览器解析 Response 中的 HTML,这样我们就看到了网页,过程如下图所示:

我们的 Request 有可能是经过了代理服务器,最后才到达 Web 服务器的。
过程如下图所示:

代理服务器就是网络信息的中转站,有什么功能呢?
提高访问速度, 大多数的代理服务器都有缓存功能。
突破限制, 也就是FQ了
隐藏身份。
二、再回过头看 response、request 对象
Tomcat(Web应用服务器) 收到客户端的 http 请求,会针对每一次请求,分别创建一个代表请求的 request 对象、和代表响应的 response 对象。
如上,我们想拿到用户发送过来的数据,只需要找到 request 对象;而响应用户请求,则找 response 对象。

我们在程序中经常看到如下两个对象,这就是我们要找的 request、response
2.1 HttpServletResponse
HttpServletResponse 封装了 response 对象,通过该对象实现向浏览器输出数据,实现交互。
2.1.1 常见方法:
addCookie(Cookie cookie) 向客户端写入Cookie
addHeader(Java.lang.String name, java.lang.String value) 写入给定的响应头
encodeURL(java.lang.Stringurl) 默认cookie中包含Session ID,如果客户端不支持 Cookie,就在参数 url 中加入 Session ID 信息,可以解决用户禁用cookie的问题。
setStatus(intsc) 设置响应的状态码。
2.1.2 实现向浏览器输出
HttpServletResponse 实现向用户输出数据的方法:getOutputStream 和 getWriter方法
getOutputStream 和 getWriter 方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream 和 getWriter 这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
getOutputStream() 方法例子:
调用 getOutputStream() 方法获得 ServletOutputStream 流,再使用 print() 或 write() 向浏览器输出数据。试验一下:
//获取到OutputStream流
ServletOutputStream servletOutputStream = response.getOutputStream();
//向浏览器输出数据
servletOutputStream.print("niceyoo");
效果如下:

getWriter() 方法例子:
//获取到printWriter对象
PrintWriter printWriter = response.getWriter();
printWriter.write("niceyoo-getWriter");
效果如下:

2.1.3 实现重定向
重定向指的是一个web资源收到客户端请求后,web服务器通知客户端去访问另外一个web资源,这称之为请求重定向。实现方式是调用response.sendRedirect()方法。实现的原理就是给客户端返回了302状态码和location头。
2.2 HttpServletRequest
HttpServletRequest 封装了 request对象,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。
2.2.1 常见方法:
获得客户端的信息:
getRequestURL 方法返回客户端发出请求时的完整URL。
getRequestURI 方法返回请求行中的资源名部分,去掉主机名的部分。
getRemoteAddr 方法返回发出请求的客户机的IP地址
getRemoteHost 方法返回发出请求的客户机的完整主机名
getRemotePort 方法返回客户机所使用的端口号
getLocalAddr 方法返回WEB服务器的IP地址。
getLocalName 方法返回WEB服务器的主机名
getMethod 得到客户机请求方式,如GET,POST
--
获得请求头的方法:
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
--
获得请求参数:
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
2.2.2 实现转发
请求转发指一个 web 资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。request 对象提供了一个 getRequestDispatcher 方法,该方法返回一个RequestDispatcher 对象,调用这个对象的 forward 方法可以实现请求转发。
2.2.3 request域
request 对象同时也是一个域对象,我们通过 request 对象在实现转发时,可以把数据通过request 对象带给其它web资源处理。
下面是常用的一些对域中的属性的操作的方法:
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
2.2.4 Request的getParameter和getAttribute方法
由于 request 也是一个域对象,所以既可以从它获得参数,即 Parameter。也可以获得域中的属性。但是他们的意义是完全不一样的。
getParameter(String name):获得客户端传送给服务器的参数值,该参数是由 name 指定的,通常是表单中的参数。而且参数只能是字符串形式的键值对。
getAttribute(String name):返回有name 指定的属性值,如果指定的属性值不存在,则会返回一个null值。这里存放的也是一个键值对,不同的是,这里的值可以是任意的类型。
三、总结
Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象、和代表响应的 response 对象。
也就是一次请求生成一个 request 和 response,如果客户端和服务器握手结束,request 和 response 则是一起随着握手的消失而消失。
在程序中,与浏览器交互是通过 request、response 这连个对象进行的,request 封装了用户的请求数据,response 则用于向浏览器输出数据。
如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

简单了解request与response的更多相关文章
- JSP Servlet中的Request和Response的简单研究
本文参考了几篇文章所得,参考目录如下: 1.http://www.cnblogs.com/guangshan/p/4198418.html 2.http://www.iteye.com/problem ...
- charles常用功能 request和response(简单的操作)
先介绍一个修改request请求参数值的方法吧 第一步: 拷贝完成后还需要配置一下: 先添加一个: 然后下一步: 最后点击OK,就可以开始操作request和response数据了 先修改reques ...
- request 和response
当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...
- Java 中的 request 和response 理解
request和response(请求和响应) 1.当Web容器收到客户端的发送过来http请求,会针对每一次请求,分别创建一个用于代表此次请求的HttpServletRequest对象(reque ...
- [Rails] 从 Request 到 Response(2)
本文翻译自:Rails from Request to Response 系列:个人选择了自己感兴趣的部分进行翻译,需要阅读原文的同学请戳前面的链接. 第二部分 路由(Routing) Blog::A ...
- [Rails] 从 Request 到 Response(1)
本文翻译自:Rails from Request to Response 系列:个人选择了自己感兴趣的部分进行翻译,需要阅读原文的同学请戳前面的链接. 第一部分 导言(Introduction) 服务 ...
- JavaWeb(一)Servlet中的request与response
一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...
- Request和Response的格式
Request和Response的格式 Request格式: HTTP请求行 (请求)头 空行 可选的消息体 注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回 ...
- java web(四):request、response一些用法和文件的上传和下载
上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...
随机推荐
- hash与encrypt
概括来说,哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可逆的密文. 具体来说,两者有如下重要区别: ...
- 如何连接LINUX服务器
1.WINDOW下连接 使用PUTTY连接,链接如下:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 下载安装后打开,运行 ...
- jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年(最新亲测可用)
破解补丁激活 之前看了好多的其它的方法感觉都不是很靠谱还是这个本人亲试可以长期有效不仅能激活pycharm.jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年 ...
- pta编程总结1
7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...
- Python学习计划
---恢复内容开始--- Python学习计划 https://edu.csdn.net/topic/python2?utm_source=blog4 匠人之心,成就真正Python全栈工程师 ...
- php扩展打开不起作用的原因, php数字显示2147483647的原因
因为公司订单id类型是bigint, 而PHP32位最大整数是2147483647 . 所以需要重新下载PHP64位. laravel总是报错 Call to undefined function I ...
- 前端技术之--CSS
在标签上设置style属性: background-color: #2459a2; height: 48px; ... 编写css样式: 1. 标签的style属性 2. 写在head里面 style ...
- 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...
- base和this的用法
[意义] this:指当前类,this调用当前类的属性,方法,包括构造函数的方法,继承本类的构造函数 base:指当前类的父类,可调用父类的非私有属性,方法,继承父类的构造函数括号里的参数 [用处] ...
- Leetcode 记录(201~300)
实习面试前再完成100题,争取能匀速解释清楚题 204. Count Primes 素数筛 class Solution { public: int countPrimes(int n) { ) ; ...