什么是HTTP协议
HTTP: Hyper Text Transfer Protocol 超文本传输协议,用来传输超文本数据的协议,用来传输网页。
HTTP协议特点
- 简单快速:浏览器向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的响应后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于业务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的响应就较快。
什么是请求
由浏览器发送给服务器的所有数据,称为请求。
请求的组成部分
请求行:包括请求的方法、URL、协议和版本,GET方法的数据在请求行中发送
请求头:由键值对组成
请求体:POST方法的数据在请求体中发送,GET方法没有请求体
HTTP1.0与1.1的区别
1.0是每次请求就把TCP连接关闭,而1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求。
POST与GET的区别
POST方式 | GET方式 | |
---|---|---|
地址栏 | 不会显示提交的参数 | 提交的所有参数都会在地址栏上显示 |
发送数据大小 | 理论上没有限制 | 受浏览器的限制,最多1024B |
安全性 | 安全更高 | 相对低一些 |
缓存 | 不使用缓存 把数据发送给服务器。不使用缓存,状态码是200 | 如果页面已经访问过,并且服务器没有更新。会使用缓存 从服务器得到数据。如果使用缓存,状态码是304 |
常见的请求头
与请求行有关的方法
代码:
@WebServlet(name = "Demo1RequestLineServlet", urlPatterns = "/demo1")
public class Demo1RequestLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置内容的类型和字符集
response.setContentType("text/html;charset=utf-8");
//得到打印流
PrintWriter out = response.getWriter();
out.print("请求的方式:" + request.getMethod() + "<br/>");
out.print("得到请求的URI: " + request.getRequestURI() + "<br/>");
out.print("得到请求的URL: " + request.getRequestURL() + "<br/>");
out.print("得到版本和协议:" + request.getProtocol() + "<br/>");
//Context 上下文
out.print("得到当前项目的访问地址:" + request.getContextPath() + "<br/>");
out.print("得到客户端的IP地址(默认是IPV6):" + request.getRemoteAddr() + "<br/>");
out.print("得到当前Servlet的访问地址:" + request.getServletPath() + "<br/>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果:
与请求头有关的方法
与Enumeration有关的方法:
请求对象的方法:获取浏览器提交的数据
解决POST方法请求参数值汉字乱码问题
产生乱码的原因以及解决:Tomcat中请求默认的编码:iso-8859-1,这是欧洲码表,不支持汉字。我们需要将请求的编码改成utf-8,才会支持汉字。
解决:1. 使用方法:request.setCharacterEncoding(“utf-8”)
2. 方法出现的位置:必须放在所有得到参数方法的代码之前
3. 请求的编码要与提交参数的HTML页面的编码一致
- POST乱码如何解决:setCharacterEncoding
- GET乱码如何解决:tomcat8没有乱码
作用域
用于在服务器上实现多个Servlet之间、用户之间、请求之间数据的共享。
我们可以向作用域中添加数据,也可以从作用域中取出数据,也可以删除作用域中数据。
作用域的底层是一个Map结构,键是字符串类型,值是Object类型,可以存放任何的数据。
Servlet中三个作用域
所有作用域中的数据是放在服务器内存中的,一共有3个作用域;
按照范围从小到大:请求域request----->会话域session----->上下文域servletContext
与请求域有关的方法
页面的跳转
转发:在服务器端进行页面跳转,称为转发.
原理图:
使用代码:request.getRequestDispatcher("two").forward(request, response);//two 表示要跳转的页面
重定向:在浏览器端进行页面跳转,称为重定向.
原理图:
重定向使用的方法属于响应的方法:
response.sendRedirect("two");// two 表示要跳转的页面
转发与重定向的区别
区别 | 转发forward() | 重定向sendRedirect() |
---|---|---|
地址栏 | 不会发生变化 | 会 |
哪里跳转 | 服务器端的跳转 | 浏览器端跳转 |
请求域中数据 | 不会丢失 | 会丢失 |
什么时候使用转发,什么时候使用重定向
如果要保留请求域中数据,使用转发,否则使用重定向。
无论是转发还是重定向,后续的代码都会执行