深入理解Servlet的生命周期与请求流程

转载请注明作者:@author:Edison丶梦楠

 

servlet的生命周期:创建对象-->初始化-->运行(服务)-->销毁

 

            1:调用实现类构造器创建对象

            2:对servlet初始化

            3:当我们请求的时候,tomcat才会利用对象调用service方法

           4:正常关闭tomcat服务器,调用destoty()方法(有时会不执行)

 

	public HelloServlet() {
		System.out.println("创建servlet对象");
	}

	public void init(ServletConfig config) throws ServletException {
		System.out.println("初始化....");
		
	}
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("服务.....");
	}
	public void destroy() {
		System.out.println("销毁.....");
		
	}
	
	public ServletConfig getServletConfig() {
		return null;
	}

	public String getServletInfo() {
		return null;
	}

 

当我们在浏览器中发出请求时,可以看到控制台打印出下列信息:

深入理解Servlet的生命周期与请求流程_第1张图片

而当我们第二次第三次请求时,却不会再创建对象和初始化,而是直接打印服务两个字。所以我们得出结论:servlet是单例的,并且在启动tomcat服务器后只会创建对象和初始化一次。以后的每一次请求,只要服务器不关闭,都是只执行该service()方法

关于销毁方法,有时会不执行,所以我们没必要在destory方法中编写一些类似释放资源的操作。

关于其余两个方法我们不关心,一个是获取作者、版权等信息,一个是获取servlet的配置信息。这两个方法都是由tomcat容器在调用。

总结:tomcat服务器管理了servlet

 

 

Servlet的请求流程:(重点)

localhost:8080/pss/hello

在浏览器中输入该地址,将发生以下情况:

1:解析域名

2:解析pss(上下文路径)和资源名称

3:首先找到Tomcat根路径下的/conf/server.xml文件,获取到该xml文件中的元素,再获取所有的path属性,找到path文本是pss的属性。通过该属性名再获取到当前的元素中的docBase属性值。该属性值就是当前项目的根路径。

4:进入该项目的根路径,找WEB-INF目录下的web.xml文件。

5:解析该文件,获取该xml文件中的所有的元素,并找到元素文本内容为/hello的。

找不到,就报404错误

找到了:就根据该元素所在mapping对应的找到中的,再根据此元素最终找到该servlet类的全限定名称。

6:去servlet的实例缓存池中看看有没有servlet对象

if (obj ==null ){

      //就说明是第一次请求

      GOTO  7

}else{

      //非第一次请求

GOTO   10,11

}

7:利用反射拿到我们创建的servlet类的字节码文件对象,利用该字节码文件对象的newInstance()方法,创建servlet对象。(所以我们要求我们的servlet类中必须要有一个公共的无参数构造器)

Class servlet= class.forName(“全限定名”); 

8:把该对象放入servlet的实例缓存池中,供下一次请求使用。(如果是关闭tomcat服务器重新启动,那么会再从第一步重来)

9:利用该servlet对象,tomcat会帮我们调用init方法。在调用之前会创建servletConfig对象,并传入到init方法中,然后初始化!

servlet.init(config);

10:tomcat再创建request和response对象,并传入到service方法中,利用servlet对象调用该方法,处理请求。

servlet.service(request,response);

11:在该service方法中,服务器再响应请求给客户端

 

关于web.xml配置

 

         servlet-name 保持和类名相同 
         servlet-class  类的所在包的全限定名

        mapping表示映射关系,通过此映射来找到上面的servlet
        servlet-name  保持和类名相同,原因是:通过此name找到servlet中的name,再找到servlet-class这个具体的类
        url-pattern   我们在浏览器中访问时的路径名称(理论上可以随便写,
        但是为了与资源表示出一种关系,最好写具有意义的url名称)。
        切记: 一定不要忘记加 /,否则会报404

 

深入理解Servlet的生命周期与请求流程_第2张图片

 

 

 

你可能感兴趣的:(深入理解Servlet的生命周期与请求流程)