【Servlet生命周期】

Servlet生命周期的四个阶段

servlet的生命周期就是从servlet出现到销毁的全过程。

加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

实例化

servlet容器创建servlet对象。当发送servlet对应的请求,才会进行对象的创建。

初始化

servlet实例化后就会调用init()方法,只能调用一次,且是在进行第一次实例化servlet对象时调用。

执行状态

service()方法是执行实际任务的主要方法,Web服务器将调用service方法处理客户端(浏览器)的请求,然后将格式化的数据响应给浏览器客户端。每当客户端向服务端发送一个请求时,服务端都会产生一个新的线程调用服务。service方法将会检测客户端发送给服务端的HTTP请求协议的类型,从而调用service方法中的 doGet、doPost、doPut、doDelete 等方法进行实际任务的逻辑处理,注意此时不会重新创建servlet实例,也不会调用init()方法。

销毁状态

servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除。

设置对应servlet的优先级(loadOnStartup)

如果需要某个servlet随着容器加载时就创建,而不是在使用时才创建。可以通过load-on-startup=6设置,正数数值越低优先级别越高,优先实例化。

方式一:注解方式验证

@WebServlet(urlPatterns = {"ServletLifeCycle01"},loadOnStartup = 6)
public class ServletLifeCycle01 extends HttpServlet {
    private static final long serialVersionUID = -8456388106455722944L;
	// 实例化
    public ServletLifeCycle01() {
        System.out.println("ServletLifeCycle01实例化 ServletLifeCycle01()");
    }
	// 初始化
    @Override
    public void init() throws ServletException {
        System.out.println("ServletLifeCycle01初始化 init()");
    }
	// 执行
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletLifeCycle01 执行代码 service()");
    }
	// 销毁
    @Override
    public void destroy() {
        System.out.println("ServletLifeCycle01销毁 destroy()");
    }
}

方式二:配置web.xml文件进行实例化

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletLifeCycle02</servlet-name>
        <!--servlet类完全限定名-->
        <servlet-class>com.lihaozhe.servlet.lifecycle.ServletLifeCycle02</servlet-class>
        <!--
            服务启动时是实例化Servlet类 注意 load-on-startup必须配在配置行的最末行 参数为非负整数
            数值越小的正整数 越趋近于零 优先级越高 零的优先级别最高
        -->
        <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletLifeCycle02</servlet-name>
        <!--地址栏映射-->
        <url-pattern>/ServletLifeCycle02.action</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletLifeCycle02</servlet-name>
        <!--地址栏映射-->
        <url-pattern>/ServletLifeCycle02.do</url-pattern>
    </servlet-mapping>
</web-app>
public class ServletLifeCycle02 extends HttpServlet {
    private static final long serialVersionUID = 7270727006887688108L;

    public ServletLifeCycle02() {
        System.out.println("ServletLifeCycle02实例化 ServletLifeCycle02()");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("ServletLifeCycle02初始化 init()");
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletLifeCycle02 执行代码 service()");
    }

    @Override
    public void destroy() {
        System.out.println("ServletLifeCycle02销毁 destroy()");
    }
}

初始化参数配置

HttpServlet继承了GenericServlet,
在这里插入图片描述
GenericServlet实现了Servlet接口和ServletConfig接口
在这里插入图片描述

ServletConfig

getServletConfig()方法来获取ServletConfig对象,ServletConfig对象可以获取到Servlet的一些信息,ServletName、ServletContext、InitParameter、InitParameterNames等。

注解方式

@WebServlet(name = "ServletConfig01", value = "/ServletConfig01",initParams = @WebInitParam(name="zs",value="zhangsan"))
public class ServletConfig01 extends HttpServlet {
    private static final long serialVersionUID = -5651439538417317409L;
    private ServletConfig config;
    public ServletConfig01() {
        System.out.println("ServletConfig01实例化 ServletConfig01()");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("ServletConfig01初始化 init()");
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config= config;
        System.out.println("ServletConfig01初始化 init(config)");
        String zs = config.getInitParameter("zs");
        System.out.println("ServletConfig01 init(config) 获取参数" + zs);
    }
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletConfig01执行 service()");
        String zs = config.getInitParameter("zs");
        System.out.println("ServletConfig01 service() 获取参数" + zs);
    }
    @Override
    public void destroy() {
        super.destroy();
    }
}

返回

ServletConfig01实例化 ServletConfig01()
ServletConfig01初始化 init(config)
ServletConfig01 init(config) 获取参数zhangsan
ServletConfig01执行 service()
ServletConfig01 service() 获取参数zhangsan
@WebServlet(name = "ServletConfig02", value = "/ServletConfig02",initParams = @WebInitParam(name="zs",value="zhangsan"))
public class ServletConfig02 extends HttpServlet {

    private static final long serialVersionUID = 6435828475163018742L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletConfig02 执行 service()");
        ServletConfig config = this.getServletConfig();
        String zs = config.getInitParameter("zs");
        System.out.println("ServletConfig02 service() 获取参数"+zs);
    }
}

返回

ServletConfig02 执行 service()
ServletConfig02 service() 获取参数zhangsan

配置web.xml方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletConfig03</servlet-name>
        <!--servlet类完全限定名-->
        <servlet-class>com.lihaozhe.servlet.config.ServletConfig03</servlet-class>
        <init-param>
            <param-name>zs</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
            <param-name>ls</param-name>
            <param-value>lisi</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletConfig03</servlet-name>
        <!--地址栏映射-->
        <url-pattern>/ServletConfig03</url-pattern>
    </servlet-mapping>
    <servlet>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletConfig04</servlet-name>
        <!--servlet类完全限定名-->
        <servlet-class>com.lihaozhe.servlet.config.ServletConfig04</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--别名 使用简短的名字来表示servlet类完全限定名-->
        <servlet-name>ServletConfig04</servlet-name>
        <!--地址栏映射-->
        <url-pattern>/ServletConfig04</url-pattern>
    </servlet-mapping>
</web-app>
public class ServletConfig03 extends HttpServlet {
    private static final long serialVersionUID = -3771332345541718841L;
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletConfig03 执行 service()");
        ServletConfig config = this.getServletConfig();
        String zs = config.getInitParameter("zs");
        String ls = config.getInitParameter("ls");
        System.out.println("ServletConfig03 service() 获取参数 zs="+zs);
        System.out.println("ServletConfig03 service() 获取参数 ls="+ls);
        Enumeration<String> names = config.getInitParameterNames();
        Iterator<String> it = names.asIterator();
        while (it.hasNext()){
            String name = it.next();
            System.out.println(name + ">>>"+config.getInitParameter(name));
        }
    }
}

返回

ServletConfig03 执行 service()
ServletConfig03 service() 获取参数 zs=zhangsan
ServletConfig03 service() 获取参数 ls=lisi
zs>>>zhangsan
ls>>>lisi
public class ServletConfig04 extends HttpServlet {
    private static final long serialVersionUID = -3771332345541718841L;
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletConfig04 执行 service()");
        ServletConfig config = this.getServletConfig();
        String zs = config.getInitParameter("zs");
        String ls = config.getInitParameter("ls");
        System.out.println("ServletConfig04 service() 获取参数 zs="+zs);
        System.out.println("ServletConfig04 service() 获取参数 ls="+ls);
        Enumeration<String> names = config.getInitParameterNames();
        Iterator<String> it = names.asIterator();
        while (it.hasNext()){
            String name = it.next();
            System.out.println(name + ">>>"+config.getInitParameter(name));
        }
    }
}

返回参数为null

ServletConfig04 执行 service()
ServletConfig04 service() 获取参数 zs=null
ServletConfig04 service() 获取参数 ls=null

注意:只对局部有效

ServletContext

ServletContext对象是servlet上下文对象,可以获取servlet的路径,等方法。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.cj.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql:///homewmall</param-value>
    </context-param>
    <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>
</web-app>
@WebServlet(name = "ServletContext01", value = "/ServletContext01")
public class ServletContext01 extends HttpServlet {
    private static final long serialVersionUID = 3061405452142996839L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ServletContext01");
        ServletContext context = this.getServletContext();
        String driver = context.getInitParameter("driver");
        String url = context.getInitParameter("url");
        String username = context.getInitParameter("username");
        String password = context.getInitParameter("password");
        System.out.println("driver >>> " + driver);
        System.out.println("url >>> " + url);
        System.out.println("username >>> " + username);
        System.out.println("password >>> " + password);

    }
}

返回

ServletContext01
driver >>> com.mysql.cj.jdbc.Driver
url >>> jdbc:mysql:///homewmall
username >>> admin
password >>> 123456

注意:配置context-param全局有效

获取路径

@WebServlet(name = "ServletContext02", value = "/ServletContext02")
public class ServletContext02 extends HttpServlet {
    private static final long serialVersionUID = 6020470277660717008L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        // getContextPath() 获取上下文路径
        System.out.println(context.getContextPath());
        System.out.println(request.getContextPath());
        // getRealPath(“/”) 获取项目在操作系统的绝对路径
        System.out.println(context.getRealPath("/"));
        System.out.println(request.getRealPath("/"));
    }
}

返回

/lhz
/lhz
/home/lhz/IdeaProjects/javaweb/src/main/webapp
/home/lhz/IdeaProjects/javaweb/src/main/webapp

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rita_zzf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值