HTTP的详细知识点(Response)
响应的三个组成部分
HTTP响应由哪三个组成部分
什么是HTTP响应
由服务器端发送给浏览器(客户端)的所有的数据,称为响应Response。
数据准备
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
响应信息的三个组成
响应行(状态行),响应头,响应体
响应体由两种类型的数据:字符数据和字节数据
响应行、响应头、响应体
- 响应行的格式
- 响应头的格式
- 响应体的格式
响应行
组成:由三个部分组成
HTTP/1.1 200 OK
协议和版本 状态码 状态信息
响应头
响应体
文本:字符的数据,如:text,html,json,xml
图片:字节的数据,还可以是下载的文件,音乐,视频
小结:响应的组成
响应对象的方法:与状态行有关
与响应行有关的方法
什么是HttpServletResponse对象
-
由谁提供实现类:由Web容器,就是tomcat
-
由谁创建此对象:由Web容器
设置状态码的方法(了解)
演示代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
与响应行有关的方法
*/
@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//多态:父类的声明,子类的对象
System.out.println("请求对象:" + request);
System.out.println("响应对象:" + response);
//设置状态码
//response.setStatus(500);
//与错误有关的状态码可以使用这个方法,在网页上会有web容器发送的错误信息
//response.sendError(404);
//如果需要更详细的信息,可以使用这个方法的重载
response.sendError(404,"你吃了吗?");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
状态码的方法 | 描述 |
---|---|
setStatus(int status) | 设置状态码 |
sendError(int sc) | 发送错误码 |
常见的状态码
- 响应行中常见状态码的含义
- 404与405出现的原因
常见状态码的含义
200
服务器正常响应
302
表示页面的跳转
304
表示页面使用了缓存
404
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
与响应行有关的方法
*/
@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//多态:父类的声明,子类的对象
System.out.println("请求对象:" + request);
System.out.println("响应对象:" + response);
//设置状态码
//response.setStatus(500);
//与错误有关的状态码可以使用这个方法,在网页上会有web容器发送的错误信息
//response.sendError(404);
//如果需要更详细的信息,可以使用这个方法的重载
//response.sendError(404,"你吃了吗?");
/* response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("服务器的响应");*/
System.out.println(100 / 0); //出现异常
response.sendRedirect("01_login.htm");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
状态码 | 含义 |
---|---|
200 | 正常响应 |
302 | 页面跳转 |
304 | 使用缓存 |
404 | 找不到页面 |
405 | 没有doGet或doPost处理方法 |
500 | 服务器内部错误 |
响应对象:响应头相关方法
- 学习响应头相关的方法
- 案例:过3秒跳转到其它页面
响应头的方法
案例:设置响应头过3秒跳转
步骤
-
创建Demo2RefreshServlet
-
调用setHeader,设置消息头(“Refresh”,“3;url=http://www.itcast.cn”)
-
调用setStatus,设置响应状态码200。(可选的代码)
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "Demo2RefreshServlet", urlPatterns = "/demo2")
public class Demo2RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//调用setHeader,设置消息头("Refresh","3;url=http://www.baidu.com")
response.setHeader("refresh", "3;url=http://www.itcast.cn");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("过3秒跳转到login");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "Demo3LocationServlet", urlPatterns = "/demo3")
public class Demo3LocationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置location的响应头,实现页面跳转
//response.setHeader("location","01_login.html");
//设置302的状态码
//response.setStatus(302);
System.out.println("使用重定向的方法");
response.sendRedirect("01_login.html");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
响应头的方法 | 描述 |
---|---|
void setHeader(String name, String value) | 设置指定的响应头和它的值 |
void setContentType(String type) | 相当于: response.setHeader(“content-type”,“text/html;charset=utf-8”); |
响应体:处理响应乱码的问题
- 响应体数据的两种方式:字节流和字符流
- 处理汉字乱码的问题
响应体的两种数据
- 字节流 OutputStream
- 字符流 Writer
打印流的一些疑问
-
直接使用打印输出流,输出汉字的结果是什么?
乱码,为什么会有乱码
-
如何设置打印流默认的字符集?
response.setCharacterEncoding("编码") 但浏览器不知道服务器使用的是什么编码
-
只设置content-type响应头会怎么样?
response.setContentType("text/html;charset=utf-8"); 就可以解决响应的乱码问题
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
响应中汉字乱码的问题
*/
@WebServlet(name = "Demo4Servlet", urlPatterns = "/demo4")
public class Demo4Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1. 告诉浏览器服务器使用的编码是utf-8
2. 设置了打印流的字符集
*/
response.setContentType("text/html;charset=utf-8");
//需要设置响应的编码
//response.setCharacterEncoding("utf-8");
//得到打印流
PrintWriter out = response.getWriter();
out.print("我们是好朋友");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
如何得到ServletContext对象
如何得到上下文对象
什么是ServletContext
概念:定义Servlet与其Servlet容器(tomcat)通信的一组方法。对于每个Java虚拟机,每个“web应用程序”都有一个上下文。上下文是web程序启动的时候创建,web程序关闭的时候销毁。
**### 主要作用
- 用来得到Web目录和它子目录下的资源**
- 上下文域也是一个作用域对象
得到上下文域的方法
Servlet的继承结构
得到ServletContext的代码
package com.itheima.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到ServletContext对象
ServletContext application = getServletContext(); //调用自己的方法
System.out.println("上下文对象:" + application);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}