Response对象
Servlet、Tomcat基础知识点,仅供参考
19年黑马JavaWeb
课程的笔记
Response对象
HTTP响应消息数据格式
HTTP请求消息是客户端发送给服务器端的数据,HTTP响应消息是服务器端发送给客户端的数据。
一般响应消息的格式如下:
1 | 200 OK |
正如HTTP请求消息一样,HTTP响应消息也有响应行、响应头、响应空行和响应体!
响应行
响应行数据就是HTTP响应数据的第一行,响应行数据格式如下:
1 | 协议/版本 响应状态码 状态码描述 |
如:
1 | 200 OK |
1 | 协议/版本:HTTP/1.1 |
响应状态码
响应状态码是服务器告诉客户端浏览器本次请求和响应的一个状态。状态码都是3位数字,可以分为:
1xx
:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx
多状态码2xx
:成功。代表:200
(成功)3xx
:重定向。代表:302(重定向),304(访问缓存)4xx
:客户端错误。代表:404
(请求路径没有对应的资源) ,405
:请求方式没有对应的doXxx()
5xx
:服务器端错误。代表:500(服务器内部出现异常)
其中常见的状态码(响应信息):
1XX:
100(Continue)
:服务器就饿瘦客户端消息,但没有接收完成,应该让客户端继续其请求,等待一段时间之后,发送100多状态码询问客户端是否还有数据。101(Switching Protocols)
:切换协议,服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
2XX:
200(OK)
:请求成功。一般用于GET与POST请求201(Created)
:已创建。成功请求并创建了新的资源202(Accepted)
: 已接受。已经接受请求,但未处理完成203(Non-Authoritative Information)
:非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本204(No Content)
:无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档205(Reset Content)
:重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域206(Partial Content)
:部分内容。服务器成功处理了部分GET请求
3XX:
300(Multiple Choices)
:多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择301(Moved Permanently)
:永久重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替302(Found)
:临时重定向。与301类似。但资源只是临时被移动。客户端应继续使用(显示)原有URI303(See Other)
:查看其它地址。与301类似。使用GET和POST请求查看304(Not Modified)
:未修改。客户端通常会缓存访问过的资源,服务器返回此状态码时,说明所请求的资源未修改,不会返回任何新的资源。客户端接收到该状态码时将会从缓存下来的所有访问过的资源中寻找特定资源。305(Use Proxy)
:使用代理。所请求的资源必须通过代理访问307( Temporary Redirect)
:临时重定向。与302类似。使用GET请求重定向
4XX:
400(Bad Request)
: 客户端请求的语法错误,服务器无法理解401(Unauthorized)
:请求要求用户的身份认证402(Payment Required)
:保留,将来使用403(Forbidden)
: 服务器理解请求客户端的请求,但是拒绝执行此请求404(Not Found)
:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面405(Method Not Allowed)
:客户端请求中的方法被禁止406(Not Acceptable)
:服务器无法根据客户端请求的内容特性完成请求407(Proxy Authentication Required)
:请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权408(Request Time-out)
:服务器等待客户端发送的请求时间过长,超时409(Conflict)
:服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突410(Gone)
:客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置411(Length Required)
: 服务器无法处理客户端发送的不带Content-Length的请求信息412(Precondition Failed)
:客户端请求信息的先决条件错误413(Request Entity Too Large)
:由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息414(Request-URI Too Large)
:请求的URI过长(URI通常为网址),服务器无法处理415(Unsupported Media Type)
:服务器无法处理请求附带的媒体格式416(Requested range not satisfiable)
:客户端请求的范围无效417(Expectation Failed)
:服务器无法满足Expect的请求头信息
5XX:
500(Internal Server Error)
:服务器内部错误,无法完成请求501(Not Implemented)
:服务器不支持请求的功能,无法完成请求502(Bad Gateway)
:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应503(Service Unavailable)
:由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中504(Gateway Time-out)
:充当网关或代理的服务器,未及时从远端服务器获取请求505(HTTP Version not supported)
:服务器不支持请求的HTTP协议的版本,无法完成处理
响应头
响应头的格式一般如下:
1 | text/html;charset=UTF-8 : |
一般以键值的形式存在,其中有几个常见的:
Content-Type
:服务器告诉客户端本次响应体数据格式以及编码格式,如:text/html;charset=utf-8
Content-disposition
:服务器告诉客户端以什么格式打开响应体数据,有两个可选值:in-line
:默认值,在当前页面内打开attachment;filename=xxx
:以附件形式打开响应体。文件下载
Content-Length
:响应体数据的长度Date
:响应时间
响应空行
在响应头和响应体之间有一行空行,用于分割响应头和响应体
响应体
响应体为传输给客户端的数据,如:网页源代码,图片资源,下载的文件等等,上面的
1 | <html> |
就是响应体。
客户端在收到响应消息的时候,会获取该信息并进行缓存,如当请求:localhost/day15/helloResponse.html
的时候,服务器会发出一个响应,该响应中的响应体信息正如下:
1 | <html> |
客户端收到这个信息的时候,会缓存成一个helloResponse.html
,当再次请求的时候,如果网页没有改变,优先在使用本地的helloResponse.html
文件。
Response对象对HTTP响应消息的处理
响应行
获取状态码:getStatus()
设置状态码:setStatus()
响应头
设置响应头:setHeader(String name, String value)
获取响应头:
1 | Collection<String> getHeaders(String headName); |
响应体
如何写数据给响应体呢?一般按照如下步骤
获取输出流
输出流有两种:
- 字符输出流:
PrintWriter getWriter()
- 字节输出流:
ServletOutputStream getOutputStream()
使用输出流
就像使用Java的IO流一样使用输出流
Respons使用
实现重定向
首先需要先明确,客户端(浏览器)会自动响应Response对象中的设置,什么意思?比如当我们需要实现重定向的时候, 我们可以这样实现:
1 | response.setStatus(302); |
当我们这样设置response
对象的的时候,浏览器做响应之前,会解析response中的状态码,解析到302的时候会去找location响应头,然后进行解析重定向。
所以当我们需要客户端做一些动作的时候,我们可以通过设置响应头和响应状态码来实现。
实际上想要实现重定向还有一个简单的方法:
1 | response.sendRedirect("/day15/responseDemo"); |
该方法本质上也是调用上面的两个方法。tomcat
的API
对它进行了简化。
响应体数据乱码问题
上文所说,当我们需要往响应体中写数据时,可以使用这两个方法获取流:
1 | PrintWriter getWriter() |
但是在客户端进行解析的时候,由于PrintWriter pw = response.getWriter();
获取的流的默认编码是ISO-8859-1
,所以你懂的,乱码问题在所难免。
解决的方法也很简单,设置响应头:ContentType
,设置编码,是在获取流之前设置。
1 | response.setContentType("text/html;charset=utf-8"); |
重定向和请求转发的区别
重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
路径写法
路径写法:
1. 路径分类
1. 相对路径:通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录
* ../:后退一级目录
2. 绝对路径:通过绝对路径可以确定唯一资源
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
* 以/开头的路径
* 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form> 重定向...
* 给服务器使用:不需要加虚拟目录
* 转发路径