2.1 javax.servlet.Servlet接口
Servlet编程需要使用到javax.servlet和javax.servlet.http两个包下的接口和类。在所有的类和接口中,javax.servlet.servlet接口是最为重要。所有的servlet程序都必须实现实现该接口或继承自实现了该接口的类。
在Servlet接口中声明了5个方法,方法签名如下:
在Servlet接口中声明的5个方法里,init()、service()和destroy()方法是与servlet的生命周期相关的方法。当实例化某个servlet类后,servlet容器会调用其init()方法进行初始化。servlet容器只会调用该方法一次,调用后则可以执行服务方法了。在servlet接收任何请求之前,必须是经过正确初始化的。servlet程序员可以覆盖此方法,在其中编写仅需要执行一次的初始化代码,例如载入数据库驱动程序、初始化默认值等。一般情况下,init()方法可以留空。
当servlet的一个客户端请求到达后,servlet容器就调用相应的servlet的service()方法,并将javax.servlet.servletRequest对象和javax.servlet.servletResponse对象作为参数传入。ServletRequest对象包含客户端的HTTP请求的信息,ServletResponse对象则封装servlet的响应信息。在servlet对象的整个生命周期内,service()方法会被多次调用。
在将servlet实例从服务中移除前,servlet容器会调用servlet实例的destroy()方法。一般当servlet容器关闭或servlet容器要释放内存时,才会将servlet实例移除,而且只有当servlet实例的service()方法中的所有线程都退出或执行超时后,才会调用destroy()方法。当servlet容器调用了某个servlet实例的destroy()方法后,它就不会再调用该servlet实例的service()方法了。调用destroy()方法让servlet对象有机会去清理自身持有的资源,如内存、文件句柄和线程等,确保所有的持久化状态与内存中该servlet对象的当前状态同步。
代码清单2-1展示了名为PrimitiveServlet的servlet的代码,该servlet非常简单,可以用来测试本章中的servlet容器应用程序。PrimitiveServlet类实现了javax.servlet.Servlet接口(所有的servlet都要实现该接口),提供了Servlet接口中声明的5个方法的实现。PrimitiveServlet类所做的事情非常简单。每次调用init()、service()和destroy()方法时,Servlet都会将方法名写入标准控制台中。此外,service()方法会从servletResponse对象中获取java.io.PrintWriter对象,并将字符串发送到客户端浏览器。