第七章 HTTP 协议 与 Servlet 技术
创作日期:2021-12-26
7.1 HTTP 协议
协议是指双方,或多方,相互约定,都需要遵守的规则,所谓 HTTP 协议,就是指客户端和服务器之间通信时,发送的数据需要遵守的规则,HTTP 协议中的数据又称之为报文
7.1.1 请求的 HTTP 协议格式:GET
- 请求:客户端给服务器发送数据,分为 GET 请求与 POST 请求
- 响应:服务器给客户端回传数据
- GET 请求
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
协议是指双方,或多方,相互约定,都需要遵守的规则,所谓 HTTP 协议,就是指客户端和服务器之间通信时,发送的数据需要遵守的规则,HTTP 协议中的数据又称之为报文
- 请求:客户端给服务器发送数据,分为 GET 请求与 POST 请求
- 响应:服务器给客户端回传数据
- GET 请求
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
- 请求行
7.1.2 请求的 HTTP 协议格式:POST
- POST 请求
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
- 请求行
- 请求的方式 GET
- 请求的资源路径
- 请求的协议的版本号 HTTP/1.1
- 请求头 客户端发送服务器的数据 (头和体之间要有空行隔开)
7.1.3 常用请求头的说明
- Accept:表示客户端可以接收的数据类型
- Accept-Languege:表示客户端可以接收的语言类型
- User-Agent:表示客户端浏览器的信息
- Host:表示请求时的服务器 ip 和端口号
7.1.4 请求分类
- GET 请求
- 地址栏输入地址回车
- iframe 标签引入 html 页面
- img 标签引入图片
- Script 标签引入 js 文件
- link 标签引入 css 文件
- a 标签
- from 标签 menthod = get
- POST 请求
- from 标签 menthod = post
7.1.5 响应的 HTTP 协议格式
- 响应行
- 响应的协议和版本号 HTTP/1.1
- 响应状态码 200
- 响应状态描述符 ok
- 响应头 key : value 不同的响应头,有其不同含义
- 响应体 服务器回传给客户端的数据(头和体之间要有空行隔开)
7.1.6 常用的响应码说明
7.1.7 MIME 类型说明
- 200 表示请求成功
- 302 表示请求重定向
- 404 表示请求服务器已经收到了,但是数据不存在(请求地址错误)
- 500 表示服务器已经收到请求了,但是服务器内部错误(代码错误)
MIME 是 HTTP 协议中数据类型,全称是“Multipurpose Internet Mail Extensions” 多功能 Internet 邮件扩充服务,格式是“大类型/小类型”,并与某一种文件的扩展名相对应
- 常见的 MIME 类型:
7.2 HttpServletRequest 类
7.2.1 HttpServletRequest 类的作用
每当请求进入 Tpmcat 服务器时,Tomcat 服务器就会把请求的 HTTP 协议信息解析进行封装到 Request 对象中,然后传递到 service 方法( doGet 和 doPost )中,我们可以通过 HttpServletRequest 对象,获取到所有请求的信息
7.2.2 HttpServletRequest 类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key,value) 设置域数据
- getAttribute(key) 获取域数据
HelloServlet
com.example.Tomcat_web.HelloServlet
HelloServlet
/helloServlet
HelloServlet
每当请求进入 Tpmcat 服务器时,Tomcat 服务器就会把请求的 HTTP 协议信息解析进行封装到 Request 对象中,然后传递到 service 方法( doGet 和 doPost )中,我们可以通过 HttpServletRequest 对象,获取到所有请求的信息
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key,value) 设置域数据
- getAttribute(key) 获取域数据
package com.example.Tomcat_web; 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 = "HelloServlet", value = "/HelloServlet") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int j = 1; //getRequestURI() 获取请求的资源路径 "URI =>/Tomcat_web/helloServlet" System.out.println("URI => " + request.getRequestURI()); //getRequestURL() 获取请求的统一资源定位符(绝对路径) "URL =>http://localhost:8080/Tomcat_web/helloServlet" System.out.println("URL => " + request.getRequestURL()); //getRemoteHost() 获取客户端的 ip 地址 "客户端 ip 地址 => 127.0.0.1" System.out.println("客户端 ip 地址 => " + request.getRemoteHost()); //getHeader() 获取请求头 "请求头 User-Agent => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.77" System.out.println("请求头 User-Agent => " + request.getHeader("User-Agent")); //getMethod() 获取请求的方式 GET 或 POST "请求的方式 => GET" System.out.println("请求的方式 => " + request.getMethod()); //setAttribute(key,value) 设置域数据 request.setAttribute("xfdq", "jsb"); //getAttribute(key) 获取域数据 "xfdq => jsb " System.out.println("xfdq => " + request.getAttribute("xfdq")); //getParameter() 获取请求的参数 "姓名 => lmq8214, 密码 => 123, 性别 => girl" System.out.println("姓名 => " + request.getParameter("username")+"n密码 => " + request.getParameter("userpwd")+"n性别 => " +request.getParameter("sex")); //getParameterValues() 获取请求的参数(多个值的时候使用)"爱好1 => football 爱好2 => music 爱好3 => games" String[] hobbies = request.getParameterValues("hobby"); for (Object i:hobbies) { System.out.print("爱好"+j+" => "+i+" "); j++; } System.out.println("nget 请求"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); System.out.println("post 请求"); } }
7.3 HttpServletResponse 类
7.3.1 HttpServletResponse 类的作用
HttpServletResponse 表示所有响应的信息,我们可以通过HttpServletResponse 对象设置返回给客户端的信息
7.3.2 两个输出流的说明
- 两个流不能同时使用
- 字节流:getOutputStream(); 常用于下载(传递二进制数据)
- 字符流:getWriter(); 常用于回传字符串
package com.example.Tomcat_web;
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 = "HelloServlet", value = "/HelloServlet")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决回传数据 中文乱码问题
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/html;charset=UTF-8");
//response.getOutputStream(); 获取字节流
//response.getWriter(); 获取字符流 常用于回传字符串
//往客户端回传 字符串 数据
PrintWriter writer = response.getWriter();
writer.write("HelloServlet !!!");
writer.write("编程 !!!");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println("post 请求");
}
}
7.3.3 请求重定向
请求重定向指客户端给服务器发送请求,然后服务器反馈给客户端新的访问地址(之前的地址可能已经被废弃)
- 浏览器地址栏会发生变化
- 两次请求,一次响应
- 不共享 Request 域中数据
- 不能访问 WEB-INF 下的资源
- 可以访问工程外的资源
HttpServletResponse 表示所有响应的信息,我们可以通过HttpServletResponse 对象设置返回给客户端的信息
- 两个流不能同时使用
- 字节流:getOutputStream(); 常用于下载(传递二进制数据)
- 字符流:getWriter(); 常用于回传字符串
请求重定向指客户端给服务器发送请求,然后服务器反馈给客户端新的访问地址(之前的地址可能已经被废弃)
- 浏览器地址栏会发生变化
- 两次请求,一次响应
- 不共享 Request 域中数据
- 不能访问 WEB-INF 下的资源
- 可以访问工程外的资源
Response1 com.example.Tomcat_web.Response1 Response1 /response1 Response2 com.example.Tomcat_web.Response2 Response2 /response2
第一种重定向方法:
package com.example.Tomcat_web; //Response1.java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Response1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Response1......"); //设置响应状态码 302,表示重定向(地址已更换) response.setStatus(302); //设置响应头 说明新的地址 response.setHeader("Location","http://localhost:8080/Tomcat_web/response2"); } }
package com.example.Tomcat_web; //Response2.java 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 request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("response2 is result!"); } }
第二种重定向方法:(在 Response1.java 中使用 sendRedirect() 方法)
package com.example.Tomcat_web; //Response1.java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class Response1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Response1......"); //设置新的地址 response.sendRedirect("http://localhost:8080/Tomcat_web/response2"); } }
上一节:
下一节: