https://www.cnblogs.com/vmax-tam/p/4122105.html

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方法调用!

学习之所以会想睡觉,是因为那是梦开始的地方。

[转]JavaWeb之 Servlet执行过程 与 生命周期的更多相关文章

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

    Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类实现了这个接口,这个类就是一个Servlet.Servlet下有一个实现类叫HttpServle ...

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

    Servlet执行流程(GET方式为例) 首先用户客户端浏览器发出Get方式(点击超链接方式)向浏览器发出请求. 服务器接收到客户端点击超链接,接收到GET请求之后,服务器到WEB.xml中<s ...

  3. Servlet执行流程和生命周期

    Servlet执行流程 Get方式请求HelloServlet ---> <a href="servlet/HelloServlet"> ↓ 服务器在配置文档中查 ...

  4. .NET MVC执行过程 及 生命周期步骤

    1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 Request 请求到来 IIS 根据请求特征将处理权移交给 ASP.NET UrlRoutingModule ...

  5. jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失

    jsp当做第二个servlet  request的生命周期   请求 响应  不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束  request的域消失

  6. java的servlet执行过程是怎么样的?

    java的servlet执行过程是怎么样   答: Servlet执行过程:程序第一次访问,会调用servlet的init()方法初始化(只执行一次),每次程序执行都会根据请求调用doGet()或者d ...

  7. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  8. JavaEE Servlet 核心方法及生命周期

    做JavaWeb开发,免不了要和Servlet打交道.Servlet是Sun(Oracle)官方定义的一个Web开发规范,所有Servlet开发都必须遵守.自己以前也没有从头做过Web开发,所以这方面 ...

  9. Servlet(API)生命周期

    一.最上层接口Servlet 查看Servlet接口源码: 有5个方法 访问过程(默认): 1.进行Servlet类加载 当Tomcat容器启动后,服务器寻找应用部署的描述文件(web.xml),从部 ...

随机推荐

  1. poj_1284_原根

    一開始看题的时候第一想法就是暴力,可是无奈数据量有点大,看了题解之后才知道原来牵扯到数论上的一个叫做原根的东西,这个题的题意就是,给你一个奇素数,问题他的原根有多少.依据初等数论上所说,此时牵扯到了三 ...

  2. Github:在Github上创建自己的代码仓库

    Github是一个分布式版本控制系统,最初由Linux之父Linus Torvalds编写,在云时代的今天已经成为了开发者管理代码和发现已有代码的最常用工具之一,下面我们将开始git之旅. 注册Git ...

  3. 【Android Studio探索之路系列】之中的一个:Android Studio开篇

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  4. Eclipse3.4以上使用dropins的插件安装方式

    Eclipse3.4以上版本支持使用dropins的插件安装方式,使用方便,共有四种使用方法: 1. 最简单的,直接将jar包放到dropins目录下eclipse/    dropins/ 2. 传 ...

  5. PHP多线程处理问题

    近日工作中涉及到项目同时处理多个线程问题时,在网上找到了PHP的pthreads扩展以及curl_multi_init函数,具体如下: 一 .windows下安装php真正的多线程扩展pthreads ...

  6. 带圈圈的数字1~50,求50以上,不要word的

    ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿

  7. Idea Cannot import to svn: Cannot run program "svn"

    svn 出此问题:意味着不可检出代码. 按此修改,重启IDEA即可检出svn代码.

  8. MvcPager帮助文档 - MvcAjaxOptions 类

    表示用于 MvcPager 在 Ajax 分页模式下的选项设置,该类继承自 AjaxOptions. 公共属性: 名称 说明 默认值 AllowCache 获取或设置一个值,该值指示是否在Ajax分页 ...

  9. shell脚本与mongo交互

    1.mongo提供*.js的方法供linux调用 #!/bin/bash /usr/local/mongodb/bin/mongo hostname/dbname xxx.js xxx.js 内容如下 ...

  10. Xcode, does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE) 解决办法

    在Build Settings中找到Enable Bitcode项,设置为如下: 参考:http://blog.csdn.net/soindy/article/details/48519363