共计 1764 个字符,预计需要花费 5 分钟才能阅读完成。
一、HttpServlet 概述
HttpServlet 类是 GenericServlet 的子类,它提供了对 HTTP 请求的特殊支持,所以通常我们都会通过继承 HttpServlet 来完成自定义的 Servlet。
二、HttpServlet 覆盖了 service() 方法
HttpServlet 类中提供了 service(HttpServletRequest,HttpServletResponse) 方法,这个方法是 HttpServlet 自己的方法,不是从 Servlet 继承来的。
在 HttpServlet 的 service(ServletRequest,ServletResponse) 方法中会把 ServletRequest 和 ServletResponse 强转成 HttpServletRequest 和 HttpServletResponse,然后调用 service(HttpServletRequest,HttpServletResponse) 方法,这说明子类可以去覆盖 service(HttpServletRequest,HttpServletResponse) 方法即可,这就不用自己去强转请求和响应对象了。
其实子类也不用去覆盖 service(HttpServletRequest,HttpServletResponse) 方法,因为 HttpServlet 还要做另一步简化操作,下面会介绍。
HttpServlet.java
public abstract class HttpServlet extends GenericServlet {protected void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {// 根据 request 对象是 GET 请求还是 POST 请求,然后去调用
//doGet 方法或者 doPost 方法
/*
if(req.getMethod=="GET"){doGet(req,resp);
}
else{doPost(req,resp);
}
*/
}
@Override
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 response");
}
service(request, response);
}
……
}
三、doGet() 和 doPost()
在 HttpServlet 的 service(HttpServletRequest,HttpServletResponse) 方法会去判断当前请求是 GET 还是 POST,如果是 GET 请求,那么会去调用本类的 doGet() 方法,如果是 POST 请求会去调用 doPost() 方法,这说明我们在子类中去覆盖 doGet() 或 doPost() 方法即可。
public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {System.out.println("hello doGet()...");
}
}
public class BServlet extends HttpServlet {public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {System.out.println("hello doPost()...");
}
}