zoukankan      html  css  js  c++  java
  • Servlet配置方式+Servlet生命周期

    Servlet配置方式

    浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式 -- 基于xml的配置方式、基于注解的配置方式。

    1.基于xml文件的配置方式

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>Demo</servlet-name>
            <servlet-class>com.nenu.Demo</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>Demo</servlet-name>
            <url-pattern>/Demo</url-pattern>
        </servlet-mapping>
    </web-app>

    2.基于注解的配置方式

    在需要配置的类前面加:

    @WebServlet("/Demo1")

    例如前面的xml配置文件可以被替换为:

    @WebServlet("/Demo1")//这里配置Servlet
    public class Demo1 implements Servlet {
    
    }

    我们会在xml文件配置不直观,麻烦,而且xml中需要配置所有其他的东西,所以后期Servlet一般都用注解的方式替代。Servlet有很多注解,可以对Servlet更方便的配置。

    上述两种配置结果完全一样。

    Servlet的生命周期

    1.首先我们应该清楚Servlet层级关系:
    Servlet(接口)-->GenericServlet(抽象类,与协议无关的Servlet)-->HttpServlet(抽象类,实现了Http协议的Servlet)-->Custom Servlet(自定义的Servlet)
     
    2.下面通过Servlet接口来了解Servlet生命周期。

    1.概述

    1.作为一个对象来讲,一定会有创建、使用和回收的过程~

    2.java有专门的垃圾回收机制,会自动的帮助我们回收对象,有不同的算法对对象进行回收。我们首先需要了解基础,后期深入了解垃圾回收机制和java虚拟机内存结构等等。学过C++,C++的对象一定要释放。但Java你只需要创建对象就好了。

    • 声明周期显示到代码里,就是这样,Servlet类里面有五个方法:init、ServletConfig、service、getServletInfo、destory。
    • 其中init是servlet的初始化,service是servlet业务方法、destory释放了servlet对象
    • 其他两个方法与其声明周期无关

    2.init、 service和destory方法:

    我们在init、service、和destory三个方法设置后台输出输出,如果调用了相应方法就会在后台显示;

    从而方便我们判断servlet的声明周期情况:

    package com.nenu;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    @WebServlet("/Demo1")
    public class Demo1 implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("执行servlet的初始化");
        }//设置输出
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("执行servlet业务逻辑");
        }//设置输出
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("servlet的销毁");
        }//设置输出
    }

    (1)如下是启动项目之后后台的输出:

     说明调用了init方法,然后调用了service

    (2)再刷新几次,显示又调用了很多次service:

    • init方法执行一次,servlet对象就存在了,之后的访问都是使用同一个servlet对象。首先检测servlet容器里面有没有目标Demo1的实体类对象。没有的话创建一个,然后调用它的service;第二次再检测,没有则创建,有就直接用。这样可以节约很多内存空间,而且只需要有一个servlet目标对象即可。类似于我们打电话只需要一部手机接打电话,可以无限循环的打电话,而不需要每次打电话都换一台手机。
    • destory方法什么时候执行呢?tomcat一关,开始释放资源,当tomcat服务停掉了,装载servlet的对象就停掉了。
    • 那么对象怎样创建出来的呢,servlet方法是非静态方法,非静态方法的调用必须借助于对象。这里并没有看到new Demo1的对象,我们没看到并不代表不存在。而这一系列的完成都是由tomcat容器完成的。通过反射机制来创建对象。通反射机制拿到构造函数,反射创建对象一般都是调用无参的构造函数。

    下面通过实例感受无参构造函数的调用。


    3.无参构造函数:

    我们可以把无参的构造函数重写一下,添加到代码里:

    public Demo1(){
            System.out.println("创建了Servlet对象");
        }

    启动后的输出结果:

    输出结果印证了:是先构造对象(调用无参构造函数),再调用方法(init、service等)。

    而后关闭tomcat,对象销毁↓↓↓

    4.总结:

    (1)Servlet的生命周期(从创建到销毁):

    1. 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第三步。
    2. 调用init方法完成初始化操作
    3. 调用Servlet方法完成业务逻辑操作
    4. 关闭tomcat时,会调用destory方法,释放当前对象所占用的资源

    (2)Servlet声明周期方法

    包括无参构造函数、init、service、destory

    1. 无参构造函数只调用一次,创建对象
    2. init只调用一次、初始对象
    3. service调用N次,执行业务方法
    4. destory只调用一次,卸载对象
  • 相关阅读:
    EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法
    php多文件上传数组 转换
    windows svn 上传后 自动部署 到web目录下
    一组实用网址
    apache 虚拟ip
    ThinkPHP 空方法 显示
    thinkphp 创建子应用
    Zend Studio 9.0.4 新建项目
    鼠标悬浮停留三秒 显示大图
    mysql GROUP BY 与 ORDER BY 查询不是最新记录
  • 原文地址:https://www.cnblogs.com/yangf428/p/12522674.html
Copyright © 2011-2022 走看看