Servlet工作原理.docx

上传人:b****5 文档编号:2889552 上传时间:2022-11-16 格式:DOCX 页数:11 大小:159.24KB
下载 相关 举报
Servlet工作原理.docx_第1页
第1页 / 共11页
Servlet工作原理.docx_第2页
第2页 / 共11页
Servlet工作原理.docx_第3页
第3页 / 共11页
Servlet工作原理.docx_第4页
第4页 / 共11页
Servlet工作原理.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Servlet工作原理.docx

《Servlet工作原理.docx》由会员分享,可在线阅读,更多相关《Servlet工作原理.docx(11页珍藏版)》请在冰豆网上搜索。

Servlet工作原理.docx

Servlet工作原理

Servlet工作原理

  Servlet运行在Servlet容器中,由容器负责Servlet实例的查找及创建工作,并按照Servlet规范的规定调用Servlet的一组方法,这些方法也叫生命周期的方法。

具体调用过程如下图所示:

Servlet生命周期详解

   如上图所示,Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。

下面针对每个阶段的编程任务及注意事项进行详细的说明。

 

(1)装载类及创建实例

   客户端向Web服务器发送一个请求,请求的协议及路径必须遵守如下的格式:

   http:

//serverip:

port/application-path/resource-path

   其中,serverip为Web服务器的IP地址,也可以是域名,比如:

192.168.0.1、202.196.152.115、

   localhost、等。

port为Web服务器的服务端口,如果是80端口可以不写。

   application-path为服务器中发布的某个应用的路径,如果为缺省应用(比如tomcat的ROOT)可以为

   空。

resource-path为客户端要访问的服务器中的资源的路径。

比如:

       http:

//localhost:

8080/serv-app/login.html表示通过8080端口访问本地机器上名字为路径为serv-app中/login.html对应的资源。

   http:

//localhost:

8080/serv-app/basic/time表示通过8080端口访问本地机器上路径为serv-app的应用中/basic/time对应的资源。

    那么Web服务器是如何解释该请求的路径,以及将资源发送给客户端呢?

在前面的“建立并发布一个Web应用”部分,我们说过Web服务器会将应用的路径/serv-app映射到磁盘的某个特定的目录结构,本例中为tomcat服务器中webapps目录下的serv-app。

/login.html和/basic/time为该应用下的资源的路径,该路径同应用路径一样为“虚拟的”路径,由服务器把它映射为系统的具体文件或程序,具体流程如下图所示:

 JavaEEWeb规范规定了服务器搜索Servlet类的路径为应用目录结构中WEB-INF/classes目录及WEB-INF/lib下的所有jar文件。

因此需要将TimeServlet按照如下的目录结构放到WEB-INF/classes中:

WEB-INF/classes/com/allanlxf/servlet/basic/TimeServlet.class

    该Servlet部署描述如下:

       

          TimeServlet

          com.allanlxf.servlet.basic.TimeServlet

        

       

          TimeServlet

          /basic/time

       

 I.何时创建Servlet实例?

   在默认情况下Servlet实例是在第一个请求到来的时候创建,以后复用。

如果有的Servlet需要复杂的操作需要载初始化时完成,比如打开文件、初始化网络连接等,可以通知服务器在启动的时候创建该Servlet的实例。

具体配置如下:

   

     TimeServlet

     com.allanlxf.servlet.basic.TimeServlet

      1

    

   其中标记的值必须为数值类型,表示Servlet的装载顺序,取值及含义如下:

  正数或零:

该Servlet必须在应用启动时装载,容器必须保证数值小的Servlet先装载,如果多个

            Servlet的取值相同,由容器决定它们的装载顺序。

   负数或没有指定

由容器来决定装载的时机,通常为第一个请求到来时。

 

(2)初始化

    一旦Servlet实例被创建,Web服务器会自动调用init(ServletConfigconfig)方法来初始化该Servlet。

其中方法参数config中包含了Servlet的配置信息,比如初始化参数,该对象由服务器创建。

 I.如何配置Servlet的初始化参数?

  在web.xml中该Servlet的定义标记中,比如:

   

        TimeServlet

        com.allanlxf.servlet.basic.TimeServlet

        

           user

           allanlxf

      

      

          blog

          

      

   

配置了两个初始化参数user和blog它们的值分别为allanlxf和,这样以后要修改用户名和博客的地址不需要修改Servlet代码,只需修改配置文件即可。

 II.如何读取Servlet的初始化参数?

      ServletConfig中定义了如下的方法用来读取初始化参数的信息:

      publicStringgetInitParameter(Stringname)

         参数:

初始化参数的名称。

         返回:

初始化参数的值,如果没有配置,返回null。

          比如:

getInitParameter(“user”)返回allanlxf

                getInitParameter(“blog”)返回

      publicjava.util.EnumerationgetInitParameterNames()

          返回:

该Servlet所配置的所有初始化参数名称的枚举。

 III.init(ServletConfig)方法执行次数

      在Servlet的生命周期中,该方法执行一次。

 IV.init(ServletConfig)方法与线程

     该方法执行在单线程的环境下,因此开发者不用考虑线程安全的问题。

 V.init(ServletConfig)方法与异常

   该方法在执行过程中可以抛出ServletException来通知Web服务器Servlet实例初始化失败。

一旦ServletException抛出,Web服务器不会将客户端请求交给该Servlet实例来处理,而是报告初始化失败异常信息给客户端,该Servlet实例将被从内存中销毁。

如果在来新的请求,Web服务器会创建新的Servlet实例,并执行新实例的初始化操作。

 VI.配置初始化参数VS覆盖init(ServletConfig)方法

    配置初始化参数与覆盖init(ServletConfig)方法并没有必然的联系,这是很多初学者容易搞混的地方。

配置初始化参数的目的是为了编写“通用”的Servlet,即通过改变初始化参数的值来改变Servlet的功能,而不必修改Servlet的源代码。

覆盖init(ServletConfig)方法的原因是某些Servlet为客户提供服务需要执行一次性的操作,比如申请资源、打开文件、建立网络连接等,这些操作要么比较耗时,要么这些资源是提供服务的必要条件。

 (3)服务

   一旦Servlet实例成功创建及初始化,该Servlet实例就可以被服务器用来服务于客户端的请求并生成响应。

在服务阶段Web服务器会调用该实例的service(ServletRequestrequest,ServletResponseresponse)方法,request对象和response对象有服务器创建并传给Servlet实例。

request对象封装了客户端发往服务器端的信息,response对象封装了服务器发往客户端的信息。

 I. service()方法的职责

    service()方法为Servlet的核心方法,客户端的业务逻辑应该在该方法内执行,典型的服务方法的开发流程为:

   解析客户端请求-〉执行业务逻辑-〉输出响应页面到客户端

 II.service()方法与线程

    为了提高效率,Servlet规范要求一个Servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,Servlet开发者必须保证该方法的线程安全性。

 III.service()方法与异常

    service()方法在执行的过程中可以抛出ServletException和IOException。

其中ServletException可以在处理客户端请求的过程中抛出,比如请求的资源不可用、数据库不可用等。

一旦该异常抛出,容器必须回收请求对象,并报告客户端该异常信息。

IOException表示输入输出的错误,编程者不必关心该异常,直接由容器报告给客户端即可。

 

IV.编写线程安全的资源

    由于Servlet实例的service()方法在同一时刻会运行到多线程的环境下,因此,编写Servlet不得不考虑的因素就是线程安全的问题,这也是编写Servlet最容易出错的地方。

下面对Servlet的方法和线程之间的关系以及编程的原则进行详细的说明。

 

 

编程注意事项说明:

1) 当ServerThread线程执行Servlet实例的init()方法时,所有的ClientServiceThread线程都不能执行该实例的service()方法,更没有线程能够执行该实例的destroy()方法,因此Servlet的init()方法是工作在单线程的环境下,开发者不必考虑任何线程安全的问题。

 2) 当服务器接收到来自客户端的多个请求时,服务器会在单独的ClientServiceThread线程中执行Servlet实例的service()方法服务于每个客户端。

此时会有多个线程同时执行同一个S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1