• 【JavaWeb - 网页编程】七 HTTP 协议 与 Servlet 技术



    第七章 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    


    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 常用的响应码说明

    • 200 表示请求成功
    • 302 表示请求重定向
    • 404 表示请求服务器已经收到了,但是数据不存在(请求地址错误)
    • 500 表示服务器已经收到请求了,但是服务器内部错误(代码错误)

    7.1.7 MIME 类型说明

            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)               获取域数据
    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    4. version="4.0">
    5. <servlet>
    6. <servlet-name>HelloServletservlet-name>
    7. <servlet-class>com.example.Tomcat_web.HelloServletservlet-class>
    8. servlet>
    9. <servlet-mapping>
    10. <servlet-name>HelloServletservlet-name>
    11. <url-pattern>/helloServleturl-pattern>
    12. servlet-mapping>
    13. web-app>
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>HelloServlettitle>
    6. head>
    7. <body>
    8. <form action="http://localhost:8080/Tomcat_web/helloServlet" method="get">
    9. 姓名:<input type="text" name="username"><br>
    10. 密码:<input type="password" name="userpwd"><br>
    11. 性别:<input type="radio" name="sex" value="boy"><input type="radio" name="sex" value="girl" checked="checked">
    12. <br>爱好:<input type="checkbox" name="hobby" value="football">足球
    13. 音乐<input type="checkbox" name="hobby" value="music" >
    14. 游戏<input type="checkbox" name="hobby" value="games" checked="checked">
    15. <br><input type="submit">
    16. form>
    17. body>
    18. html>
    1. /* HelloServlet.java */
    2. package com.example.Tomcat_web;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. @WebServlet(name = "HelloServlet", value = "/HelloServlet")
    10. public class HelloServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13. int j = 1;
    14. //getRequestURI() 获取请求的资源路径 "URI =>/Tomcat_web/helloServlet"
    15. System.out.println("URI => " + request.getRequestURI());
    16. //getRequestURL() 获取请求的统一资源定位符(绝对路径) "URL =>http://localhost:8080/Tomcat_web/helloServlet"
    17. System.out.println("URL => " + request.getRequestURL());
    18. //getRemoteHost() 获取客户端的 ip 地址 "客户端 ip 地址 => 127.0.0.1"
    19. System.out.println("客户端 ip 地址 => " + request.getRemoteHost());
    20. //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"
    21. System.out.println("请求头 User-Agent => " + request.getHeader("User-Agent"));
    22. //getMethod() 获取请求的方式 GET 或 POST "请求的方式 => GET"
    23. System.out.println("请求的方式 => " + request.getMethod());
    24. //setAttribute(key,value) 设置域数据
    25. request.setAttribute("xfdq", "jsb");
    26. //getAttribute(key) 获取域数据 "xfdq => jsb "
    27. System.out.println("xfdq => " + request.getAttribute("xfdq"));
    28. //getParameter() 获取请求的参数 "姓名 => lmq8214, 密码 => 123, 性别 => girl"
    29. System.out.println("姓名 => " + request.getParameter("username")+"\n密码 => " + request.getParameter("userpwd")+"\n性别 => " +request.getParameter("sex"));
    30. //getParameterValues() 获取请求的参数(多个值的时候使用)"爱好1 => football 爱好2 => music 爱好3 => games"
    31. String[] hobbies = request.getParameterValues("hobby");
    32. for (Object i:hobbies) {
    33. System.out.print("爱好"+j+" => "+i+" ");
    34. j++;
    35. }
    36. System.out.println("\nget 请求");
    37. }
    38. @Override
    39. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    40. request.setCharacterEncoding("UTF-8");
    41. System.out.println("post 请求");
    42. }
    43. }

    7.3 HttpServletResponse 类

    7.3.1 HttpServletResponse 类的作用

             HttpServletResponse 表示所有响应的信息,我们可以通过HttpServletResponse 对象设置返回给客户端的信息


    7.3.2 两个输出流的说明

    • 两个流不能同时使用
      • 字节流:getOutputStream();         常用于下载(传递二进制数据)
      • 字符流:getWriter();                       常用于回传字符串
    1. /* HelloServlet.java */
    2. package com.example.Tomcat_web;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. import java.io.PrintWriter;
    10. @WebServlet(name = "HelloServlet", value = "/HelloServlet")
    11. public class HelloServlet extends HttpServlet {
    12. @Override
    13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. //解决回传数据 中文乱码问题
    15. response.setCharacterEncoding("UTF-8");
    16. response.setHeader("Content-Type","text/html;charset=UTF-8");
    17. //response.getOutputStream(); 获取字节流
    18. //response.getWriter(); 获取字符流 常用于回传字符串
    19. //往客户端回传 字符串 数据
    20. PrintWriter writer = response.getWriter();
    21. writer.write("HelloServlet !!!");
    22. writer.write("编程 !!!");
    23. }
    24. @Override
    25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    26. request.setCharacterEncoding("UTF-8");
    27. System.out.println("post 请求");
    28. }
    29. }

    7.3.3 请求重定向

            请求重定向指客户端给服务器发送请求,然后服务器反馈给客户端新的访问地址(之前的地址可能已经被废弃)

    • 浏览器地址栏会发生变化
    • 两次请求,一次响应
    • 不共享 Request 域中数据
    • 不能访问 WEB-INF 下的资源
    • 可以访问工程外的资源

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    4. version="4.0">
    5. <servlet>
    6. <servlet-name>Response1servlet-name>
    7. <servlet-class>com.example.Tomcat_web.Response1servlet-class>
    8. servlet>
    9. <servlet-mapping>
    10. <servlet-name>Response1servlet-name>
    11. <url-pattern>/response1url-pattern>
    12. servlet-mapping>
    13. <servlet>
    14. <servlet-name>Response2servlet-name>
    15. <servlet-class>com.example.Tomcat_web.Response2servlet-class>
    16. servlet>
    17. <servlet-mapping>
    18. <servlet-name>Response2servlet-name>
    19. <url-pattern>/response2url-pattern>
    20. servlet-mapping>
    21. web-app>

    第一种重定向方法:

    1. package com.example.Tomcat_web;
    2. //Response1.java
    3. import javax.servlet.*;
    4. import javax.servlet.http.*;
    5. import java.io.IOException;
    6. public class Response1 extends HttpServlet {
    7. @Override
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. System.out.println("Response1......");
    10. //设置响应状态码 302,表示重定向(地址已更换)
    11. response.setStatus(302);
    12. //设置响应头 说明新的地址
    13. response.setHeader("Location","http://localhost:8080/Tomcat_web/response2");
    14. }
    15. }
    1. package com.example.Tomcat_web;
    2. //Response2.java
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. public class Response2 extends HttpServlet {
    9. @Override
    10. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    11. response.getWriter().write("response2 is result!");
    12. }
    13. }

    第二种重定向方法:(在 Response1.java 中使用 sendRedirect() 方法)

    1. package com.example.Tomcat_web;
    2. //Response1.java
    3. import javax.servlet.*;
    4. import javax.servlet.http.*;
    5. import java.io.IOException;
    6. public class Response1 extends HttpServlet {
    7. @Override
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. System.out.println("Response1......");
    10. //设置新的地址
    11. response.sendRedirect("http://localhost:8080/Tomcat_web/response2");
    12. }
    13. }

    上一节:

    下一节:

  • 相关阅读:
    [ML从入门到入门] 支持向量机:从SVM的推导过程到SMO的收敛性讨论
    git常见问题
    29岁才转行软件测试,目前32了,我的一些经历跟感受
    mac配置双网卡 mac同时使用内网和外网
    SpringCloud - Spring Cloud 之 Zuul和Gateway网关(十四)
    基于GenericAPIView以及五个视图扩展类写接口
    LwIP介绍
    数组类型和多维数组本质
    Baichuan2:Open large-scale language models
    关于内存条的知识要点⑴
  • 原文地址:https://blog.csdn.net/woailuo8214/article/details/126141471