一、基础接口——javax.servlet.Servlet
Servlet接口定义了所有servlet都必须实现的方法。
Servlet是一个小型的运行在web服务器上的java程序。Servlet通过通过HTTP协议接收和响应客户端的请求。
要实现这个接口,可以编写一个通用的继承了 javax.servlet.GenericServlet类的servlet,或者是编写一个继承了javax.servlet.http.HttpServlet类的HTTP的servlet。
这个接口定义了初始化servlet的方法,service请求,以及从服务器中移除servlet的方法。这些是servlet的生命周期方法,它们按照下面的顺序被调用:
- servlet类初始化之后,则会调用init()方法进行初始化。
- 任何客户端对service()方法的调用都会被处理.
- servlet从服务中被移除并且使用destroy()方法销毁该servlet,之后垃圾收集器会回收该servlet资源。
除了生命周期方法之外,这个接口还提供了getServletConfig()方法,servlet可以使用这个方法获得任何启动的信息。而getServletInfo()方法则可以允许servlet返回有关servlet本身的基本信息,比如作者、版本以及版权信息等。
javax.servlet.Servlet接口定义的方法如下所示:
- public void init (ServletConfig config) throws ServletException——初始化方法
- public void service (ServletRequest req, ServletResponse res) throws ServletException, IOException——处理客户端请求的方法
- public void destroy ()——销毁servlet的方法
- public ServletConfig getServletConfig()——返回包含了关于该servlet本身的初始化和启动参数信息的ServletConfig对象,该ServletConfig
对象会被传递给
init()
方法使用。
- public String getServletInfo()——返回有关servlet本身的基本信息,比如作者、版本以及版权信息。
二、通用的servlet类——javax.servlet.GenericServlet
javax.servlet.GenericServlet是一个实现了javax.servlet.Servlet接口以及javax.servlet.ServletConfig接口的抽象类。
javax.servlet.GenericServlet抽象类定义了一个通用的、与协议无关的servlet。如果要编写一个在Web上使用的HTTP servlet,则这个servlet需要继承javax.servlet.http.HttpServlet 类,而不是继承javax.servlet.GenericServlet类。
javax.servlet.GenericServlet类可以直接被其他servlet继承,虽然更普遍的是继承一个指定协议的javax.servlet.GenericServlet类的子类,比如javax.servlet.http.HttpServlet类。
javax.servlet.GenericServlet类使得servlet更容易编写。它提供了生命周期方法init()和destroy()的简单实现版本,也实现了javax.servlet.ServletConfig接口中的方法的简单实现。javax.servlet.GenericServlet类也实现了log()方法,这个方法在javax.servlet.ServletContext接口中进行了声明。
因此,要编写一个通用的servlet,你必须实现的方法只有抽象方法service() 。.
三、HTTP协议使用的servlet——javax.servlet.http.HttpServlet
javax.servlet.http.HttpServlet类是抽象类javax.servlet.GenericServlet的子类,这个HttpServlet类是一个适合于web网站的HTTP servlet。javax.servlet.http.HttpServlet的子类必须至少重写下面这些方法中的一个:
- doGet()方法——如果这个servlet支持HTTP GET请求。
- doPost()方法——如果这个servlet支持HTTP POST请求。
- doPut()方法——如果这个servlet支持HTTP DELETE请求。
- init()和destroy()方法——如果这个servlet需要管理生命周期的资源。
- getServletInfo()方法——用来提供有关servlet本身的信息。
这里没有什么理由需要重写service() 方法。service() 方法通过为每个HTTP请求类型分配处理器方法(上面列出来的doXXX方法)来处理标准的HTTP请求。
同样地,这里也没有理由需要重写doOptions()和doTrace()方法。
Servlet往往运行在多线程的服务器上,因此要意识到一个servlet必须处理并发请求,并且要谨慎处理同步访问共享资源。共享资源包括内存数据比如实例或者类变量,外部对象比如文件、数据库连接和网络连接。