个人博客网: https://wushaopei.github.io/ (你想要这里多有)
1、Http协议
1.1 什么是HTTP协议
什么是协议?
双方相互约定好,都需要遵守的规则。叫协议。
http协议:客户端和服务器之间通知走的是http协议。
那么这个协议指的是客户端发送数据给服务器和服务器回传数据给客户端,这个数据需要遵守的数据格式。
http报文 ,所谓报文就是发送的数据。
1.2 请求的HTTP协议格式
- GET请求
(1)请求行
1.1请求的方式GET
1.2请求的资源地址?参数
1.3请求的协议和版本号 HTTP/1.1
(2)请求头
- POST请求
(1)请求行
1.1请求的方式POST
1.2请求的资源地址
1.3请求的协议和版本号 HTTP/1.1
(2)请求头
空行
(3)请求体
在谷歌浏览器下如何查看HTTP协议
火狐浏览器如何查看HTTP协议内容:
GET请求HTTP协议分为两部分:
请求行
1 请求的方式GET
2 请求的资源?参数
3 请求的协议和版本号 HTTP/1.1
请求头
POST请求的HTTP协议分为三部分:
请求行
1 请求的方式POST
2 请求的资源
3 请求的协议和版本号 HTTP/1.1
请求头
空行
请求体
常用请求头的说明
Accept: 告诉服务器客户端可以接收的数据类型
Accept-Language: 告诉服务器客户端希望接收的语言
Host: 告诉服务器。客户端请求的服务器IP和端口号
User-Agent: 告诉服务器浏览器的信息
哪些是GET请求,哪些是POST请求
GET请求有哪些
1.在浏览器地址栏中输入地址,敲回车。是GET请求
2.a标签,都是get请求
3.form标签 method=get也是get请求
4.link标签用来引入css样式,是get请求
5.script标签用来引入js文件,也是get请求
6.img标签引入图片是get请求
7.iframe标签用来引入单独的html,也是Get请求
POST请求
form标签 method=post是POST请求
响应的HTTP协议格式
响应行
响应的协议和版本号 HTTP/1.1
响应状态码
响应状态描述符
响应头
空行
响应体
常用的响应码说明
200 请求响应成功
404 请求的资源不存在
302 请求重定向
500 请求已经被服务器接收到,但是服务器内部错误
MIME类型说明
MIME是HTTP协议中数据类型。
MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。
text/html .html .htm
text是大类型
html是小类型
MIME 就是数据类型字符串描述符
常见的MIME类型:
我们的Tomcat支持哪些类型,可以到web.xml中去查看
谷歌浏览器查看HTTP响应
火狐浏览器查看HTTP响应
2、HttpServletRequest类
2.1 HttpServletRequest类有什么作用。
它表示请求的信息,每次请求进来。Tomcat服务器就会创建一个HttpServletRequest对象。然后把请求的数据封装到request对象中
我们可以从request对象中获取到所有请求有关的信息。
2.2 HttpServletRequest类的常用方法
常用API
public class RequestAPI extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// i.getRequestURI() 获取请求资源地址
System.out.println("请求的资源地址:" + request.getRequestURI());
// ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println( "请求的统一资源定位符:" + request.getRequestURL() );
// iii.getRemoteHost() 获取客户端的IP
System.out.println( "客户端的IP:" + request.getRemoteHost() );
// iv.getHeader() 获取请求头信息
System.out.println( "请求头:" + request.getHeader("Accept-Language") );
System.out.println( "请求头:" + request.getHeader("User-Agent") );
// vii.getMethod() 获取请求的方式 GET或POST
System.out.println( "请求的方式:" + request.getMethod() );
}
}
2.3 如何获取请求参数
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// getParameter获取请求的参数,这个方法的参数是请求的参数名
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobbies = request.getParameterValues("hobby");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
if (hobbies != null) {
Arrays.asList(hobbies).forEach(System.out::println);
}
}
2.4 GET请求的中文乱码解决
GET请求中文乱码解决方案一:
// 先使用iso-8859-1进行编码
byte[] buffer = username.getBytes("iso-8859-1");
// 再使用UTF-8字符集进行解码
username = new String(buffer, "UTF-8");
GET请求中文乱码解决方案二:
找到Tomcat的server.xml配置文件。找到Connector标签,添加URIEncoding属性
2.5 POST请求的中文乱码解决
POST请求解决中乱码方案一:
// 先使用iso-8859-1进行编码
byte[] buffer = username.getBytes("iso-8859-1");
// 再使用UTF-8字符集进行解码
username = new String(buffer, "UTF-8");
POST请求解决中文乱码方案二:
// 解决post中文乱码(通过设置请求体的字符集)
// 必须在getParameter方法之前调用才有效
request.setCharacterEncoding("UTF-8");
中文乱码解决,需要注意的点:
1、request.setCharacterEncoding("UTF-8");
不能解决GET请求的中文乱码
2、Tomcat8之后,GET请求默认是没有中文乱码的
2.6 请求的转发(需要结合jsp一起)
2.7 Base标签的作用
2.8 Web中的相对路径和绝对路径
2.9 web中/斜杠的不同意义
3、 HttpServletResponse类
3.1 概述
a) HttpServletResponse类的作用
所响应的信息,都可以通过httpServletResponse类进行设置。
b ) 两个输出流的说明。
字节流 response.getOutputStream(); 主要实现下载
字符流 response.getWriter() 主要输出字符串
一个response对象,只能在一个时间内使用字节流,或字符流,两个流不能同时使用。
c ) 如何往客户端回传数据
往客户端输出字符串
public class ResponseIO extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.write("this is the response's content!");
}
}
3.2 响应的乱码解决
解决响应中文乱码的第一种方案:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// System.out.println( response.getCharacterEncoding() );
// 设置服务器响应字符集为UTF-8
response.setCharacterEncoding("UTF-8");
// 通过设置响应头,告诉客户端使用UTF-8查看
response.setHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("这是响应返回的内容!");
}
解决响应中文乱码的第二种方案:
// 解决响应中文乱码。
// 必须要获取流之前调用
//设置服务器使用UTF-8.并设置响应头"Content-Type:text/html; charset=UTF-8"
response.setContentType("text/html;charset=UTF-8");
3.3 如何设置响应头和响应状态码
请求重定向第一种实现方案:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("曾到此一游Response1");
request.setAttribute("abc", "abcValue");
// 需要设置响应状态码和响应头
response.setStatus(302); // 设置响应状态码为302
// 设置响应头
// response.setHeader("Location", "http://localhost:8080/day07/response2");
response.setHeader("Location", "http://www.baidu.com");
}
a) 请求重定向
// 请求重定向(推荐使用)
response.sendRedirect("http://localhost:8080/day07/response2");
4、请求转发和重定向
如果两种都可以实现。优先使用转发。
如果转发问题,再考虑使用重定向。