javaweb之servlet详解(GenericServlet)(HttpServlet)

1. 什么是Servlet

Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
  例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

2. 实现Servlet的方式

实现Servlet有三种方式:
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;(我们使用这一种)
  通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。

3. HttpServlet

 HttpServlet概述

HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。

 HttpServlet覆盖了service()方法

当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

HttpServlet是GenericServlet的子类,它专注HTTP请求
HttpServlet类的方法:

  1. 实现了void service(ServletRequest,ServletResponse)方法,实现内容是:
    把ServletRequest强转成HttpServletRequest
    把ServletResponse强转成HttpServletResponse
  2. 调用本类添加的void service(HttpServletRequest,HttpServletResponse)方法
    添加了void service(HttpServletRequest,HttpServletResponse)方法,内容是:
    调用request的getMethod()获取请求方式
    如果请求方式为GET,那么调用本类添加的doGet(HttpServletRequest,HttpServletResponse)方法
    如果请求方式为POST,那么调用本类添加的doPost(HttpServletRequest,HttpServletResponse)方法
  3. 如果是通过继承HttpServlet类来自定义Sevlet的话,那么: * 不要去覆盖void
    service(ServletRequest,ServletResponse) * 不要去覆盖void
    service(HttpServletRequest, HttpServletResponse) *
    而应该去覆盖doGet()或doPost()方法。
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()方法]
}
……
}

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()...");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33442160/article/details/81607658