最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。
1,生命周期
servlet 声明周期可以分四个阶段:
- 类装载过程
- init() 初始化过程
- service() 服务过程,选择doGet \ doPost
- destroy() 销毁过程
代码模拟:
package com.aaa.Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* 项目名称:ServletDemo
* 类描述:("Servlet生命周期")
* 创建人:莫参商
* 创建时间:2020-1-15 下午4:18:24
* 修改人:acer
* @version
*
*/
@WebServlet("/ServletDemo02")
public class ServletDemo02 extends HttpServlet{
//初始化,也可以称为开始
@Override
public void init() throws ServletException {
System.out.println("Servlet开始咯... ...init()");
}
//service 请求发送 里面有 常用:get post 不常用:put delete
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("代码被执行... ...");
}
@Override
public void destroy() {
System.out.println("Servlet销毁咯... ...destroy()");
}
}
2,Servlet是单例,线程安全问题!
首先我们要知道,Servlet是单例模式,也就是说它只能被实例化一次。
我曾经面试的时候,面试官问我,你怎么证明Servlet是单例模式的?
怎么证明?
单例的特征,构造函数只会运行一次。
所以写一个构造函数就ok了
证明Servlet是单例
@WebServlet("/ServletDemo02")
public class ServletDemo02 extends HttpServlet{
public ServletDemo02(){
System.out.println("啦啦啦,我是ServletDemo02的构造函数!");
}
//初始化,也可以称为开始
@Override
public void init() throws ServletException {
System.out.println("Servlet开始咯... ...init()");
}
//service 请求发送 里面有 常用:get post 不常用:put delete
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("代码被执行... ...");
}
@Override
public void destroy() {
System.out.println("Servlet销毁咯... ...destroy()");
}
}
看结果,多次访问,但是构造函数只创建了一次,所以可以证明Servlet是单例。
init()方法是servlet自带的,本来就是执行一次,所以它无法成为是否为单例的证据。
拓展面试题:
怎么证明Servlet是单例模式的?
单例的特征,构造函数只会运行一次。