request
在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求头和请求体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求体的相关方法.
request作用
- 操作请求三部分(行,头,体)
- 请求转发 页面 | servlet
- 作为域对象存取数据
1、操作请求行
返回值类型 | 方法声明 | 描述 |
String | getMethod() | 该方法用于获取 HTTP 请求方式(如 GET、POST 等)。 |
String | getRequestURI() | 该方法用于获取请求行中的资源名称部分,即位于 URL 的主机和端口之后,参数部分之前的部分。 |
String | getQueryString() | 该方法用于获取请求行中的参数部分,也就是 URL 中“?”以后的所有内容。 |
String | getContextPath() | 返回当前 Servlet 所在的应用的名字(上下文)。对于默认(ROOT)上下文中的 Servlet,此方法返回空字符串""。 |
String | getServletPath() | 该方法用于获取 Servlet 所映射的路径。 |
String | getRemoteAddr() | 该方法用于获取客户端的 IP 地址。 |
String | getRemoteHost() | 该方法用于获取客户端的完整主机名,如果无法解析出客户机的完整主机名,则该方法将会返回客户端的 IP 地址。 |
2、操作请求头
返回值类型 | 方法声明 | 描述 |
String | getHeader(String name) | 该方法用于获取一个指定头字段的值。 如果请求消息中包含多个指定名称的头字段,则该方法返回其中第一个头字段的值。 |
Enumeration | getHeaders(String name) | 该方法返回指定头字段的所有值的枚举集合, 在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次。 |
Enumeration | getHeaderNames() | 该方法返回请求头中所有头字段的枚举集合。 |
String | getContentType() | 该方法用于获取 Content-Type 头字段的值。 |
int | getContentLength() | 该方法用于获取 Content-Length 头字段的值 。 |
String | getCharacterEncoding() | 该方法用于返回请求消息的字符集编码 。 |
3、操作请求体
返回值类型 | 方法声明 | 功能描述 |
String | getParameter(String name) | 返回指定参数名的参数值。 |
String [ ] | getParameterValues (String name) | 以字符串数组的形式返回指定参数名的所有参数值(HTTP 请求中可以有多个相同参数名的参数)。 |
Enumeration | getParameterNames() | 以枚举集合的形式返回请求中所有参数名。 |
Map | getParameterMap() | 用于将请求中的所有参数名和参数值装入一个 Map 对象中返回。 |
response
在Servlet API中,定义了一个HttpServletResponse接口(doGet,doPost方法的参数),它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为响应行、响应头、响应体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应头、响应体的方法.
response作用
操作响应的三部分(行, 头, 体)
1、操作响应行
返回值类型 | 方法声明 | 功能描述 |
void | setStatus(int code) | 返回指定的响应状态码。 |
常用的状态码:
200:成功
302:重定向 ,重新定位方向
304:访问缓存,告诉浏览器,缓存就是最新的内容。
404:客户端错误
500:服务器错误
2、操作响应头
方法声明 | 功能描述 |
setHeader(String key,String value) | 设置字符串形式的响应头 |
setIntHeader(String key,int value) | 设值整形的响应头 |
setDateHeader(String key,long value) | 设值时间的响应头 |
addHeader(String key,String value) | 添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置 |
addIntHeader(String key,int value): | 添加整形的响应头 |
addDateHeader(String key,long value): | 添加时间的响应头 |
常用方法:setHeader(String name,String value);
常用的响应头
Refresh:定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx) ,可以跳资源(网页|servlet)
Content-Disposition: 告诉浏览器现在打开的下载
Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)
例:
1、定时刷新
response.setHeader(“Refresh”,“秒数;url=跳转的路径”); //几秒之后跳转到指定的路径上定时刷新
2、重定向跳转
response.setHeader(“Location”, “register.html”); //重定向的路径(绝对路径,带域名/ip地址的,如果是同一个项目里面的,域名/ip地址可以省略)
常用方法: sendRedirect(String location)
重定向 response.sendRedirect(“重定向的路径”)
重定向两次请求,重定向的地址栏路径改变
例:
1、跳转HTML页面
response.sendRedirect(“register.html”);
2、跳转外面的公网资源
response.sendRedirect(“http://www.baidu.com”);
转发和重定向区别【面试】
1. 转发是一次请求, 重定向是二次请求
2. 转发的路径不会改变,重定向的路径会改变
3. 转发只能转发到项目的内部资源,重定向可以重定向到项目的内部资源, 也可以是项目外部资源(eg:百度)
4. 转发可以转发到WEB-INF下面的资源, 重定向不可以重定向到WEB-INF下面的资源
5. 把数据存到request里面,转发有效, 重定向无效
6. 转发的路径写相对的(不带http,不带ip,不带项目名), 重定向的路径写绝对的(带http,带ip,带项目名)
3、操作响应体
返回值类型 | 方法声明 | 功能描述 |
PrintWriter | getWrite() | 用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文 |
ServletOutputStream | getOuputStream() | 用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文 |
操作响应体
getWrite()
1、会有乱码,需要设置 resp.setContentType(“text/html;charset=utf-8”);
2、可以写标签,浏览器可以认识的。
getOuputStream
1、不会有乱码,默认采用的是GBK编码,浏览器也认识。
2、不能识别标签
不能同时使用这两种来写数据。
页面输出只能使用其中的一个流实现,两个流是互斥的.
只是针对取值,也就是从浏览器传递过来的数据里面取出来中文乱码的解决办法
req.setCharacterEncoding("utf-8");