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. C# 多线程控制 通讯

    一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...

  2. ubuntu14.10环境下使用apache2.2配置代理服务器

    参考网址: 使用Apache架设代理服务器 ubuntu之apache正向代理及反向代理(ProxyPass\ProxyPassReverse) Apache配置正向代理与反向代理 我的配置步骤: 1 ...

  3. S6:组合模式 Composite

    将对象组合成树形结构以表示整体-部分的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. UML: 示例代码:透明组合:叶节点和子节点具有相同的接口 abstract class Com ...

  4. Python——在Unicode和普通字符串之间转换

    1.1. 问题 Problem You need to deal with data that doesn't fit in the ASCII character set. 你需要处理不适合用ASC ...

  5. C/C++获取当前系统时间

    个人觉得第二种还是比较实用的,而且也是最常用的~ 不过当计算算法耗时的时候,不要忘记second,不能只要用Milliseconds来减,不然后出现负值,若是算法耗时太长就得用minutes啦.再不然 ...

  6. libevent2源码分析之五:关键的调用链

    用一个调用链来表示函数调用的流程,看起来更直观.根据上面的分析,总结了一些重要的调用链. 初始化 event_base_new event_base_new_with_config min_heap_ ...

  7. Cookie小案例-----记住浏览过的商品记录

    Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中非经常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能例如以下: 1, ...

  8. 【Excle】两个表格多列数据对比,找出差异

    现在有表格如下,差异A中的红色标记为区域1在区域2中找不到对应的值,差异B中的红色标记为区域2在区域1中找不到对应的值 那么怎么去查找呢? 这里用到COUNTIF跟数组公式 C3=SUM(COUNTI ...

  9. 【c语言】不用大与小与号,求两数最大值

    // 不用大与小与号,求两数最大值 #include <stdio.h> int max(int a, int b) { int c = a - b; int d = 1 << ...

  10. 程序员的笔记工具——Markdown

    安利一款轻量级的标记语言——Markdown 如上,Markdown作为一门语言,十分钟即可入门,熟练以后麻麻再也不用担心我在文章排版上浪费时间了!! 入门资源可参考如下回答(建议拣一条完整的看完上手 ...