• 【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。


    这篇博客真的很详细的讲述了Servlet,看看不吃亏。
    如有错误欢迎指正,自古问过则喜。
    余虽无圣人之质,然愿效圣人之行。强作之者,亦英雄也。

    什么是Servlet?

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

    使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

    Servlet是Java提供的一门动态Web资源开发技术

    静态Web和动态Web有什么区别吗?

    静态Web,像Html+Css+Js这样的死页面,不会随着用户的改变而改变

    而动态Web,会区分用户的不同而为其展现不同的页面

    Servlet也是JavaEE十三项规范之一,所谓的规范也就是接口,所以我们要使用Servlet,就需要Servlet类实现Servlet的接口,并在Web服务器上运行。Servlet有五大方法,init、service、destory、getServletInfo、getServletConfig。

    下图显示了 Servlet 在 Web 应用程序中的位置。

    Servlet 架构

    Servlet的使用

    1、创建一个Web项目,并集成Tomcat

    不会的可以看这篇文章:

    2、引入Servlet的依赖

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

    一定要加上 provided,因为Tomcat中是有Servlet的jar包的,再引入会冲突,反而会报错。这句话的作用是指这个依赖仅仅在测试和编译的情况下,才会被引入。

    3、创建一个Web启动类

    第一个是重写Servlet接口

    package com.you.web;
    
    import javax.jws.WebService;
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    @WebServlet(urlPatterns = "/demo1")
    public class webServlet01 implements Servlet {
        @Override
        public void init(ServletConfig config) throws ServletException {
            System.out.println("init.....");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("service....");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("distory.....");
        }
    }
    
    
    • 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

    启动Tomcat,访问demo1看一下效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3t7NYVB-1662627926062)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\image-20220908165606032.png)]

    第二个是继承HttpServlet

    package com.you.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(urlPatterns = "/demo2")
    public class webServlet02 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
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    访问demo2看一下效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKDE9gTD-1662627853040)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\image-20220908165708932.png)]

    Servlet的理解

    Servlet的执行流程

    网页中请求的URL可以被切割为三部分,如下第一部分htpp://localhsot:8080的作用是找到服务器,第二部分web-demo的作用是找到web项目,第三部分demo1的作用则是找到web项目中的Servlet。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30YKot9Q-1662627853042)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\image-20220908111228752.png)]

    Servlet的生命周期

    Servlet的生命周期可以分为4个阶段:加载和实例化、初始化、请求处理、服务终止

    加载和实例化阶段

    默认情况下,当Servlet第一次被访问的时候,由容器创建Servlet对象。

    当然,我们也不可以不默认。只需要使用@WebService(urlPattems = “/demo”,loadOnStartup = 1)

    • 当loadOnStartup = 负整数时,这是默认情况,第一次被访问的时候创建Servlet对象。

    • 当loadOnstartup = 0或者正整数时,服务器启动的时候,就会创建Servlet对象,数字越小优先级就越高。

    当项目比较大的时候,第一次访问时再创建Servlet,用户就会等待一段时间,这样用户的体验感就会下降,这时候我们选择在服务器启动的时候创建Servlet,用户就会有一个更好的体验感!

    初始化阶段

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

    请求处理

    每次请求Servlet的时,Servlet容器都会调用service()的方法对请求进行处理。也就是每进入Servlet的网页,都会调用Servlet的service()方法。

    服务终止

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

    刚才提到Servlet有五大方法,init、service、destory、getServletInfo、getServletConfig。

    方法名方法注解
    initvoid init(ServletConfig config)初始化方法,在Servlet被创建时执行,并且只执行一次
    servicevoid service(ServletRequest req, ServletResponse res)提供服务方法,每当Servlet被访问,都会执行这个方法
    destroyvoid destroy()销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet,只被执行一次,
    getServletInfoString getServletInfo()获取Servlet的一个信息
    getServletConfigServletConfig getServletConfig();获取ServletConfig类

    常见问答题

    Servlet由谁创建?Servlet方法由谁调用?

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

    服务器怎么知道Servlet中一定有Service方法?

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

    Servlet的体系结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPrcYXTJ-1662627853043)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\image-20220908145339366.png)]

    B/S和C/S的区别

    C/S就是指客户端/服务器模式。是计算机软件协同工作的一种模式,通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。

    B/S型模式,即浏览器/服务器结构。它是C/S架构的一种改进,可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。

    使用HttpServlet的原因

    对于一个正常的项目来讲,他的请求方式不会是单一的,至少是Post、Get两种请求,这两种携带信息的位置并不一致,Post携带信息的位置在请求体,而Get携带信息的位置在请求头,这意味着我必须对二者进行区分,才能正确拿到其携带的信息。

    HttpServlet的工作原理

    HttpServlet的工作原理非常的简单,用四个字概括即为分而治之,对于每一个请求判断是哪一类请求,如果是“Get”请求,就调用doGet方法,如果是“Post”请求,就去调用doPost方法。这是do…方法,就是我们要使用的。

    首先是调用Servlet自带的service方法,这里只做了一个操作就是把ServletRequest和ServletResponse转为Http…,然后传到service(Http… req,Http… resp),然后获取请求方式的名字,并调用相应的方法。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BIMj8CyH-1662627853044)(D:\Typora\PicGo\未命名文件 (1)].png)

    UrlPatten的配置

    一个Servlet,可以配置多个urlPatton

    Servlet想要被访问,就必须配置其访问路径。最为便捷的方式是通过注解配置,也就是上面用到的@WebServlet,其中有很多的属性,不同的属性之间用,隔开。今天我们讲的是urlPatterns属性,点来WebServlet,可以看到这是一个对象,这意味着他可以配置多个属性,这也表明了:一个Servlet可以有多个urlPattern(访问路径),如下

    @WebServler(urlPatterns = {"/demo1","/demo2"})
    
    • 1

    这意味着我可以通过demo1或者demo2访问这个Servlet。

    如果我只需要一个地址的话,则不需要加{},主需要写如下代码即可

    @WebServlet(urlPatterns = "/demo1")
    
    • 1

    这样我便可以通过demo1访问这个Servlet了。

    配置规则

    1. 精确匹配 如@WebServlet(urlPatterns = “/users/demo1”),那么我只能通过"users/demo1"访问这个Servlet
    2. 目录匹配 如@WebServlet(urlPatterns = “/users/*”),那么我可以通过"users/任何字符串"访问这个Servlet
    3. 扩展名匹配 如WebServlet(urlPatterns = “*.do”),那么我可以通过"任何字符串.do"访问这个Servlet
    4. 任意匹配,如WebServlet(urlPatterns = “/*”),那么我可以通过任何途径访问到这个Servlet,但是注意不要设置成"/",这样会覆盖掉DefaultServlet,导致静态页面无法加载。

    Xml配置访问路径(不建议使用)

    在Servlet3.0之前,只支持web.xml配置访问路径。

    需要在Web.xml下配置如下代码

    <servlet>
        <servlet-name>demoservlet-name>
        <servlet-class>com.you.web.ServletDemo02servlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>demoservlet-name>
        <url-pattern>demo5url-pattern>
      servlet-mapping>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    IB成绩不理想,还想读名校,有其他途径吗?
    SQL常用基础语句(二)-- FGHIJ开头
    bean的自动装配
    倒计时 天时分秒
    Linux 内核活动专题
    【课程作业经验】基于MIndSpore波士顿房价数据预测
    设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
    Pandas教程(一)
    102. 二叉树的层序遍历
    Java~List接口详解
  • 原文地址:https://blog.csdn.net/m0_59792745/article/details/126768250