• JavaWeb之HTTP、Tomcat、Servlet


    JavaWeb

    Web:全球广域网(www),也称为万维网,能够通过浏览器访问的网站
    (Web就是网站,网站就是Web)

    JavaWeb:就是使用JAVA技术来开发Web

    B/S架构

    B/S 架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。

    浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。

    静态资源

    静态资源主要包含HTML、CSS、JavaScript、图片等,主要负责页面的展示。

    动态资源

    动态资源主要包含Servlet、JSP等,主要用来负责逻辑处理。

    HTTP协议

    HTTP协议:HyperText Transfer Protocol,超文本传输协议。主要定义通信规则(服务端和客户端所约定的规则)

    浏览器发送请求给服务器,服务器响应数据给浏览器,这整个过程都需要遵守一定的规则,之前大家学习过TCP、UDP,这些都属于规则,这里我们需要使用的是HTTP协议,这也是一种规则。

    HTTP协议有它自己的一些特点,分别是:

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

    TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。

    基于请求-响应模型的:一次请求对应一次响应

    请求和响应是一一对应关系

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

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

    缺点:多次请求间不能共享数据
    优点:速度快

    Web服务器

    Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据

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

    请求数据格式

    请求数据总共分为三部分内容,分别是请求行、请求头、请求体

    请求行:
    HTTP请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]

    请求方式有七种,最常用的是GET和POST

    请求头:
    第二行开始,格式为key: value形式

    请求头中会包含若干个属性,常见的HTTP请求头有:

    Host: 表示请求的主机名
    User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like GeckoAccept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
    Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
    Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请求体:
    POST请求的最后一部分,存储请求参数

    GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中

    GET请求请求参数大小有限制,POST没有

    响应数据格式

    响应数据总共分为三部分内容,分别是响应行、响应头、响应体

    响应行
    响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]

    响应头
    第二行开始,格式为key:value形式

    响应头中会包含若干个属性,常见的HTTP响应头有:

      Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
      Content-Length:表示该响应内容的长度(字节数);
      Content-Encoding:表示该响应压缩算法,例如gzip;
      Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300
    • 1
    • 2
    • 3
    • 4

    响应体
    最后一部分。存放响应数据

    响应体和响应头之间有一个空行隔开。

    响应状态码

    • 200 ok 客户端请求成功
    • 404 Not Found 请求资源不存在
    • 500 Internal Server Error 服务端发生不可预期的错误

    Tomcat

    Tomcat的相关概念:

    • Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。(轻量级的意思就是只支持Servlet/JSP少量JavaEE规范)

    • 概念中提到了JavaEE规范,那什么又是JavaEE规范呢?

      JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。

    • 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。

    Web服务器

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

    部署

    将项目拷贝到Tomcat的webapps目录下,通过浏览器能看到内容则证明部署成功。

    但是文件一多,这样复制太麻烦,所以将文件打成war包,tomcat会自动解压

    启动tomcat会默认去访问index文件,如果没有则404

    认识web项目

    在这里插入图片描述
    部署之后的项目
    在这里插入图片描述编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下

    pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下

    Servlet

    • Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。
    • 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。
    • Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

    Servlet快速入门

    1.导入pom文件

    <dependency> 
          <groupId>javax.servletgroupId>  
          <artifactId>javax.servlet-apiartifactId>  
          <version>3.1.0version>
    
          <scope>providedscope>
        dependency> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.定义一个类实现Servlet接口
    3.在类上加上@WebServlet注解,并配上路径

    /**
     * Servlet的执行流程和生命周期
     *
     * @WebServlet:定义servlet
     * /demo1:定义访问Servlet的路径
     */
    @WebServlet(value = "/demo1",loadOnStartup = 1)
    //1.loadOnStartup默认是负整数:第一次被访问时创建Servlet对象
    //2.0或正整数,服务器在启动时创建Servlet对象,数字越小优先级越高
    public class ServletDemo implements Servlet {
        /**
         * 初始化方法,在对象创建的时候调用一次(servlet由tomcat创建),只执行一次
         * @param servletConfig
         * @throws ServletException
         */
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("demo1初始化");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        /**
         * 每次访问servlet都会调用
         * @param servletRequest
         * @param servletResponse
         * @throws ServletException
         * @throws IOException
         */
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("第一个servlet1启动成功~");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        /**
         * 销毁方法,服务器关闭的时候
         */
        @Override
        public void destroy() {
            System.out.println("demo1销毁");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    Servlet执行流程

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

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

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

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

    Servlet由web服务器创建,Servlet方法由web服务器调用

    1. 服务器怎么知道Servlet中一定有service方法?

    因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

    生命周期

    在Servlet接口中有这样三个方法

    init()
    service()
    destroy()
    分别对应着Servlet的初始化,请求处理和销毁

    Servlet默认在第一次访问时创建对象,并初始化对象,只执行一次,由此能想到这是单例模式的,代码中的loadOnStartup默认为负整数表示第一次访问时被创建,为正整数时,表示服务器启动就加载。

    init()在对象创建时执行一次,也只会执行一次

    service被访问几次就执行几次。

    当服务器断开或者重启,就调用destroy方法,只执行一次。

    Servlet中总共有5个方法,其中的三个是生命周期,剩下的两个方法作用分别是什么?

    String getServletInfo() 
    //该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可
    public String getServletInfo() {
        return "";
    }
    
    
    获取ServletConfig对象
    ```java
    ServletConfig getServletConfig()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    体系结构

    在这里插入图片描述
    HttpServlet中的service方法是先获取当前的请求方式,根据请求方式来调用doGet或doPost方法

    之所以要分get和post方法,是因为get方法和post传参方式不同

    GET请求参数在请求行中,POST请求参数在请求体中,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理。

    urlPattern配置

    一个Servlet,可以配置多个urlPattern

    value和urlPattern一致,一般使用value,都是String类型的数组

    /**
     * 注意: 一般情况一个ServLet就对应一个配置路径就可以了
     *   /user/demo3 :精确匹配 路径要一致才能访问十
     *   user/*: 目录匹配
     *   *.to: 扩展名匹配
     *   /*: 任意匹配
     *
     * 匹配顺序
     * 精确>目录>任意>后缀
     * value和patten是一致的,但是不能放在一起使用,底层都是一个String类型的数组,可以放多个Servlet地址
     * 一般常用value
     */
    @WebServlet(value = {"/demo4", "/demo40"})
    public class ServletDemo4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo4这是get请求");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo4这是post请求");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    最后

    如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

  • 相关阅读:
    实现单点登录的方式
    STM32单片机——IIC概念与协议软件模及固件库配置
    传奇人形怪爆率怎么设置?人形怪增加教程
    mapstruct lombok结合使用
    因合约代码Bug,约2.2亿元11539枚以太币被永久锁定
    pytest-base-url插件之配置可选的项目系统URL
    Ceph 架构以及部署
    Linux字符设备驱动开发
    VK12 打删除标记的操作
    66 内网安全-域横向批量at&schtasks&impacket
  • 原文地址:https://blog.csdn.net/weixin_47543906/article/details/128137521