• Java Web(五)之 web核心(HTTP协议,Tomcat服务器,Servlet)


    Java Web技术栈

    Java Web顾名思义就是用Java技术来解决相关web互联网领域的技术栈

    前面我们已经学习了很多基础(前端三剑客,Maven,MyBatis等)

    接下来我们向着web核心做最后的冲刺!

    当来到web之后,强调的更多是技术栈(Java Web就是由很多技术组成)

    Java Web技术栈(组成部分)
    (1)B/S架构Browser/Server,浏览器/服务器 架构模式。
    它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。

    在这里插入图片描述
    (2)静态资源:主要包含HTML、CSS、JavaScript、图片等,主要负责页面的展示。缺点:所有人看到的页面是一样的

    (3)动态资源:主要包含Servlet、JSP等,主要用来负责逻辑处理。
    动态资源处理完逻辑后会把得到的结果交给静态资源来进行展示,动态资源和静态资源要结合一起使用。

    (4)数据库:主要负责存储数据

    (5)HTTP协议:主要定义通信规则。浏览器发送请求给服务器,服务器响应数据给浏览器,这整个过程都需要遵守一定的规则

    (6)Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据。
    浏览器按照HTTP协议发送请求和数据,后台就需要一个Web服务器软件来根据HTTP协议解析请求和数据,然后把处理结果再按照HTTP协议发送给浏览器

    Java EE(Java Enterprise Edition,Java企业版)规定的十三种技术
    包含JDBC,JNDI,EJB,RMI,JSP,Servlet,XML,JMS,Java IDL,JTS,JTA,JavaMail,JAF

    HTTP协议

    1.简介

    HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间 数据传输的规则

    在这里插入图片描述

    HTTP协议的特点

    (1)基于TCP协议:面向连接,安全

    (2)基于请求—响应模型的:一次请求对应一次响应(请求和响应是一一对应关系

    (3)HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的

    注意: 无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点:

    • 缺点:多次请求间不能共享数据,Java使用会话技术(Session,Cookie)来解决
    • 优点:速度快

    2. 请求数据格式

    分为3部分:请求行,请求头,请求体

    (1)请求行:请求数据的第一行,其中GET表示请求方式/ 表示请求资源的路径,HTTP/1.1 表示协议的版本

    在这里插入图片描述

    (2)请求头:第二行开始,格式为key:value

    常见的请求头

    请求头含义
    Host表示请求的主机名
    User-Agent浏览器版本
    Accept表示浏览器能接收的资源类型,如text/*,image/*等
    Accept-Language表示浏览器偏好的语言
    Accept-Encoding表示浏览器可以支持的压缩类型,如gzip等

    (3)请求体:POST请求的最后一部分,存放请求参数

    在这里插入图片描述

    GET和POST请求区别:

    • GET请求 请求参数在请求行中,没有请求体。POST请求 请求参数在请求体中
    • GET请求 请求参数大小有限制,POST没有

    3.响应数据格式

    在这里插入图片描述

    响应数据也分为3部分

    • 响应行:响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1:HTTP协议及版本,200:响应状态码,ok:状态码的描述
    • 响应头:第二行开始,格式为key:value形式
    • 响应体: 最后一部分。存放响应数据

    状态码分类

    状态码分类说明
    1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
    2xx成功——表示请求已经被成功接收,处理已完成
    3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
    4xx客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
    5xx服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

    常见的状态码

    状态码英文描述解释
    200OK客户端请求成功,即处理成功,这是我们最想看到的状态码
    302Found指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
    403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
    404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
    500Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧

    状态码大全:https://cloud.tencent.com/developer/chapter/13553

    Tomcat

    1.介绍

    (首先介绍一下web服务器)

    Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务".

    在这里插入图片描述

    Tomcat:

    • Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
    • 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。

    2.创建部署

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    创建web项目的两种方法

    IDEA集成Tomcat的两种方式

    Servlet

    1.介绍

    (1)Servlet 是Java Web的核心内容,它是Java提供的一门 动态web资源 开发技术。

    (2)使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容

    (3)Servlet是Java EE规范之一,其实就是一个接口,之后需要实现Servlet接口,并由web服务器运行Servlet

    在这里插入图片描述

    2.基本配置

    在这里插入图片描述

    3.方法介绍

    Servlet接口中有5个抽象方法,分别是:

    方法含义
    void init(ServletConfig config)初始化方法,在Servlet被创建时执行,只执行一次
    void service(ServletRequest req, ServletResponse res)提供服务方法, 每次Servlet被访问,都会调用该方法
    void destroy()销毁方法,当Servlet被销毁时,调用该方法
    String getServletInfo()获取Servlet信息
    ServletConfig getServletConfig()获取ServletConfig对象

    4.Servlet执行流程

    在这里插入图片描述

    (1)浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080web-demodemo1

    • 根据localhost:8080可以找到要访问的Tomcat Web服务器
    • 根据web-demo可以找到部署在Tomcat服务器上的web-demo项目
    • 根据 demo1 可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配

    (2)找到ServletDemo这个类后,Tomcat Web服务器就会为ServletDemo这个类创建一个对象,然后调用对象中的service方法

    • ServletDemo实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用
    • service方法中有ServletRequest和ServletResponse两个参数,ServletRequest 封装的是请求数据,ServletResponse封装的是响应数据,后期可以通过这两个参数实现前后端的数据交互。

    5.生命周期

    生命周期:对象的生命周期指一个对象从被创建到被销毁的整个过程。

    Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

    (1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象;

    (2) 初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

    (3)请求处理每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理;

    (4)服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

    6.体系结构(简化的Servlet创建)

    在这里插入图片描述

    从Servlet体系结构可以看出,HttpServlet实现了Servlet接口,所以我们之后就都直接新建类继承HttpServlet

    HttpServlet是个抽象类,所以我们需要重写他的抽象方法doGetdoPost方法

    public class ServletDemo extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("get...");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("post...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Request & Response

    在这里插入图片描述

    Request获取 请求数据

    • 浏览器会发送HTTP请求到后台服务器 [ Tomcat ]
    • HTTP的请求中会包含很多请求数据 [ 请求行+请求头+请求体 ]
    • 后台服务器 [Tomcat] 会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
    • 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数

    Response设置响应数据

    • 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据;
    • 响应数据封装到 response 对象中;
    • 后台服务器[Tomcat]会解析response对象,按照 [响应行+响应头+响应体] 格式拼接结果;
    • 浏览器最终解析结果,把内容展示在浏览器给用户浏览

    1.Request对象

    (1)继承体系

    在这里插入图片描述

    (2)方法

    获取请求行数据:

    在这里插入图片描述

    主要分为请求方式,请求资源路径,HTTP协议及版本

    方法含义
    String getMethod( )获取请求方式
    String getContextPath( )获取项目访问路径
    StringBuffer getRequestURL( )获取请求URL
    String getRequestURI()获取URI(统一资源标识符)
    String getQueryString( )获取GET请求方式的请求参数

    获取请求头数据

    在这里插入图片描述

    key:value的形式

    方法含义
    getHeader(String name)根据请求头名称获取其对应的值

    获取请求体数据:

    (浏览器发送的POST请求才有请求体)

    方法含义
    ServletInputStream getInputStream()获取字节输入流(字节数据,如文件数据)
    BufferedReader getReader()获取字符输入流(字符数据,如文本数据)

    (3)Request请求转发

    请求转发(forward):一种在服务器内部的资源跳转方式

    在这里插入图片描述

    实现方式:

    req.getRequestDispatcher("资源B路径").forward(req,resp);
    
    • 1

    2.Response对象

    (1)响应数据设置

    在这里插入图片描述

    (2)Response重定向

    在这里插入图片描述

    重定向&请求转发

    在这里插入图片描述

    (3)Response响应字符数据

    将字符数据写回到浏览器,两个步骤:

    • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();

    • 通过字符输出流写数据: writer.write(“aaa”);

    (4)Response响应字节数据

    两个步骤:

    • 通过Response对象获取字节输出流:
      ServletOutputStream outputStream = resp.getOutputStream();

    • 通过字节输出流写数据: outputStream.write(字节数据);

    参考链接:https://www.bilibili.com/video/BV1Qf4y1T7Hx?share_source=copy_web

  • 相关阅读:
    软件定义汽车产业生态创新白皮书
    Windows下Docker搭建Flink集群
    漏洞复现-海康威视综合安防管理平台信息泄露【附Poc】
    动态规划6(Leetcode740删除并获得点数)
    Spring ApplicationListener源码版
    (二十二)Flask之上下文管理第三篇【收尾—讲一讲g】
    怎么把Word翻译成中文?建议收藏这些方法
    微信小程序之微信授权登入及授权的流程讲解
    SpringCloud 简单的了解
    轻量级的在线团队协作工具
  • 原文地址:https://blog.csdn.net/ji_meng/article/details/126693714