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。