JavaWeb之 Servlet执行过程 与 生命周期

Servlet的概念

什么是Servlet呢?

  Java中有一个叫Servlet的接口,如果一个普通的类实现了这个接口,这个类就是一个Servlet。Servlet下有一个实现类叫HttpServlet,一个普通的java如果继承了HttpServlet类,覆盖了它的doGet和doPost方法,那么这个普通类也可以叫做Servlet。最后,servlet程序交给服务器运行!

  那么,当我们写好了一个Servlet,交给了服务器,它是如何执行的呢!?

Servlet的执行过程

我们写了一个Servlet名叫hello。那么浏览器是如何访问到这个资源呢?

要说这个,我们先来学习一下浏览器的地址输入。

  有这样一个输入:   http://localhost:8080/day10/hello

http:    http协议

localhost:   域名,到本地C盘下的hosts文件查找是否存在域名对应的ip映射记录地址。有的话就直接访问该IP,没有的话就到DNS上去找。

8080        端口号,这里指tomcat服务器。localhost匹配到tomcat的默认站点,到webapps目录下找web应用。

/day10      web应用的名称。在webapps下找是否存在day10的目录。

/hello       web资源。在day10web应用下查找是否有这个资源。(如果看不懂,最好先去了解一下tomcat里的文件结构。)

    这里/hello 资源就是我们写的一个Servlet,服务器得到这个字符串后就是经过以下过程来找到servlet的!

        ->   得到/hello字符串

        ->   使用/hello到web.xml文件中查找每一个<servlet-mapping>下的<url-pattern>标签里的内容,然后得到sevlet-name

        ->   使用sevlet-name去servlet标签中找到对应的相同名称的servlet配置。

        ->   得到servlet配置中的servlet-class内容。字符串:gz.itcast.a_servlet.HelloServlet

<servlet>
    <servlet-name>HelloServlet</servlet-name>   <servlet-class>com.vmaxtam.numzero.addServlet</servlet-class> </servlet> 

<servlet-mapping>   <servlet-name>HelloServlet</servlet-name>   <url-pattern>/hello</url-pattern> </servlet-mapping>

    最后通过反射实例化HelloServlet对象,然后调用HelloServlet中的方法。

Servlet的映射路径

<url-pattern>/hello</url-pattern> 这里的映射路径还可以用多种方式来填写!

                url-pattern                           浏览器输入URL

精确匹配                       /demo1                              http://localhost:8080/day10/demo1

                /itcast/demo1          http://localhost:8080/day10/itcast/demo1

模糊匹配

                   /*                                 http://localhost:8080/day10/任意路径

                  /itcast/*                            http://localhost:8080/day10/itcast/任意路径

                  *.后缀名                        http://localhost:8080/day10/任意路径.后缀。例如 *.do,*.action, *.html

注意:

1)url-pattern要以/开头,要么以*开头。demo1这种写法是错误的!!

2) /itcast/*.do 这种写法不合法。不能同时使用两种模糊匹配

3)当一个请求有多个servlet被匹配的情况下:

a)长的最像的url-pattern会优先被匹配

b)以后缀名结尾的url-pattern优先级最低!!!

说到这里,就有人问:这个只是在找Servlet文件,那么如果要找服务器的静态文件(html,xml等),服务器的执行过程如何??如果要找的文件不存在又会怎么样?

下面为大家讲解:

缺省路径

在tomcat服务器中有一个默认的Servlet,叫DefaultServlet,DefaultServlet的url-pattern为 / 。这个DefaultServlet的作用主要用于处理静态资源的请求。

    输入: http://localhost:8080/day10/test.html 如何找到资源呢?

        1)在day10的web应用下查找web.xml文件,用/test.html,存在匹配是否存在符合规则url-pattern,找到就会执行对应的动态资源(servlet)。

        2)如果找不到对应的url-pattern,则到day10当前web应用的根目录下查找一个test.html名称的静态资源文件。如果找到这个文件,DefaultServlet读取该静态文件内容输出到浏览器客户端。

        3)如果在day10下找不到test.html的静态资源文件,那么返回404的页面。

前面只说到服务器是如何找到Servlet这个文件,那么Servlet是如何执行的呢!!!这就是重点,Servlet的生命周期

Servlet的生命周期

tomcat服务器什么时候创建servlet对象?什么时候销毁对象?什么时候调用了什么方法?!

其实也就是这样的一个过程 :

      1.Servlet对象的创建。

      2.Servlet对象执行某些方法来给我们服务。

      3.Servlet对象的销毁。

而这个过程有4个很核心的方法需要执行:

构造方法: servlet对象创建时调用。默认情况下,第一次访问servlet时,servlet对象创建。只被调 用1次。servlet在tomcat服务器中是单实例的。

init方法:  在创建完servlet对象之后被调用。用于对servlet对象进行初始化。只调用1次。

service方法:每次发出请求时被调用。调用n次。

destroy方法: 在tomcat服务器停止或者web应用重新加载时调用。只调用1次。

下面我们用伪代码来演示一下 浏览器发出请求 到服务器作出相应 整个过程中Servlet的执行过程!

浏览器输入: http://localhost:8080/day10/hello

进入web.html查询资源。

得到字符串 gz.itcast.a_servlet.HelloServlet

模拟tomcat服务器内部的运行代码:

1)用反射构造HelloServlet对象

  1.1 得到字节码对象

    Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ")

  1.2 调用无参的构造方法构造对象

    Object obj = clazz.newInstance();       ----1.Servlet的构造方法被执行

2)创建ServletConfig对象,调用init方法

  2.1 得到init方法对象

    Method method = clazz.getDeclareMethod("init",ServletConfig.class);

  2.2 执行init方法

    method.invoke(obj, config);               --2. Servlet的init方法被执行

3)创建request和response对象,调用service方法

  3.1 得到service方法对象

    Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

  3.2 执行方法

    m.invoke(obj,request,response);          --3.Servlet的service方法被执行

4)tomcat服务器停止或web应用重新加载时,调用destroy方法

  4.1 得到destroy方法对象

    Method method = clazz.getDeclareMethod("destroy",null);

   4.2 执行方法

    method.invoke(obj,null);               --4.Servlet的destroy方法被执行

如果文字不够直观,那么我看可以看一下流程图

Servlet对象自动加载

引入

    默认情况下,servlet对象会在第一次请求servlet时被创建。创建完之后调用init方法。假如构造方法或者init方法执行的业务逻辑比较多,那么用户在第一次访问servlet时的等待会变长,影响用户的体验。

解决办法

    改变servlet的创建时机:让servlet对象在tomcat服务器启动web应用加载时创建。

在servlet的配置中,加入一个配置:

<load-on-startup>正整数</load-on-startup>


<servlet>

<servlet-name>LifeDemo1</servlet-name>

<servlet-class>gz.itcast.c_life.LifeDemo1</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

注意: 正整数的数值越大,创建的优先级就越低!!

Servlet的多线程安全问题

    结论: servlet在tomcat服务器中是单实例多线程的.

多线程并发问题

  多个线程之间同时操作了共享数据!!!

解决多线程并发问题

  给需要同步的代码块加上唯一的对象锁。

如何编写线程安全的servlet类:

  1)尽量不要使用成员变量。

  2)如果使用成员变量,要给用到了成员变量的代码块加上锁。尽量缩小同步代码块的范围,以避免因为同步导致执行效率问题。

Init方法

  在GenericServlet中提供了一个无参数的init方法!!!

    有参数的init:该方法是Servlet的四个生命周期方法中的一个,该方法一定会被服务器调用。在该方法中会调用无参数的init方法。

    无参数的init:该方法是Sun公司设计出来方便开发者进行重写,在该方法中实现对servlet对象的初始化工作,这个方法会被有参的init方法调用!

时间: 2024-10-12 07:55:23

JavaWeb之 Servlet执行过程 与 生命周期的相关文章

IOS应用的执行过程以及生命周期详解

iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没

servlet执行流程和生命周期

一.servlet执行流程: 二.生命周期: Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段.初始化阶段.服务阶段和实例销毁阶段. 1.初始化阶段  调用init()方法 2.响应客户请求阶段.调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法 3.终止阶段 调用destroy()方法 1.创建servlet实例: 在默认情况下Servlet实例是在第一个请求到来的时候创建,以后复用.如果有的Servlet需要复杂的

Servlet执行过程和声明周期

执行过程涉及三个要素:浏览器.web服务器.Servlet 1.浏览器发出请求:http://localhost:8080/...,链接web服务器 2.web服务器解析想要访问的主机名 3.web服务器解析出想要访问的web应用 4.web服务器解析出想要访问的web资源 5.web服务器创建Servlet实例对象(第一次访问) 6.Servlet调用init方法,完成对象的初始化 7.Servlet创建代表请求的resquest和代表响应的response,然后调用Servlet的servi

Servlet执行流程和生命周期【慕课网搬】

Servlet执行流程(GET方式为例) 首先用户客户端浏览器发出Get方式(点击超链接方式)向浏览器发出请求. 服务器接收到客户端点击超链接,接收到GET请求之后,服务器到WEB.xml中<servlet-mapping>标签中来寻找与之对应的URl地址,从而找到相对应的servlet名字,再根据该名字到标签中找与之相对应的处理类(继承至HttpServlet类),执行该类中的doget()[超链接方式,服务器可以自行分析]方法. Servlet的生命周期 调用构造方法创造servlet实例

Servlet(二)生命周期

Servlet的生命周期可以定义为从其被创建到其被销毁的整个流程,下面是Servlet生命的常规线路: 容器调用init()方法进行Servlet的初始化 Servlet调用service()方法去处理客户端的请求 容器调用destroy()方法将Servlet销毁 最后,Servlet被JVM的GC线程当作垃圾处理掉 init()方法: init()方法只会在创建Servlet时被调用一次,不管有多少用户请求.通常情况下,Servlet在容器第一次接收到用户请求时被创建,但也可以通过load-

Servlet的API和生命周期

一.Servlet的API(生命周期) (1)Servlet接口中的方法 1)init(ServletConfig config) 何时执行:servlet对象创建的时候执行(以上图为例:在浏览器中按地址第一次访问服务器时,Tomcat服务器会new 一个QuickstartServlet对象,并通过生成的对象调用init方法,init方法仅仅执行一次.) ServletConfig : 代表的是该servlet对象的配置信息. 参数作用: 1. 可以通过参数config获得该servlet的n

深刻理解Servlet运行机制和生命周期

servlet 运行在servlet 容器中,其生命周期由容器来管理.servlet 的生命周期通过 javax.servlet.Servlet接口中的init(),servce(),和destory();方法表示.1,加载和实例化servlet 容器负责加载和实例化servlet 当容器启动或在容器中检测到需要这个servlet来响应一个请求 时.创建servlet实例.容器通过java 的反射API来创建servlet实例.所以servlet中不应该提供带参数的构造函数.2,初始化在serv

Servlet的配置和生命周期

1 Servlet容器:运行Servlet.JSP.Filter等的软件环境    1)可以创建Servlet,并调用生命周期的方法 2 Servlet生命周期的方法: 1)构造器:只被调用一次,只有第一次请求Servlet时,创建Servlet实例,说明Servlet是单实例的. 2)init方法:只被调用一次,在创建好实例后立即被调用,用来初始化Servlet. 3)service:被多次调用,每次请求都调用service方法,实际用于响应请求 4)destroy:只被调用一次,在当前Ser

servlet必知细节(二)--servlet执行过程

servlet必知细节(二)--servlet执行过程 我们知道,servlet没有main函数,那么,servlet是怎么调用的呢? 实际上,servlet 是由tomcat调用的,tomcat调用servlet程序执行. 由调用栈可以看到,当一个请求过来时,Bootstrap类的main方法调用. 当用户在客户端发起url请求 :http://localhost/servletDemo/hello的时候,servlet的执行过程是怎样的? 上面学习,如果有错误,希望大家提出,共同提高,谢谢!