GenericServlet、HttpServlet

一、GenericServlet

1、GenericServlet是一个实现了Servlet的基本特征和功能的基类。

2、HttpServlet是GenericServlet子类,它提供了处理HTTP协议的基本架构。

为了充分利用HTTP协议的功能,因此编写Web应用的Servlet程序要令其继承HttpServlet

二、主要的方法

1、init方法

在GenericServlet类源码中,有两个init方法,

private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();// 调用下面init()方法
}
public void init() throws ServletException {
}

问:这样设计的好处?

答:如果GenericServlet的子孙类要增加一些额外的初始化功能,它只需覆盖无参数的init()方法,而不必覆盖有参数的init(ServletConfig config)。这样,Servlet容器在初始化由GenericServlet派生出的子类Servlet程序时,调用的仍然是GenericServlet的有参数的init(ServletConfig config)方法。但由于该方法最后调用了无参数的init()方法,根据多态,这里调用的无参数的init()方法不再是GenericServlet自身的init()方法,而实际是子类中的init()方法。所以,在子类覆盖的无参数init()方法不需要调用super.init(config),并且从GenericServlet类中继承的其他方法功能仍然可用。

模拟实现:

GenericServlet gs = new XxxServlet();//XxxServlet代表自己编写的Servlet程序
gs.init(config);

2、service方法

GenericServlet类没有实现它,HttpServlet类实现了这个方法。由于Servlet接口定义的service方法接收的参数类型为ServletRequest和ServletResponse,为了在service方法内部使用http消息的特有功能,还要调用HttpServletRequest和HttpServletResponse类中定义的方法,即要将请求和响应对象类型转换成这两者。

转换过程可简写为:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ...Exception {
    //代码
}
public void service(ServletRequest req, ServletResponse res) throws ...Exception {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    service(request, response); // 调用上面重载方法
}

3、destroy方法

destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。

4、doXxx方法

问:为什么有多个doXxx方法?

答:因为客户端可以用Http协议中规定的各种请求方式来访问Servlet,对于不同的请求方式,Servlet可能需要采用不同的方式进行处理。不管客户端采用哪种方式,Servlet引擎都会调用service方法,然后service方法根据请求方式再调用doXxx方法。在一般情况下,Servlet只需处理get和post请求,也就是只覆盖doGet和doPost两个方法即可。而不用编写service方法覆盖父类HttpServlet的service方法。除非自己编写的Servlet程序要对所有请求方式都进行处理。


你可能感兴趣的:(GenericServlet、HttpServlet)