• Servlet -个人理解笔记


    Servlet的作用

            Servlet主要是为了衔接web应用的前端和后端的,作为它们俩中间数据交换的桥梁,现在很多web项目都是前后端分离的,前端写前端的后端写后端的,但是他俩所用的编程语言是有区别的,怎么实现它们之间的数据交换呢?Servlet就是为了解决这个,它是用java编写的,目前我是在tomcat上面使用它,其他环境还没试过

            需要注意的是它并不在jdk中,有专门的Servlet代码包,需要将它导入项目中才可以用,不过如果我们在tomcat环境下运行是不需要导入的,tomcat本身自带servlet的jar包

    需要对应jar包的话可以到下面的链接去下载

    https://mvnrepository.com/search?q=Servlet

    Servlet接口源代码

    1. public interface Servlet {
    2. //初始化函数
    3. void init(ServletConfig var1) throws ServletException;
    4. //存储配置信息
    5. ServletConfig getServletConfig();
    6. //处理请求
    7. void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    8. //获取当前Servlet的一些信息
    9. String getServletInfo();
    10. //释放内存
    11. void destroy();
    12. }

            在最底层他被定位为一个接口,其中的service函数就是用来处理http请求的,如果我们要处理页面的请求就可以在这里面写业务代码

    Servlet接口实现类图

    他只被定义为接口,所以就会有相应的实现类,以下是servlet.jar包中提供的实现类的结构图

     为了方便开发,其中定义的HttpServlet类编写了很多函数,并且将接口中的类都实现了,我们使用时只需要继承它然后重写service方法即可,一般来说我们都是通过继承HttpServlet类重写它的方法来处理前端的数据请求

    Tomcat下web页面请求的处理逻辑

    在HttpService处理逻辑中,当网页发送请求,例如向服务器发送一个get请求,tomcat会自动调用HttpService中的service方法去处理,service中会根据不同的请求格式 例如get请求就调用 上图中的doget方法,post请求就会调用dopost方法,

    HttpService实现类中业务代码的写法

    1.重写父类service方法

    这样的话,当服务器接收到请求就会调用service进行处理,不过由于不同格式的请求处理的业务代码可能不同,针对不同的请求我们需要编写不同的代码,全部在这一个方法中编写显得过于臃肿,实现的功能过多

    1. public class servlet02 extends HttpServlet {
    2. @Override
    3. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. System.out.println("调用02");
    5. }
    6. }

    2.重写父类对应的do方法

    根据父类的处理逻辑,我们直接重写父类中对应的do..方法即可,因为父类中的处理就是根据消息的不同调用不同的do方法

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

    配置Servlet的映射路径

            每个 Servlet 在 Web 应用中都需要有一个唯一的访问路径,以便客户端(通常是浏览器)能够准确地找到并访问该 Servlet。如果没有明确的映射路径,客户端就不知道通过什么 URL 来调用这个特定的 Servlet

    例如有以下实现类,现在演示如何为他配置url

    1. public class servlet02 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. System.out.println("doGet");
    5. }
    6. }

    1.在web.xml中配置

    1. <servlet>
    2. //为该类取的昵称,一般和它同名即可
    3. <servlet-name>servlet02servlet-name>
    4. //对应的实现类的类名(包括包名)
    5. <servlet-class>servlet02servlet-class>
    6. servlet>
    7. //设置类与url的映射
    8. <servlet-mapping>
    9. //对应的昵称
    10. <servlet-name>servlet02servlet-name>
    11. //设置的url标志,浏览器可以根据这个url来访问
    12. <url-pattern>/servlet02url-pattern>
    13. servlet-mapping>

    先给对应类起一个别名,然后将别名和要设置的url放到servlet-mapping中作为一个映射、

    2.使用注解

    1. @WebServlet("/servlet02")
    2. public class servlet02 extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. System.out.println("doGet");
    6. }
    7. }

    直接在类定义上面添加即可,这种方式很简单,当然注解中还有一些其他的信息可以配置,这里只展示了最简单的配置url的方式,如果还要在注解中配置其他信息就不可以这样写了

    做完以上操作就可以在tomcat中运行了,当然service中的处理代码因业务而异

    Servlet生命周期

    以下都是在Servlet接口中定义的方法

    1.加载和初始化(init)

    当服务器启动或客户端首次请求 Servlet 时,Web 容器会查找 Servlet 类文件,并使用类加载器将其加载到内存中。然后,Web 容器创建 Servlet 类的实例

    在实例化之后,Web 容器会调用 Servlet 的 init 方法来进行初始化操作。在init 方法中,可以进行一些一次性的初始化工作,如读取配置文件、建立数据库连接等。

    init 方法只会在 Servlet 生命周期中被调用一次

    2.服务(service)

    当客户端发送请求到服务器时,Web 容器会调用 Servlet 的 service 方法来处理请求。

    service方法会根据请求的类型(GET、POST 等),调用相应的doGet、doPost 等方法来具体处理请求,并生成响应。

    service方法在 Servlet 的生命周期中可能会被多次调用,每次处理一个客户端请求。

    3.销毁(destroy)

    当服务器关闭或 Web 应用被卸载时,Web 容器会调用 Servlet 的 destroy 方法。

    在 destroy方法中,可以进行一些清理资源的操作,如关闭数据库连接、释放占用的内存等。

    destroy 方法在 Servlet 的生命周期中也只会被调用一次。

    总结

    以上是我在这段时间所学,如果有不足及错误之处还请指正,如果觉得总结的还可以希望送上一个点赞支持

  • 相关阅读:
    【历史上的今天】6 月 30 日:冯·诺依曼发表第一份草案;九十年代末的半导体大战;CBS 收购 CNET
    TEINet: Towards an Efficient Architecture for Video Recognition 论文阅读
    代码随想录怎么样?我是这样刷的
    NeRF-VAE:将场景看作一个分布【ICML‘2021】
    Hudi数据湖技术引领大数据新风口(四)核心概念
    2022年全球市场弦乐器的弦总体规模、主要生产商、主要地区、产品和应用细分研究报告
    【笔试题】【day8】
    C#NPOI操作Excel,实现Excel数据导入导出(支持多个sheet)
    x210项目重新回顾之十六rootfs再讨论
    Android入门第11天-Android中RadioButton的使用
  • 原文地址:https://blog.csdn.net/weixin_74141526/article/details/143374129