Servlet周期
Servlet的生命周期一般分为四个阶段,Servlet的产生,初始化,调用Servlet方法,最后是对Servlet的销毁.标志这个Servlet生命周期的结束.
1.Servlet的产生.
一个Servlet的产生是因为客户端有一个request请求的过来.这样服务器会生产一个Servlet.而且一个Servlet只生成一次.即服务器只加载对于一种Servlet只会加载一次.
在服务起内部首先会判断服务器的JVM是否已经加载了这个Servlet(内部是以这样的形式加载Class.forName(“Servlet名字”),该方法加载这个类,并生成该类的实例.)
如果没有就加载这个Servlet.若有,则直接跳过加载这步,进入初始化inti().
2.Servlet的初始化inti()
在加载一个Servlet后,服务器会自动调用inti()方法,默认的是调用有参的初始化方法
public void inti(ServletCongfig config)throws ServletException{
this.config=config;
inti();
}
生成一个config.这样在之后Servlet方法中可以直接调用ServletConfig()的一些方法,而不必在前面加getServletConfig().getIntiParameter()来获得自己想要的初始化参数.
2.1初始化方法的覆盖:
我们在初始化某个Servlet的时候有两种方法
2.1.1 直接覆盖有参的inti方法.
当我们生成一个Servlet后,服务器会默认的调用有参的inti(),那么若我们覆盖了这个方法,服务器首先调用的就是我们覆盖后的inti(),不会去调用父类的初始化方法,这样就无法生成一个config.所以我们的这种方法方式覆盖,需要我们在覆盖的方法中调用父类的inti(),即super.inti(config).
2.1.2 覆盖无参的inti()方法
由上可知,生成一个Servlet,会自动调用有参的inti()方法,生成一个config.而在有参的inti()方法中,有调用了无参的inti(),那么我们只需要覆盖无参的inti()方法,并在里面添加我们需要的信息即可.这种方法较为简单,推荐使用这种方式.
2.2 初始化次数
Servlet的初始化只发生在某个Servlet第一次被客户端调用的情况下.因此一个生命周期只调用一次初始化方法.
2.3 初始化的配置
Servlet的配置是在服务器的web.xml中,
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.tarena.bank.xxx</servlet-class>
<inti-param>
<param-name>xx</param-name>
<!– 初始化参数的名字 –>
<param-value>xx</param-value>
<!– 初始化参数对应的值 –>
</inti-param>
<load-on-startup>1</load-on-startup>
<!– 表示服务器自动加载,其中的1代表加载的顺序,数值越小表示越被早加载,若出现相同的数值,具体的调用顺序由服务器jvm决定 –>
</servlet>
2.2 初始化失败
若我们在调用初始化方法失败的话,那么该Servlet会被直接销毁,调用destroy().
3. 调用service方法
在这个阶段,客户端可以多次调用该方法,在每一个客户端request过来时,服务器就新起一个线程来执行一个Servlet.每个Servlet会调用service,并根据相应的请求类型来调用相应的doXXX方法.
3.1 具体实现
service方法的调用有两种方式.
3.1.1 直接覆盖service()方法,在service()方法中deal request and response.
3.1.2 覆盖相应的doXXX方法,常用的有doGet(),doPost().这个两个方法分别对应get and post request.
3.2 多线程问题
在这个阶段,主要需要我们去考虑的是多线程并发的问题,对于一些共享类型的数据我们就需要保证其在多线程并发安全访问的问题,这里就是加synchronized标记.
代码中,对于一些有可能存在多并发访问安全的地方加锁即可,而不比对所由方法加锁,具体需要自己去斟酌.
3.3 需要同步的资源
成员变量,静态变量,数据库连接,网络资源,文件等.
4. service的销毁–destroy()
当服务器决定销毁servlet时,就会调用这个方法,一般我们在这个方法中作一些于inti()相反的工作,例如释放数据库的连接,文件的关闭,终止后台进程等工作.
还有,当我们决定销毁该servlet时候,不要把需要持久话的对象存放在内存中,因为在关闭的时候可能没有存放进数据库,造成数据的丢失.
5. 具体的数据流程图
servlet
|
|生成实例
|——–inti()
| |
| |成功
|失败 |
| ready
| |
| |
|——destroy
0 条评论。