用实例来观察servlet方法的调用顺序,创建一个类实现servlet接口:
package com.servlet.HelloServlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class servlet_lifecycle implements Servlet{ @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("init方法被调用"); } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("service方法被调用"); } @Override public void destroy() { System.out.println("destroy方法被调用"); } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
修改web.xml配置文件
??写好servlet的class代码之后,还要修改WebContent文件夹下的WEB-INF文件夹里面的web.xml配置文件。打开文件夹之后突然发现没有web.xml文件.....解决方法如下:
??鼠标移动到项目名称上右键,点击Java EE Tools,点击Generate Deployment Descriptor Stub,至此web.xml文件就自动生成了。
在xml文件中添加以下内容
修改好xml文件之后就可以在服务器运行项目了
??由此可见,默认情况下,init()方法只会在创建类实例的时候调用一次,servlet只会初始化一次,接下来无论再打开多少次该页面,都不会再调用init()方法。而service()可以被调用多次,一个客户端请求,就会调用一次service()。当servlet被销毁时,执行destroy()方法。要注意的是,关闭浏览器并不会成功调用destroy方法,因为浏览器是客户端,只有关闭服务器端才会调用该方法。将项目从tomcat上移除,或者正常shutdown tomcat都会使destroy方法被调用。
??如果需要在init()方法中执行一些运算量大、耗时长的工作,可以把init()方法的执行时间提前。
<servlet> <servlet-name>servlet_lifecycle</servlet-name> <servlet-class>com.servlet.HelloServlet.servlet_lifecycle</servlet-class> <load-on-startup>3</load-on-startup> </servlet>
在web.xml的servlet标签内,加上load-on-startup标签,里面的数字要是正数或0,数字越小越早被初始化。
init()方法提前调用结果如下,在服务器开启时就执行初始化:
原文:https://www.cnblogs.com/cy708/p/10177003.html