1.9 Http Servlets 1.9.1 HttpServlet

1.9 Http Servlets

不说全部,至少大多数应用程序都要与HTTP结合 起来使用。这意味着可以利用HTTP提供的特性。 javax.servlet.http包是Servlet API中的第二个包,其中包 含了用于编写Servlet应用程序的类和接口。 javax.servlet.http中的许多类型都覆盖javax.servlet中的 类型。 下图展示了javax.servlet.http中的主要类型。
这里有一张图片

1.9.1 HttpServlet

HttpServlet类覆盖了javax.servlet.GenericServlet类。 使用HttpServlet时,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequestHttpServletResponse对象。HttpServletRequest接口扩展 javax.servlet.ServletRequestHttpServletResponse扩展 javax.servlet.ServletResponseHttpServlet覆盖GenericServlet中的service方法,并通过下列签名再添加一个service方法:

1
2
3
protected void service(HttpServletRequest request, 
HttpServletResponse response)
throws ServletException, java.io.IOException

service方法和javax.servlet.Servletservice方法之间的区别在于方法的参数列表上,前者使用HttpServletRequestHttpServletResponse作为形式参数,而不是ServletRequestServletResponse。 像往常一样,Servlet容器调用javax.servlet.Servlet中原始的service方法。HttpServlet中的编写service方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 respons e");
}
service(request, response);
}

原始的service方法将Servlet容器创建的requestresponse对象分别转换成HttpServletRequestHttpServletResponse类对象,并调用新的service方法。这种转换总是会成功的,因为Servlet容器在调用Servlet的service方法时, Servlet容器总会传入一个HttpServletRequest和一个HttpServletResponse,预备使用HTTP。所以在通过实现 javax.servlet.Servlet,或者扩展(继承)javax.servlet.GenericServlet的创建的Servlet类中,也可以将传给service方法的servletRequestservletResponse分别转换成HttpServletRequestHttpServletResponse
然后,HttpServlet中的service方法会检验用来发送请求的HTTP方法(通过调用request.getMethod),并调 用以下方法之一:doGetdoPostdoHeaddoPutdoTracedoOptionsdoDelete。这7种方法中,每一种 方法都表示一个HTTP方法。doGet和doPost是最常用 的。因此,不再需要覆盖service方法了,只要覆盖 doGet或者doPost,或者覆盖doGet和doPost即可

总之,HttpServlet有两个特性是GenericServlet所不 具备的:

  • 不用覆盖service方法,而是覆盖doGet方法或者doPost方法, 或者同时覆盖doGetdoPost。在少数情况下,还会覆盖以下任意方法:doHeaddoPutdoTracedoOptionsdoDelete
  • 使用HttpServletRequestHttpServletResponse,而不 是ServletRequestServletResponse