[size=medium][color=darkred]Servlet lifecycle can be summarized as;
1. Loading and Instantiation
2. Initialization
3. Service client
4. Destroy
1.Load and Instantiation
when a servlet is loaded ?
a. the servlet container is started
web.xml:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
...省略部分内容...
...省略部分内容...
<load-on-startup>1</load-on-startup>
</servlet>
其中<load-on-startup>1</load-on-startup>便是为这个默认Servlet指定了创建时机, 即是说<load-on-startup>元素是用来指定Servlet被加载的次序.这里的内容必须是一个整型数值,且越小越先加载.比如如果设定为数值0,会在web应用程序部署时就加载.(注意, 如果我们把这个元素的内容误设为为负数或未设定任何元素,客户端会在首次请求时加载,这就好比是没有用到</load-on- startup>元素,其实我们在为Servlet创建映射时,一般不会指定</load-on-startup>元素
b. first request comes
when client's request comes, servlet container instantiate a servlet and invoke method init() only once in a servlet cycle.
说明:在第4点, 我们在为运行的Servlet程序配置时,并未用到<load-on-startup>,尽管每个<servlet>元素下都可以有一个<load-on-startup>元素,其实我们也是可以指定这个元素从而指定它所映射的Servlet的映射顺序. 另外,我们还可以在conf/web.xml文件中发现激活器(第5点提到)也用到<load-on-startup>2</load -on-startup>这个元素,且元素内容为2,这就是说,会加载默认的Servlet对象后再加载激活器Servlet.
>>init方法只被调用一次. 但是service方法可能会被调用多次,原因是当客户端第一次请求访问Servlet时,会先创建这个Servlet实例对象并调用init方法,当再次访问时,由于Servlet引擎检测到已创建了Servlet实例对象,这时候,只是把这次调用所封装的新的HttpServletRequest对象和HttpServletResponse对象传递给service方法进行操作注意:当客户端已经在访问这个Servlet时,便说明这个Servlet实例已经加载到服务器端的内存中,而当我们在服务端改变这个Servlet程序时,客户端仍是访问以前的Serlet 原因如下:由于这个Servlet只被加载一次,我们对它的修改,只是硬盘上的修改,而内存中仍是保留的是未改变前的Servlet. 如果要想访问新的Servlet必须重启tomcat服务器,来重新加载这个Servlet.
>>是不是一定要重启tomcat来重载Servelt程序?不是,那如何监视Servlet程序的更新,以重新载入更新的Servlet. 方法一:当我们将一个目录映射为虚拟子目录,比如将D:\86asm目录映射为http://localhost:8080/system/时会在tomcat的安装目录下的web.xml文件中用<Context path="/system" docBase="D:\86asm" />元素,而事实上这个元素还可以有reloadable属性,即是说我们如果把<Context path="/system" docBase="D:\86asm" />改成<Context path="/system" docBase="D:\86asm" reloadable=true />,tomcat将会监视到D:\86asm\WEB-INF\classes和D:\86asm\WEB-INF\lib目录下的 Servlet类是否改变,如果改变会自动重载入那些改变了的类.reloadable属性默认为false,未设这个属性,也即是这个属性为 false 注意,这种监视不会及时发生,可能要我们多刷新几次浏览器(或是等一定时间),才会真正运行改变了的Servlet程序. 另外,这种监视,必然会增加tomcat程序的额外开销,因而会使tomcat工作效率降低,所以,我们只在web开发调试阶段,使用此法.一旦,web 应用程序发步,应取消这个属性. 方法二:在conf目录下有一个tomcat- users.xml文件,我们只需要其中增加这一句<user username="tomcat" password="tomcat" roles="tomcat,role1"/>内容便可以打开tomcat后台管理,其中roles="tomcat,role1",是关键,大致意思是给tomcat用户managet权限. 怎样进入管理,在tomcat主页默认主页点Administrator栏下的Tomact Manager链接,然后输入上面所设的用户名(tomcat)和密码(tomcat)便进入了manager后台. 便可以对相关Servlet程序进行更新.
[/color][/size]
1. Loading and Instantiation
2. Initialization
3. Service client
4. Destroy
1.Load and Instantiation
when a servlet is loaded ?
a. the servlet container is started
web.xml:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
...省略部分内容...
...省略部分内容...
<load-on-startup>1</load-on-startup>
</servlet>
其中<load-on-startup>1</load-on-startup>便是为这个默认Servlet指定了创建时机, 即是说<load-on-startup>元素是用来指定Servlet被加载的次序.这里的内容必须是一个整型数值,且越小越先加载.比如如果设定为数值0,会在web应用程序部署时就加载.(注意, 如果我们把这个元素的内容误设为为负数或未设定任何元素,客户端会在首次请求时加载,这就好比是没有用到</load-on- startup>元素,其实我们在为Servlet创建映射时,一般不会指定</load-on-startup>元素
b. first request comes
when client's request comes, servlet container instantiate a servlet and invoke method init() only once in a servlet cycle.
说明:在第4点, 我们在为运行的Servlet程序配置时,并未用到<load-on-startup>,尽管每个<servlet>元素下都可以有一个<load-on-startup>元素,其实我们也是可以指定这个元素从而指定它所映射的Servlet的映射顺序. 另外,我们还可以在conf/web.xml文件中发现激活器(第5点提到)也用到<load-on-startup>2</load -on-startup>这个元素,且元素内容为2,这就是说,会加载默认的Servlet对象后再加载激活器Servlet.
>>init方法只被调用一次. 但是service方法可能会被调用多次,原因是当客户端第一次请求访问Servlet时,会先创建这个Servlet实例对象并调用init方法,当再次访问时,由于Servlet引擎检测到已创建了Servlet实例对象,这时候,只是把这次调用所封装的新的HttpServletRequest对象和HttpServletResponse对象传递给service方法进行操作注意:当客户端已经在访问这个Servlet时,便说明这个Servlet实例已经加载到服务器端的内存中,而当我们在服务端改变这个Servlet程序时,客户端仍是访问以前的Serlet 原因如下:由于这个Servlet只被加载一次,我们对它的修改,只是硬盘上的修改,而内存中仍是保留的是未改变前的Servlet. 如果要想访问新的Servlet必须重启tomcat服务器,来重新加载这个Servlet.
>>是不是一定要重启tomcat来重载Servelt程序?不是,那如何监视Servlet程序的更新,以重新载入更新的Servlet. 方法一:当我们将一个目录映射为虚拟子目录,比如将D:\86asm目录映射为http://localhost:8080/system/时会在tomcat的安装目录下的web.xml文件中用<Context path="/system" docBase="D:\86asm" />元素,而事实上这个元素还可以有reloadable属性,即是说我们如果把<Context path="/system" docBase="D:\86asm" />改成<Context path="/system" docBase="D:\86asm" reloadable=true />,tomcat将会监视到D:\86asm\WEB-INF\classes和D:\86asm\WEB-INF\lib目录下的 Servlet类是否改变,如果改变会自动重载入那些改变了的类.reloadable属性默认为false,未设这个属性,也即是这个属性为 false 注意,这种监视不会及时发生,可能要我们多刷新几次浏览器(或是等一定时间),才会真正运行改变了的Servlet程序. 另外,这种监视,必然会增加tomcat程序的额外开销,因而会使tomcat工作效率降低,所以,我们只在web开发调试阶段,使用此法.一旦,web 应用程序发步,应取消这个属性. 方法二:在conf目录下有一个tomcat- users.xml文件,我们只需要其中增加这一句<user username="tomcat" password="tomcat" roles="tomcat,role1"/>内容便可以打开tomcat后台管理,其中roles="tomcat,role1",是关键,大致意思是给tomcat用户managet权限. 怎样进入管理,在tomcat主页默认主页点Administrator栏下的Tomact Manager链接,然后输入上面所设的用户名(tomcat)和密码(tomcat)便进入了manager后台. 便可以对相关Servlet程序进行更新.
[/color][/size]