Response响应
【Request对象回顾 (opens new window)】
# 1.Http响应消息
响应消息:服务器端发送给客户端的数据
数据格式:
响应行
响应头
响应空行
响应体
响应字符串格式
HTTP/1.1
200
OK
Content-Type:text/html;charset=UTF-8
Content-Length:101
Date:Wed,06 Jun 2019 07:08:42 GMT
<html>
<head>
<title>Servlet</title>
</head>
<body>
<h1>Hello Servlet</h1>
</body>
</html>
2
3
4
5
6
7
8
# 响应行
1.组成:协议/版本响应状态码状态码描述
2.响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
- 状态码都是3位数字
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。
HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1xx | 服务器收到客户端请求,需要请求者继续执行操作,发送1xx状态码 |
2xx | 成功,操作被成功接收并处理 |
3xx | 重定向,需要进一步的操作以完成请求 |
4xx | 客户端错误,请求路径没有对应的资源 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
代表:
- 404(请求路径没有对应的资源)
- 405:请求方式没有对应的
doXxx
方法 - 500:服务器错误,服务器在处理请求的过程中发生了错误
菜鸟教程:HTTP状态码 (opens new window)
# 响应头
1.格式:
头名称:值
2.常见的响应头:
Content-Type:服务器告诉客户端本次响应体数据格式,以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- n-line:默认值,在当前页面内打开
- attachment;filename=xxx:以附件形式打开响应体,文件下载
# 响应空行
起分隔作用
# 响应体
服务器给客户端传输的的数据
# 2.Response对象
Response功能:设置响应消息
设置响应行
格式:HTTP/1.1
200
OK
设置状态码
setStatus(int sc)
设置响应头
setHeader(string name,string value)
设置响应体
1.获取输出流
字符输出流:
Printuriter getwriter()
字节输出流:``Servletoutputstream getoutputstream()`
2.使用输出流,将数据输出到客户端浏览器
# 重定向
1. 重定向Demo
Tomcat虚拟路径设置/ServletResponse
ServletRedirect
package com.iqqcode.web.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: Mr.Q
* @Date: 2020-02-11 20:57
* @Description:重定向
* 访问ServletRedirect会自动跳转到ServletRedirect_Test
*/
@WebServlet("/ServletRedirect")
public class ServletRedirect extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.setCharacterEncoding("UTF-8");
System.out.println("访问ServletRedirect...");
//1.设置状态码为302
//response.setStatus(302);
//2.设置头为location
//response.setHeader("location","/ServletRedirect_Test");
//动态获取虚拟目录
String contextPath = request.getContextPath();
//简单的重定向方法
response.sendRedirect(contextPath + "ServletRedirect_Test");
//共享数据测试
request.setAttribute("msg","Test response");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request, response);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
ServletRedirect_Test
package com.iqqcode.web.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: Mr.Q
* @Date: 2020-02-11 20:57
* @Description:重定向
*/
@WebServlet("/ServletRedirect_Test")
public class ServletRedirect_Test extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.setCharacterEncoding("UTF-8");
System.out.println("访问ServletRedirect_Test...");
//共享数据测试
Object object = request.getAttribute("msg");
System.out.println(object);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request, response);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2. 重定向的特点
forward 和 redirect 区别
重定向(redirect ):
- 地址栏==发生==变化(自动跳转到重定向的资源路径)
- 重定向可以访问==其他==站点(服务器)的资源(自定义任意资源站点)
- 重定向是两次请求(不能使用request对象来共享数据)
请求转发的特点(forward ):
- 浏览器地址栏路径==不发生==变化(仍在当前请求路径)
- 只能转发到==当前==服务器内部资源中
- 转发是一次请求(请求范围是在一个request域中)
ServletRedirect
//共享数据测试 request.setAttribute("msg","Test response");
ServletRedirect_Test Object object = request.getAttribute("msg"); System.out.println(object);
不能使用request对象来共享数据,两次请求,为null
3.虚拟路径设置
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
- 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
- 建议虚拟目录动态获取:
request.getcontextPath()
- 建议虚拟目录动态获取:
- 给服务器使用:不需要加虚拟目录
- 转发路径
# 获取字符输出流
乱码产生原因:服务器和客户端编解码格式不一致
设置编码,防止中文乱码
(ISO-8859-1)设置流的默认编码为GBK
response.setCharacterEncoding("UTF-8");
告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=UTF-8");
简化形式设置编码
response.setContentType("text/html;charset=UTF-8");
1.获取字符输出流
PrintWriter out = response.getWriter();
2.输出数据
out.write("
你好 Response
");# 获取字节输出流
设置编码,防止中文乱码
response.setContentType("text/html;charset=UTF-8");
1.获取字节输出流
ServletOutputStream out = response.getOutputStream();
2.输出数据
out.write("