目录
HTTP协议
什么是HTTP协议
协议:指双方或多方相互约定好,大家都需要遵守的规则
HTTP(HyperText Transfer Protocol),超文本传输协议,规定了浏览器和服务器之间数据传输的规则
HTTP协议中的数据又叫报文
HTTP协议的特点
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。 缺点:多次请求间不能共享数据。 优点:速度快
请求的HTTP协议格式
客户端给服务器发送数据叫请求,服务器给客户端回传数据叫响应
请求分为GET请求和POST请求两种
GET请求和POST请求的区别:
- GET请求请求参数在请求行中,没有请求体。POST请求请求参数在请求体中
- GET请求请求参数大小有限制,POST没有
GET请求
1.请求行
(1)请求的方式:GET
(2)请求的资源路径:[+?+请求参数]
(3)请求的协议的版本号:HTTP/1.1
2.请求头
由key:value组成,不同的键值对表示不同的含义
POST请求
1.请求行
(1)请求的方式:POST
(2)请求的资源路径:[+?+请求参数]
(3)请求的协议的版本号:HTTP/1.1
2.请求头
由key:value组成,不同的键值对表示不同的含义
请求头和请求体之间有空行
3.请求体:发送给服务器的数据
常用的请求头说明
Accept:客户端可以接收的数据类型
Accept-Language:客户端可以接收的语言类型
User-Agent:客户端浏览器的信息
Host:请求时的服务器ip和端口号
哪些是GET请求,哪些是POST请求
GET请求有哪些:
- form标签 method=get
- a标签
- link标签引入css
- script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后敲回车
POST请求有哪些:
- form标签 method=post
响应的HTTP协议格式
1.响应行
(1)响应的协议和版本号:HTTP/1.1
(2)响应状态码:200
(3)响应状态描述符:OK
2.响应头
由key:value组成,不同的键值对表示不同的含义
响应头和响应体之间有空行
3.响应体:回传给客户端的数据
常见的响应码说明
200:请求成功
302:请求重定向
404:请求服务器已经收到了,但数据不存在(请求地址错误)
500:服务器已经收到请求,但是服务器内部错误(代码错误)
MIME类型说明
MIME是HTTP协议中的数据类型
MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
常见的MIME类型:
HttpServletRequest类
作用
每次只要有请求进入tomcat服务器,tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用,我们可以通过HttpServletRequest对象获取到所有请求的信息
常用方法
- getRequestURI():获取请求的资源路径
- getRequestURL():获取请求的统一资源定位符(绝对路径)
- getRemoteHost():获取客户端的ip地址
- getHeader():获取请求头
- getParameter():获取请求的参数
- getParamterValues():获取请求的参数(多个值)
- getMethod():获取请求的方式GET/POST
- setAttribute(key,value):设置域数据
- getAttribute(key):获取域数据
- getRequestDispatcher():获取请求转发对象
启动输出为:
如何获取请求参数
post请求中文乱码问题
要在获取请求参数之前设置才有效
请求转发
请求转发是指服务器收到请求后,从一个资源跳转到另一个资源
请求转发的特点:
- 浏览器地址栏没有变化
- 它们是一次请求
- 它们共享Request域中的数据
- 可以转发到WEB-INF目录下
- 不可以访问工程以外的资源
Servlet1类:
package com.qcby.servlet0724; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Servlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数 String username = request.getParameter("username"); System.out.println("在Servlet1中查看参数:"+username); //盖章,并传递到Servlet2 request.setAttribute("key1","柜台1的章"); //问路:Servlet2怎么走 /** * 请求转发必须要以斜杠开头 */ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2"); //走向Servlet2 requestDispatcher.forward(request,response); } }
Servlet2类:
package com.qcby.servlet0724; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数 String username = request.getParameter("username"); System.out.println("在Servlet2中查看参数:"+username); //查看柜台1是否盖章 Object key1 = request.getAttribute("key1"); System.out.println("柜台1是否有章:"+key1); //处理自己的业务 System.out.println("Servlet2处理自己的业务"); } }
启动:
base标签的作用
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转
Web中的相对路径和绝对路径
相对路径:
.表示当前目录
..表示上一级目录
资源名:表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
Web中斜杠/的不同意义
在web中/斜杠是一种绝对路径
- /斜杠如果被浏览器解析,得到的地址是:http://ip:port/
- /斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径
特殊情况:
response.sendRedirect("/"):把斜杠发送给浏览器解析,得到http://ip:port/
HttpServletResponse类
作用
每次请求进来,tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletResponse表示所有响应的信息,如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
两个输出流的说明
- 字节流:getOutputStream(),常用于下载(传递二进制数据)
- 字符流:getWriter(),常用于回传字符串(常用)
两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则报错
如何向客户端回传字符串数据
PrintWriter writer = response.getWriter(); writer.write("response's content");
解决中文乱码问题:
方案一:
方案二:同时设置服务器和客户端都使用UTF-8,还设置了响应头,只有在获取流对象之前设置才有效
response.setContextType("text/html;charset=UTF-8");
请求重定向
请求重定向是指客户端给服务器发请求,然后服务器告诉客户端说我给你一些地址,你去新地址访问(因为之前的地址可能已废弃)
请求重定向的特点:
- 浏览器地址栏会发生变化
- 两次请求
- 不共享Request域中的数据
- 不能访问WEB-INF下的资源
- 可以访问工程外的资源
方案一:
Response1:
package com.qcby.servlet0724; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Response1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Response1"); //设置响应状态码302,表示重定向 resp.setStatus(302); //设置响应头,说明新的地址 resp.setHeader("Location","http://localhost:8080/servlet0724/response2"); } }
Response2:
package com.qcby.servlet0724; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Response2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("response2的结果"); } }
启动:访问http://localhost:8080/servlet0724/response1
方案二(推荐):