第一次访问的时候调用init,然后service
第二次之后一直调用service
当服务器重启时调用destroy,注意是“重启”时,"关闭"的时候不会销毁!!
重启或启动后,第一次访问,同样调用init,然后service
以次类推
只有第一次访问的时候才会始终化,从第二次开始不再初始化,哪怕请求来自不同的客户端。
也就是说,服务器的一次启动之后只可能有一个servlet实例,所以只调用一次init,不管是几个客户端在请求这个servlet
在web.xml中加入配置
<load-on-startup>2<load-on-startup>
服务器启动的时候就去实例化它,而不是等到第一次访问才初始化它
数字越小,优先级越高
由此总结出,servlet有两种初始化方式:
1、通过某一客户端的第一次访问
2、通过在web.xml中配置load-on-startup由容器自动完成初始化
有这样一个servlet
String age;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
age = request.getParameter("age");
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name);
System.out.println(age);
}
分别通过两个浏览器去访问:
http://localhost/javaweb_interview/servlet/SleepServlet?name=zhangsan&age=20
http://localhost/javaweb_interview/servlet/SleepServlet?name=lisi&age=10
发现输出的结果是:
zhangsan
10
lisi
10
分析:
1、servlet是单实例的,它仅仅有唯一的一个实例
2、servlet是多线程的
尽量保证成员变量只读、不改,否则写成局部变量
getParameter()与getAttribute()
getParameter是客户端与服务器的关系
而与getAttribute是在服务器中进行对象保存后取出的一个操作,setAttribute与之对应,在request中传递