在了解Request和Response对象之前,我们必须先明白HTTP中的请求报文和响应报文
HTTP中的请求信息
HTTP中的请求消息包含四部分,分别为:
- 请求行
请求方法 URL地址 HTTP/版本号
GET /FirstServlet HTTP/1.1
- 请求头
请求头名称:请求头值
请求信息例如:
Host: sp1.baidu.com
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62
sec-ch-ua-platform: "Windows"
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: https://www.baidu.com/?tn=02003390_43_hao_pg
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
- 请求空行
只是空了一行,用来标记请求头与请求体;
- 请求体
只有POST方法才有请求体,GET方法没有,请求体的形式是键值对的形式中间用=连接
HTTP中的响应信息
- 响应行
HTTP/版本 响应状态码 状态码描述
HTTP/2.0 200 OK
-
响应头
头名称:值
-
响应空行
-
响应体
一般是JSP网页信息
响应状态码:
1xx:信息性状态码,接收的请求正在处理
2xx:成功状态码,请求正常处理完毕
200 OK:表示从客户端发来的请求在服务器端被正常处理了。
204 No Content:该状态码代表服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分。
206 Partial Content:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的请求。响应报文中包含由Content-Range指定范围的实体内容。
3xx:重定向状态码,需要进行附加操作以完成请求
301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应该使用现在资源所指的URI。
302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。
303 See Other:该状态码表示由于请求对应的资源存在着另外一个URI,应使用GET方法定向获取请求的资源。
304 Not Modified:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后直接返回304。304状态码返回时,不包含任
何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。(附带条件的请求时指采用GET方法的请求报文中包含If-Match、If-Modified-Since、If-Range等
任一首部)
307 Temporary Redirect:临时重定向。该状态码与302 Found有着相同的含义。
4xx:客户端错误状态码,服务器无法处理请求
400 Bad Request:该状态码表示请求报文中存在语法错误。
401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
403 Forbidden:该状态码表明对请求资源的访问被服务器拒绝了。未获得文件系统的访问授权,访问权限出现某些问题等情况都可能发生403。
404 Not Found:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
5xx:服务端错误状态码,服务器处理请求出错
500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误,也有可能是Web应用存在的Bug或某些临时的故障。
503 Service Unavailable:该状态码表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。
HTTP中的请求方式
-
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
-
HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
-
GET:向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
-
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
-
PUT:向指定资源位置上传其最新内容
-
DELETE:请求服务器删除Request-URL所标识的资源
-
TRACE:回显服务器收到的请求,主要用于测试或诊断
-
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
其中最常用的只有两种:GET和POST
GET和POST的区别:
GET:
- GET的参数信息放在请求行中,位于URL地址的后侧
- GET相对不安全一点
- GET URL长度有限制
POST:
- POST的参数信息放在请求体中,以键值对中间以=分割的形式出现。
- POST相对安全一些
- POST URL长度没有限制
Request对象
Request和Response对象的原理
- ruquest和response对象都是由tomcat服务器创建的
- request对象是来获取请求消息的,response对象是来设置响应消息的
Request继承关系
ServletRequest 接口
HttpServletRequest 抽象类继承了ServletRequest接口
HttpServletRequest被tomcat的类:org.apache.catalina.connector.RequestFacde
实现,是在tomcat中生成的
Request中的方法
(加粗的为重点方法!)
获取请求行数据:
- 获取请求方式:
String getMethod()
- 获取虚拟目录:
String getContextPath()
- 获取Servlet路径:
String getServletPath()
- 获取get方式请求参数:
String getQueryString()
- 获取请求URI:
String getRequestURI()
StringBuffer getRequestURL()
- 获取协议及版本:
String getProtocol()
- 获取客户机的IP地址:
String getRemoteAddr()
获取请求头数据:
- 通过请求头的名称获取请求头的值:
String getHeader(String name)
- 获取所有的请求头名称:
Enumeration<String> getHeaderNames()
获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 取字符输入流,只能操作字符数据:
BufferedReader getReader()
- 获取字节输入流,可以操作所有类型数据:
ServletInputStream getInputStream()
获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
- 根据参数名称获取参数值:
String getParameter(String name)
(复选框只能返回一个值) - 根据参数名称获取参数值的数组:
String[] getParameterValues(String name)
(用于复选框,选择的结构,返回String数组) - 获取所有请求的参数名称:
Enumeration<String> getParameterNames()
- 获取所有参数的map集合:
Map<String,String[]> getParameterMap()
(返回泛型为String,String数组的键值对,防止复选框选择丢失的情况)
POST方式乱码问题:通过requeset.setCharacterEncoding("utf-8")
来设置防止乱码!!!
Request转发:一种在服务器内部资源跳转的方式
- 通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:
forward(ServletRequest request, ServletResponse response)
转发的特点:
- 浏览器地址不发生变化
- 只能转发到当前服务器内部资源
- 转发是一次请求
共享数据:
当转发发生的时候,通过共享数据可以实现两个Servlet共同访问这个数据,实现共享操作;
- 存储数据:
void setAttribute(String name,Object obj)
- 通过键获取值:
Object getAttitude(String name)
- 通过键移除键值对:
void removeAttribute(String name)
Response对象
Request和Response对象的原理
- ruquest和response对象都是由tomcat服务器创建的
- request对象是来获取请求消息的,response对象是来设置响应消息的
Response中的方法
设置响应行:
设置状态码:setStatus(intcho
设置响应头:setHeader(String name, String value)
设置响应体:
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
重定向
重定向是由servlet的response发起,由浏览器执行的页面跳转操作。首先由response设置状态码302标志重定向之后再告诉浏览器重定向的路径完成重定向。
可以通过设置状态码response.setStatus(302)
之后再设置响应头location来实现response.setHeader("location","/LoginServlet")
还有一种简便方法可以实现重定向:response.sendRedirect("/LoginServlet")
直接输路径就可以了
转发和重定向的区别:
重定向的特点:
- 地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求,不能使用request共享数据
转发的特点:
- 地址栏不发生变化
- 转发不能访问其他站点的资源只能访问本地服务器的资源
- 转发是一次请求,可以使用request共享数据
感谢您的阅读,如果本篇文章对您有帮助,欢迎点赞,关注,您的阅读是我莫大的鼓励!