java基础⾯试题(Servlet⽣命周期)
包头学校Servlet运⾏在Servlet容器中,其⽣命周期由容器来管理。Servlet的⽣命周期通过javax.servlet.Servlet接⼝中的init()、service()和destroy()⽅法来表⽰
Servlet的⽣命周期包含了下⾯4个阶段:
1.加载和实例化
2.初始化
3.请求处理
4.服务终⽌
Web服务器在与客户端交互时Servlet的⼯作过程是:
1. 在客户端对web服务器发出请求
2. web服务器接收到请求后将其发送给Servlet
3. Servlet容器为此产⽣⼀个实例对象并调⽤ServletAPI中相应的⽅法来对客户端HTTP请求进⾏处理,然后将处理的响应结果返回给WEB服务器.
4. web服务器将从Servlet实例对象中收到的响应结构发送回客户端.
servlet的⽣命周期:
黄海波最新电影1.加载和实例化
Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第⼀个请求时,创建Servlet实例。当Servlet容器
启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地⽂件系统、远程⽂件系统或者其他的⽹络服务中通过类加载器加载Servlet类,
成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调⽤的是Servlet的默认构造⽅法(即不带参数的构造⽅法),所
以我们在编写Servlet类的时候,不应该提供带参数的构造⽅法。
2.初始化
在Servlet实例化之后,容器将调⽤Servlet的init()⽅法初始化这个对象。初始化的⽬的是为了让Servlet对象在处理客户端请求前完成⼀些初始化的⼯作,
如建⽴数据库的连接,获取配置信息等。对于每⼀个Servlet实例,init()⽅法只被调⽤⼀次。在初始化期间,Servlet实例可以使⽤容器为它准备的
ServletConfig对象从Web应⽤程序的配置信息(在l中配置)中获取初始化的参数信息。在初始化期间,如果发⽣错误,Servlet实例可以抛出
ServletException异常或者UnavailableException异常来通知容器。ServletException异常⽤于指明⼀般的初始化失败,例如没有到初始化参数;⽽
UnavailableException异常⽤于通知容器该Servlet实例不可⽤。例如,数据库服务器没有启动,数据库连接⽆法建⽴,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可⽤。
国家奖学金申请理由怎么写I.如何配置Servlet的初始化参数?银赫 iu
在l中该Servlet的定义标记中,⽐如:
<servlet>
<servlet-name>TimeServlet</servlet-name>
<servlet-class>com.allanlxf.servlet.basic.TimeServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>username</param-value>
</init-param>
<init-param>
<param-name>blog</param-name>
<param-value>。。。</param-value>
</init-param>
</servlet>
配置了两个初始化参数user和blog它们的值分别为username和。。。,这样以后要修改⽤户名和博客的地址不需要修改Servlet代码,只需修改配置⽂件即可。
II.如何读取Servlet的初始化参数?
ServletConfig中定义了如下的⽅法⽤来读取初始化参数的信息:
public String getInitParameter(String name)
参数:初始化参数的名称。
返回:初始化参数的值,如果没有配置,返回null。
III.init(ServletConfig)⽅法执⾏次数
调整最低工资标准在Servlet的⽣命周期中,该⽅法执⾏⼀次。
IV.init(ServletConfig)⽅法与线程
屈原的诗该⽅法执⾏在单线程的环境下,因此开发者不⽤考虑线程安全的问题。
V.init(ServletConfig)⽅法与异常
该⽅法在执⾏过程中可以抛出ServletException来通知Web服务器Servlet实例初始化失败。⼀旦ServletException抛出,Web服务器不会将客户端请求交给该Servlet实例来处理,⽽是报告初始化失败异常信息给客户端,该Servlet实例将被从内存中销毁。如果在来新的请
求,Web服务器会创建新的Servlet实例,并执⾏新实例的初始化操作
3.请求处理
Servlet容器调⽤Servlet的service()⽅法对请求进⾏处理。要注意的是,在service()⽅法调⽤之前,init()⽅法必须成功执⾏。在service()⽅法中,
Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进⾏处理后,调⽤ServletResponse对象的⽅法设置响应信息。在service
()⽅法执⾏期间,如果发⽣错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指⽰了该实
例永久不可⽤,Servlet容器将调⽤实例的destroy()⽅法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可⽤)响应
。
如果UnavailableException异常指⽰了该实例暂时不可⽤,那么在暂时不可⽤的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂
时忙,不能处理请求)响应。
I. service()⽅法的职责
service()⽅法为Servlet的核⼼⽅法,客户端的业务逻辑应该在该⽅法内执⾏,典型的服务⽅法的开发流程为:
解析客户端请求-〉执⾏业务逻辑-〉输出响应页⾯到客户端
II.service()⽅法与线程
为了提⾼效率,Servlet规范要求⼀个Servlet实例必须能够同时服务于多个客户端请求,即service()⽅法运⾏在多线程的环境下,Servlet 开发者必须保证该⽅法的线程安全性。
III.service()⽅法与异常
service()⽅法在执⾏的过程中可以抛出ServletException和IOException。其中ServletException可以在
处理客户端请求的过程中抛出,⽐如请求的资源不可⽤、不可⽤等。⼀旦该异常抛出,容器必须回收请求对象,并报告客户端该异常信息。IOException表⽰输⼊输出的错误,编程者不必关⼼该异常,直接由容器报告给客户端即可。
编程注意事项说明:
1) 当Server Thread线程执⾏Servlet实例的init()⽅法时,所有的Client Service Thread线程都不能执⾏该实例的service()⽅法,更没有线程能够执⾏该实例的destroy()⽅法,因此Servlet的init()⽅法是⼯作在单线程的环境下,开发者不必考虑任何线程安全的问题。
2) 当服务器接收到来⾃客户端的多个请求时,服务器会在单独的Client Service Thread线程中执⾏Servlet实例的service()⽅法服务于每个客户端。此时会有多个线程同时执⾏同⼀个Servlet实例的service()⽅法,因此必须考虑线程安全的问题。
3) 请⼤家注意,虽然service()⽅法运⾏在多线程的环境下,并不⼀定要同步该⽅法。⽽是要看这个⽅法在执⾏过程中访问的资源类型及对资源的访问⽅式。分析如下:
i. 如果service()⽅法没有访问Servlet的成员变量也没有访问全局的资源⽐如静态变量、⽂件、数据库连接等,⽽是只使⽤了当前线程⾃⼰的资源,⽐如⾮指向全局资源的临时变量、request和response对象等。该⽅法本⾝就是线程安全的,不必进⾏任何的同步控制。
ii. 如果service()⽅法访问了Servlet的成员变量,但是对该变量的操作是只读操作,该⽅法本⾝就是线程安全的,不必进⾏任何的同步控制。
iii. 如果service()⽅法访问了Servlet的成员变量,并且对该变量的操作既有读⼜有写,通常需要加上同步控制语句。
iv. 如果service()⽅法访问了全局的静态变量,如果同⼀时刻系统中也可能有其它线程访问该静态变量,如果既有读也有写的操作,通常需要加上同步控制语句。
v. 如果service()⽅法访问了全局的资源,⽐如⽂件、数据库连接等,通常需要加上同步控制语句。
4.服务终⽌
当容器检测到⼀个Servlet实例应该从服务中被移除的时候,容器就会调⽤实例的destroy()⽅法,以便让该实例可以释放它所使⽤的资源,保存数据到持久存
储设备中。当需要释放内存或者容器关闭时,容器就会调⽤Servlet实例的destroy()⽅法。在destroy()⽅法调⽤之后,容器会释放这个Servlet 实例,该实例
随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建⼀个新的Servlet实例。
在整个Servlet的⽣命周期过程中,创建Servlet实例、调⽤实例的init()和destroy()⽅法都只进⾏⼀次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调⽤它的service()⽅法,为接收到的请求服务。
发布评论