Servlet生命周期(二)
要点和思维图解
- Servlet接口继承关系和api使用
- servlet的xml和注解配置
- ServletConfig对象
实现Servlet接口
在(Servlet生命周期(一))中我们了解到servlet生命周期的各个阶段的作用和对应的接口方法。下面我来实践检验一下,我们自己实现Servlet接口中的所有方法。代码如下:
@WebServlet(value = "/lifecycle")
public class LifeCycleServlet implements Servlet {
private static final String NAME = "LifeCycleServlet.";
public LifeCycleServlet() {
System.out.println(NAME + "构造器 LifeCycleServlet(),hash值:" + this.hashCode());
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(NAME + "初始化 init(ServletConfig config),hash值:" + this.hashCode());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println(NAME + "服务 service(ServletRequest req, ServletResponse res),hash值:" + this.hashCode());
res.getWriter().write("LifeCycleServlet");
}
@Override
public String getServletInfo() {
return "该方法是返回一个关于当前servlet的作者,版本,版权等信息的字符串";
}
@Override
public void destroy() {
System.out.println(NAME + "服务 destroy(),hash值:" + this.hashCode());
}
}
在代码中涉及到生命的方法都打印了一句对应的话。其中this.hashCode()是当前对象的hash值,这里是为了方便说明一下我们使用的servlet是同一个对象,也就是单例。
这里我们引入了@WebServlet(value = “/lifecycle”)这个注解,和我们在helloworld中使用的是web.xml中的配置文件的效果是一样的。
接下来我们启动一下tomcat,访问一下http://127.0.0.1:8080/x_servlet/lifecycle这个地址。会出现一下的打印结果:
LifeCycleServlet.构造器 LifeCycleServlet(),hash值:709160495
ifeCycleServlet.初始化 init(ServletConfig config),hash值:709160495
LifeCycleServlet.服务 service(ServletRequest req, ServletResponse res),hash值:709160495
这里我们可以看到先调用了构造器,接着是初始化,最后是服务方法。我们可以反复的刷新一下浏览器的这个地址。控制会反复打印LifeCycleServlet.服务 service(ServletRequest req, ServletResponse res),hash值:709160495
这句话,且hash值是不变的。说明我们是用的同一个servlet对象。后面我们讨论servlet的线程安全时在展开讨论。
这里就是最前面的类加载和销毁没有看到效果。接下载我们停止一下tomcat服务器(不能强制在控制台关闭)。我们可以看到“LifeCycleServlet.服务 destroy(),hash值:709160495”打印结果,表明调用了销毁方法。
再就是类加载的效果,我们可以在eclipse的Run Configurations选项的VM arguments中加入-XX:+TraceClassLoading参数,再一次启动tomcat搜索你控制台中LifeCycleServlet关键之,就可以看到类似如下的打印信息
[Loaded com.LifeCycleServlet from file:/E:/app/eclipse-data/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/x_servlet/WEB-INF/classes/]
GenericServlet抽象类
上面的代码中有一个getServletConfig方法用来返回的是ServletConfig对象的,但是我们返回的是null没有做处理。
@Override
public ServletConfig getServletConfig() {
return null;
}
那我们结合init(ServletConfig config)方法来处理一下,修改的代码如下。我们定义了一个成员变量在servlet容器调用init方法的时候把ServletConfig保存起来。在getServletConfig方法的时候返回即可。
private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
System.out.println(NAME + "初始化 init(ServletConfig config),hash值:" + this.hashCode());
}
@Override
public ServletConfig getServletConfig() {
return config;
}
如果我们每次都需要自己做这样一个重复的工作肯定是没必要的。servlet API中已经给我们定义了一个javax.servlet.GenericServlet抽象方法。
本文深入探讨Servlet生命周期,从实现Servlet接口开始,详细讲解了构造器、初始化、服务和销毁等阶段,并通过实例代码展示了Servlet的单例特性及ServletConfig对象的使用。
863

被折叠的 条评论
为什么被折叠?



