Servlet的生命周期
与CGI不同的是,Servlet处理请求的方式就显得巧妙很多了,服务器在已经自启动或者是有人第一次请求时,初始化一个Servlet对象,然后就可以用这个对象去处理客户端的请求,在关闭服务器时再去销毁这个对象,这样可以减少开辟和销毁Servlet所需的开销。不管有多少请求,只会有一个Servlet实例,如果遇到了并发请求的情况,服务器会启用多个线程分别执行Servlet的service()方法。
对于一个Servlet对象,init和destory方法均只会被服务器调用1次,而service方法在每次客户端请求时都会被调用。
加载Servlet:由Servlet容器完成
一般服务器加载和实例化Servlet有三种情况:1)自启动时会自动装入Servlet 2)如果没有自动装入Servlet,那么在首次向Servlet发送请求时,也会装入Servlet 3)重新加载Servlet时,也会装入Servlet.
首次发送请求时加载
首次发送请求时加载Servlet是指,访问特定的URL时,与此URL映射的Servlet被调用,且被加载到内存当中。下面以代码为例:
一般当第一次加载Servlet时,系统响应会比较慢,因为服务器系统要进行内存的配置。当Servlet被加入进内存中后,系统的响应效率就会大大提高。
自动加载Servlet
一般是在服务器启动时,Servlet自动加入内存,一但Servlet被加入运行环境,Servlet就不会轻易被删除,直至服务器重新启动。下面以代码为例:
节点表明了Servlet是否被自动加载,当节点中参数大于0时,会自动加载,当参数越小,加载越优先。一般自动加载的Servlet运行起来比调用加载更快。使用自动加载一般是对全局范围内的Servlet提供的加载模式。
init()方法
Servlet被实例化了之后,Servlet容器调用Servlet的init(ServletConfig sc)方法来为每个实例进行实例化,该方法的参数是ServletConfig类。下面我们来演示一下在Servlet的init()方法中获得参数以后,放入全局变量中,然后在Servlet的doGet方法中调用init()方法获得的参数。代码如下:
在该文件中添加了Servlet并设置了初始值,而且在节点中设置了初始值,这些初始值在Servlet被实例化时,被初始化。下面来编写Servlet来获得初始值。这个文件里面的Servlet是还没有被创建的Servlet,下面来进行创建:
处理请求的方法:service()方法
当用户的请求到达Service服务器时,服务器为接收到的请求创建一个“请求”对象request和一个响应对象response,然后服务器调用Servlet的service()方法来把请求和响应传递给相应方法进行处理。当需要修改服务器端数据时,需要使用doPost()方法,当一个客户通过HTML表单发出一个HTTP GET请求时或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL后面,并与这个请求一起发送。当不会修改服务器端数据时,应该使用doGet()方法。Servlet中默认的处理方法是doGet()方法。
下面通过例子来加深对doGet和doPost方法的理解:
这是一个Serclet的登陆界面的Servlet。该Servlet中省略了doPost()方法和init()方法,将form表单提交的方法设置为post方法,提交到哪个文件由action设置,设置提交到名为Method_Servlet的Servlet中,现在编写Method_Service.
在这个Servlet中,doGet()方法和daPost()方法都通过getParameter()方法来获得登录用户名和登陆密码,然后把获得的用户名和密码显示在页面中。Servlet信息要添加到web.xml中才能被访问到,在工程study_servlet中web.xml文件中编写下列代码:
web.xml文件用来设置Servlet的名称和访问Servlet的路径。
销毁Servlet:destroy()
当Servlet容器不在需要某个Servlet实例时,他会调用Servlet的destroy()方法。在Servlet中,Servlet释放掉所有在init()方法中申请的资源,如在init()方法中初始化的参数,一但一个Servlet实例被终结,就不能在被调用,只能等待被卸载.Servlet容器关闭以后,一个Servlet也会被关闭.