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
响应的HttpServletRequest
和HttpServletResponse
对象。HttpServletRequest
接口扩展 javax.servlet.ServletRequest
,HttpServletResponse
扩展 javax.servlet.ServletResponse
。 HttpServlet
覆盖GenericServlet
中的service
方法,并通过下列签名再添加一个service
方法:
1 | protected void service(HttpServletRequest request, |
新service
方法和javax.servlet.Servlet
中service
方法之间的区别
在于方法的参数列表上,前者使用HttpServletRequest
和HttpServletResponse
作为形式参数,而不是ServletRequest
和 ServletResponse
。 像往常一样,Servlet
容器调用javax.servlet.Servlet
中原始的service
方法。HttpServlet
中的编写service
方法如下:
1 | public void service(ServletRequest req, |
原始的service
方法将Servlet
容器创建的request
和response
对象分别转换成HttpServletRequest
和HttpServletResponse
类对象,并调用新的service
方法。这种转换总是会成功的,因为Servlet容器在调用Servlet的service方法时, Servlet容器总会传入一个HttpServletRequest
和一个HttpServletResponse
,预备使用HTTP。所以在通过实现 javax.servlet.Servlet
,或者扩展(继承)javax.servlet.GenericServlet
的创建的Servlet类中,也可以将传给service
方法的servletRequest
和servletResponse
分别转换成HttpServletRequest
和HttpServletResponse
。
然后,HttpServlet
中的service
方法会检验用来发送请求的HTTP方法(通过调用request.getMethod),并调 用以下方法之一:doGet
、doPost
、doHead
、doPut
、 doTrace
、doOptions
和doDelete
。这7种方法中,每一种 方法都表示一个HTTP方法。doGet和doPost是最常用 的。因此,不再需要覆盖service方法了,只要覆盖 doGet或者doPost,或者覆盖doGet和doPost即可。
总之,HttpServlet
有两个特性是GenericServlet
所不 具备的:
- 不用覆盖
service
方法,而是覆盖doGet
方法或者doPost
方法, 或者同时覆盖doGet
和doPost
。在少数情况下,还会覆盖以下任意方法:doHead
、doPut
、doTrace
、doOptions
和doDelete
。 - 使用
HttpServletRequest
和HttpServletResponse
,而不 是ServletRequest
和ServletResponse
。