关于HTTPServlet原理的一些看法
HTTPServlet了解HTTPServlet之前要稍微介绍一下GenericServlet:GenericServlet1. GenericServlet概述GenericServlet是Servlet接口的实现类,但它是一个抽象类,它唯一的抽象方法就是service()方法。我们可以通过继承GenericServlet来编写自己的Servlet。2. GenericServlet的init(
·
HTTPServlet
了解HTTPServlet之前要稍微介绍一下GenericServlet:
GenericServlet
1. GenericServlet概述
- GenericServlet是Servlet接口的实现类,但它是一个抽象类,它唯一的抽象方法就是service()方法。我们可以通过继承GenericServlet来编写自己的Servlet。
2. GenericServlet的init()方法
- 在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。
- 如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆盖GenericServlet提供的init()方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。
HttpServlet
1. HttpServlet概述
- HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
2. HttpServlet覆盖了service()方法
- HttpServlet类中提供了service(HttpServletRequest,HttpServletResponse)方法
- 这个方法是HttpServlet自己的方法,不是从Servlet继承来的。
- 在HttpServlet的service(ServletRequest,ServletResponse)方法中会把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,然后调用service(HttpServletRequest,HttpServletResponse)方法
- 这说明子类可以去覆盖service(HttpServletRequest,HttpServletResponse)方法即可,这就不用自己去强转请求和响应对象了。
HttpServlet.java
在源码中可以看到
public abstract class HttpServlet extends GenericServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
……
}
@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); //调用上面service()方法
}
……
3.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()..."); } }
更多推荐
已为社区贡献2条内容
所有评论(0)