1.前言
如果我们要编写一个Servlet,那么这个Servlet类一定要继承一个Servlet类,可以是GenericServlet,也可以是HttpServlet。
如果我们要基于HTTP协议进行Web开发,那么继承HttpServlet是最佳选择。因为GenericServlet对象无法让我们开发人员享受到Http协议中的内容。比如4XX、5XX这样的报错信息。
2.HttpServlet
HttpServlet位于jakarta.servlet.http.HttpServlet包下,在这个包下与HttpServlet密切相关的还有HttpServletRequest和HttpServletResponse两个对象,这两个对象主要是封装了请求内容和响应内容。
2.1 使用
当我们继承HttpServlet以后,我们往往只需要写doPost或者doGet方法。不同于GenericServlet,如果我们继承了GenericServlet对象,我们一般都是重写Service方法。
public class HelloServlet extends HttpServlet {
// 用户第一次请求,创建HelloServlet对象的时候,会执行这个无参数构造方法。
public HelloServlet() {
}
//override 重写 doGet方法
//override 重写 doPost方法
}
2.2 源码分析
查看HttpServlet的源码我们可以发现,里面有两个Service方法:
public void service(ServletRequest req, ServletResponse res)
protected void service(HttpServletRequest req, HttpServletResponse resp)
第一个Service方法会将ServletRequest对象和ServletResponse对象强转为HttpServletRequest和HttpServletResponse对象。然后调用第二个Service方法。
然后在第二个Service方法中,会获得请求内容中与请求相关的信息,从而决定是执行doPost还是doGet方法。
2.3 注意
一般开发的话我们是不需要重写Service方法的,一般只需要根据实际情况重写doPost或者doGet方法。
如果我们请求的方式跟我们后端程序员重写请求方法不一致,就会报错(405)。