3. 生命周期
1. 生命周期流程
2. 代码测试
- 代码
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet1 extends HttpServlet {
public LoginServlet1(){
System.out.println("LoginServlet 构造方法 被调用");
}
public void init(ServletConfig config) {
System.out.println("init(ServletConfig)");
}
public void destroy() {
System.out.println("destroy()");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String password = request.getParameter("password");
String html = null;
if ("admin".equals(name) && "123".equals(password))
html = "<div style='color:green'>success</div>";
else
html = "<div style='color:red'>fail</div>";
PrintWriter pw = response.getWriter();
pw.println(html);
}
}
- 修改web.xml重定向到某个url
<!-- login1登陆界面 -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
- 效果
3. 分析
- 实例化
- 初始化
提供服务.
service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
销毁
接着是销毁destroy() 在如下几种情况下,会调用destroy()
- 该Servlet所在的web应用重新启动
在server.xml中配置该web应用的时候用到了
如果把 reloadable=”false” 改为reloadable=”true” 就表示有任何类发生的更新,web应用会自动重启
当web应用自动重启的时候,destroy()方法就会被调用
- 关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现。
4 自启动
4.1 什么叫自启动
- 有的时候会有这样的业务需求:
tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现自启动 即,伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了。
- 简单来说tomcat已启动就实例化这个Servlet类并且调用init方法
4.2 举例没有自启动
- 两个Servlet类的init方法
public class HelloServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("Hello Servlet初始化");
}
public class LoginServlet5 extends HttpServlet {
//自启动
public void init(ServletConfig config) {
System.out.println("LoginServlet初始化");
}
- 配置文件
<!-- hello界面 -->
<servlet>
<!-- 当前配置文件中这个class文件取的名字 -->
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 这个class文件对应的url -->
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- login1登陆界面 -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- hello界面 -->
<servlet>
<!-- 当前配置文件中这个class文件取的名字 -->
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 这个class文件对应的url -->
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- login1登陆界面 -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet5</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
- 效果:启动时自动初始化