疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

GenericServlet与HttpServlet类service方法


 

 
service方法是Servlet接口的方法,该方法负责处理客户端的所有HTTP请求。service方法是在Servlet接口中定义的一个方法(关于Servlet接口请参阅4.2.1节所提供的代码),该方法在GenericServlet中定没有实现,而是在HttpServlet类中实现的这个方法。service方法的定义如下:
 
public void service(ServletRequest req, ServletResponse res)
 
     throws ServletException, IOException;
        由于service方法的两个参数类型分别是ServletRequest和ServletResponse,因此,这两个参数并没有处理HTTP消息的特殊功能。为了在service方法中处理HTTP消息,需要使用HttpServletRequest和HttpServletResponse接口中定义的方法。所以在service方法中需要分别将ServletRequest和ServletResponse类型的参数转换成HttpServletRequest和HttpServletResponse,代码如下:
 
public void service(ServletRequest req, ServletResponse res)
 
     throws ServletException, IOException
 
{
 
    HttpServletRequest request = (HttpServletRequest)req;
 
    HttpServletResponse response = (HttpServletResponse)res;
 
    response.getWriter().println("test");
 
    ... ...
 
}
为了简化这一过程,在HttpServlet中又提供了另一个service方法的重载形式,代码如下:
 
protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException;
从上面的代码可以看出,这个重载形式的参数类型是HttpServletRequest和HttpServletResponse,这个重载形式被第一个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);
}
如果在Servlet类中覆盖了service的第二个重载形式,那么在service方法中就无需再进行两个参数的类型转换了,代码如下:
 
public void service(HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException
{
    res.getWriter().println("test");
    ... ...
}
实际上,虽然service的第二个重载形式可以给开发人员带来方便,但这个方法并不是Servlet接口中定义的方法。在Servlet接口中只定义了service的第一个重载形式。因此,Servlet引擎在调用时只会调用service方法的第一个重载形式。