1.简介
每一个Servlet都必须实现Servlet接口,GenericServlet是一个通用的、不特定协议的Servlet。而HttpServlet集成自GenericServlet,因此HttpServlet也实现了Servlet接口。我们自己编写的Servlet,可以直接继承HttpServlet即可。
2.源码分析
(1)在Servlet接口中定义了一个service方法,HttpServlet对service方法进行了简单的实现,把service方法中的ServletRequest对象和ServletResponse对象转换成了HttpServletRequest对象和HttpServletResopnse对象,然后再去调用自己的service方法。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try
{
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
}
catch (ClassCastException e)
{
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
(2)在自己service方法中,首先获得请求的方法名,然后根据该方法名去调用对应的doXXX方法,例如,如果请求的方法名为GET,那么就去调用doGet方法,如果请求的方法名为POST,就去调用doPost方法。
(3)HttpServlet中的doGet方法和doPost方法返回的都是错误信息,所以我们要在自己的Servlet类中override这两个方法。
3.Servlet的生命周期
1)在下列时刻Servlet容器装载Servlet
-Servlet容器启动时自动装载某些Servlet。
可以在自己web应用程序的下的web.xml文件中配置。在<servlet>节点下添加<load-on-startup>节点。
-Servlet容器启动后,客户首次向Servlet发出请求。
-Servlet的类文件被更新后,重新装载Servlet。
2)在Servlet被装载后,Servlet容器会创建Servlet的实例并且调用Servlet的init()方法进行初始化,在Servlet的整个生命周期内init()方法只执行一次。
3)响应客户请求
Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,并调用service方法。
4)终止阶段
-Web应用的终止
-Servlet容器的终止
-Servlet容器重新装载新的Servlet
以上会调用destroy()方法销毁当前Servlet所占得资源。
4.Servlet的多线程问题
Servlet本身是Singleton,会产生一个唯一的实例,当多个用户访问这一个Servlet时,其实就是访问的这一个对象,当用户修改Servlet的成员变量时,就会出现数据不一致的错误,导致多线程访问问题。
解决该问题的最好办法:把成员变量声明为局部变量。