4.3.1 service方法
优质
小牛编辑
130浏览
2023-12-01
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方法的第一个重载形式。