2.1.6 HttpServlet
在绝大多数的网络应用中,都是客户端(浏览器)通过HTTP协议去访问服务器端的资源,而我们所编写的Servlet也主要是应用于HTTP协议的请求和响应。为了快速开发应用于HTTP协议的Servlet类,Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,它继承自GenericServlet类,用于创建适合Web站点的HTTP Servlet。
public abstract class HttpServlet extends |
在HttpServlet类中提供了两个重载的service()方法:
public void service(ServletRequest req, ServletResponse res) |
第一个service()方法是GenericServlet类中service()方法的实现。在这个方法中,首先将req和res对象转换为HttpServletRequest(继承自ServletRequest接口)和HttpServletResponse(继承自ServletResponse接口)类型,然后调用第二个service方法,对客户请求进行处理。
针对HTTP1.1中定义的7种请求方法GET、POST、HEAD、PUT、DELETE、TRACE和OPTIONS,HttpServlet分别提供了7个处理方法:
protected void doGet (HttpServletRequest req, |
这7个方法的参数类型及异常抛出类型与HttpServlet类中的第二个重载的service()方法是一致的。当容器接收到一个针对HttpServlet对象的
请求时,调用该对象中的方法顺序如下:
① 调用公共的(public)service()方法。
② 在公共的service()方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,然后调用保护的(protected)service()方法,将转换后的HttpServletRequest对象和HttpServletResponse对象作为参数传递进去。
③ 在保护的service()方法中,首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的名字,然后根据请求方法的类型,调用相应的doXxx ()方法。
因此,我们在编写HttpServlet的派生类时,通常不需要去覆盖service()方法,而只需重写相应的doXXX()方法。
HttpServlet类对TRACE和OPTIONS方法做了适当的实现,因此我们不需要去覆盖doTrace()和doOptions()方法。而对于其他的5个请求方法,HttpServlet类提供的实现都是返回HTTP错误,对于HTTP 1.0的客户端请求,这些方法返回状态代码为400的HTTP错误,表示客户端发送的请求在语法上是错误的。而对于HTTP 1.1的客户端请求,这些方法返回状态代码为405的HTTP错误,表示对于指定资源的请求方法不被允许。这些方法都是使用javax.servlet.ServletRequest接口中的getProtocol()方法来确定协议的。
HttpServlet虽然是抽象类,但在这个类中没有抽象的方法,其中所有的方法都是已经实现的。只是在这个类中对客户请求进行处理的方法,没有真正的实现,当然也不可能真正实现,因为对客户请求如何进行处理,需要根据实际的应用来决定。我们在编写HTTP Servlet的时候,根据应用的需要,重写其中的对客户请求进行处理的方法即可。