浅谈servlet

一个Servlet的生命周期如下:

1 如果在容器配置文件web.xml中设置了load-on-startup字段,则表示容器在启动时就会自动创建servlet的实例,同时执行其init方法。

 <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>MySevelet</servlet-name>
    <servlet-class>sevelet.MySevelet</servlet-class>
    <init-param>
    	<param-name>initparam</param-name>
    	<param-value> test-Servelet</param-value>
    </init-param>
    <load-on-startup>10</load-on-startup>
  </servlet>

 init方法执行顺序是先执行

public void init() throws ServletException {
 //先执行无参数的init方法
}
public void init(ServletConfig config) throws ServletException {
//接着执行初始化时的有参init方法
		super.init(config);
		String initParam=config.getInitParameter("initparam");
}

 ;如果没有设置load-on-startup字段,则在第一个客户端访问该servlet时,在开始创建该servlet的实例,同时执行init方法,无论是那种方式,init方法都只会执行一次。

2.当一个客户端的请求到达Server服务器后,Server创建一个请求对象request,Server创建一个响应对象response对象
3.Server激活Servlet的service()方法,传递请求request和响应response对象作为参数
4.service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
5.service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。
6.对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

 

一般在开发过程中,最容易犯得错误就是没有对servlet进行并发安全性的注意。servlet本身是unsafe的,因此在使用时,最好是不要对其增加状态变量,如果非要使用,那么必须对其进行同步互斥操作,保证状态的一致性和正确性,安全性。最简单的方法就是对service方法加上synchronized关键字,servlet的每一个客户端请求都是通过service方法进行处理的,这样每一个客户端在访问时操作变成了顺序执行的了,故其结果必然不会产生混乱,但是效率却要大大折扣。当然其它的更好的方法就是对所有的原子操作进行 加锁,从而使得在保证并发的同时,使得状态一致。

你可能感兴趣的:(servlet)