1、Http响应
1.1、响应消息
响应消息:服务器发送给客户端的数据
数据格式:(1)、响应行 (2)、响应头 (3)、响应空行 (4)、响应体
1.2、响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法
5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
1.3、响应头
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
1.3、 响应空行
1.4、 响应体:传输的数据
2、Response对象
1. 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2. 设置响应头:setHeader(String name, String value)
3. 设置响应体:
* 使用步骤:
1. 获取输出流
* 字符输出流:PrintWriter getWriter()
* 字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
3、案例
3.1、重定向案例
传统的写法:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("this is responseServlet1....");
//1、设置响应行 状态码为302 表示重定向
response.setStatus(302);
//2、设置响应头 地址为B地址
response.setHeader("location","/web/responseServlet2");
}
改进的写法:使用sendRedirect即可
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("this is responseServlet1....");
response.sendRedirect("/web/responseServlet2");
}
3.1.1 重定向的特点:
- 地址栏发生改变
- 可以请求其它站点(服务器)的资源
- 重定向是2次请求,不能通过request对象来共享数据
3.1.2 转发的特点:
- 地址栏没有发生改变
- 只能请求服务器内的地址
- 转发是1次请求,可以使用request对象来共享数据
3.1.3 面试题:forward和redirect的区别
forward:转发,特点为(1)、地址栏不变 (2)、只能访问当前服务器内的地址 (3)、转发只有1次请求
redirect:重定向, 特点为 (1)、地址栏发生改变 (2)、可以访问其它站点(服务器)的资源 (3)、重定向有2次请求
3.1.4 路径的写法
1. 相对路径:通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录,如果是当前目录也可以不写./
* ../:后退一级目录
2. 绝对路径:通过绝对路径可以确定唯一资源
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
* 以/开头的路径
* 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/responseServlet2");
* <a> , <form> 重定向... response.sendRedirect("/web/responseServlet2");
* 给服务器使用:不需要加虚拟目录
* 转发路径 request.getRequestDispatcher("/successServlet").forward(request,response);
3.2、服务器输出字符数据到浏览器
要设置编码格式,告诉浏览器用改码解码
获取流之前设置
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你好....");
3.3、服务器输出字节数据到浏览器
要设置编码格式,告诉浏览器用改码解码
输出字节数据,一般以图片居多,文字的话,用字符数据来写居多
response.setContentType("text/html;charset=utf-8");
ServletOutputStream sos = response.getOutputStream();
sos.write("你好".getBytes("utf-8"));
3.4、验证码
4、ServletContext对象
4.1 获取对象
(1). 通过request对象获取
request.getServletContext();
(2). 通过HttpServlet获取
this.getServletContext();
5、会话
5.1 会话技术
1. 会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
5.2 Cookie
1. 概念:客户端会话技术,将数据保存到客户端
2. 快速入门:
* 使用步骤:
1. 创建Cookie对象,绑定数据
* new Cookie(String name, String value)
2. 发送Cookie对象
* response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
* Cookie[] request.getCookies()