Servlet接口
Servlet是用Java编写的服务器端的程序,其主要功能在于交互式地浏览和修改数据,生成动态的web内容。
狭义的Servlet指的是Java语言实现的一个接口,广义的Servlet指任何实现了Servlet接口的类。Servlet源码如下:
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
Servlet的生命周期:
1.装载Servlet:Servlet是一个Java文件,运行时需要装载Servlet的class文件。
2.创建Servlet实例:调用Servlet的init()方法创建Servlet实例,该方法只会在第一次访问Servlet时被调用一次,之后的多次请求中,该方法将不会被调用。
3.调用服务service()方法:当访问Servlet的请求到达服务器时,Servlet的service()方法就会被调用。该方法有两个非常重要的参数:Request用于获取客户端信息,Respone用于向客户端返回信息。每一次请求都会重新调用service(),因此在该方法内定义的变量是线程安全的,但是该方法之外的变量不是线程安全的。
4销毁:调用Servlet的destroy()方法可以销毁Servlet实例。该方法在两种情况下被调用,(1)Tomcat重启,(2)Tomcat在运行过程中重新部署该程序
Servlet不能独立运行,它的运行完全由Servlet引擎来控制和调度。
GenericServlet抽象类
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable{
......
}
GenericServlet抽象类为Servlet接口提供了通用实现。它与任何网络应用层协议无关。
GenericServlet实现了Servlet接口的init(ServletConfig config)初始化方法。但也自定义了一个不带参的init( )方法,然后通过init(ServletConfig)调用init()方法。因此在实现子类重写init进行初始化时,最好重写init( )方法。若重写init(ServletConfig)方法,还需要先调用父类init(ServletConfig)方法(super.init(config))。
HttpServlet抽象类
HttpServlet类是GenericServlet类的子类。HttpSerlvet类为Servlet接口提供了与HTTP相关的通用实现。也就是说,HttpServlet对象适合运行在与客户端采用HTTP通信的Servlet容器中。
在我们自己开发的Javaweb应用中,自定义的Servlet类一般都扩展自HttpServlet类。
HttpServlet类实现了Servlet接口的service(ServletRequest , ServletResponse),但实际上是调用了它的重载方法service(HttpServletRequest , HttpServletResponse) 。而它的重载方法中,首先调用HttpServletRequest类型的参数的getMethod()方法,获得客户端的请求方法,然后根据该请求方式调用匹配的服务方法;如果为GET方式,则调用doGet( )方法,如果为POST方式,则调用doPost( )方法。