HttpServlet,GenericServlet

在这里我们讲到了Servlet例子与注解配置,但是这种实现Servlet的方式每次都要实现5个方法,而对我们来说用最多的往往只是service方法,而其他方法是没用的。所以我们换一种方式来实现Servlet

我们先看一下Servlet的体系结构

HttpServlet,GenericServlet_第1张图片

发现Servlet的实现类:GenericServlet

那我们就不实现Servlet接口了,去继承GenericServlet类看一下

HttpServlet,GenericServlet_第2张图片

package com.lingaolu.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @author 林高禄
 * @create 2020-07-06-10:46
 */
@WebServlet(value="/demo2")
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("/demo2");
    }
}

 运行访问

HttpServlet,GenericServlet_第3张图片

后台输出

HttpServlet,GenericServlet_第4张图片 是不是相当方便,因为其他方法GenericServlet已经重写了,只留了一个service抽象方法,所以我们只需要重写一个方法就可以了,其他方法如果需要那就重写就行

但是还有更方便的,我们看一下GenericServlet的体系

HttpServlet,GenericServlet_第5张图片

 GenericServlet有一个子类:HttpServlet

那我们就集成HttpServlet看一下

 

HttpServlet,GenericServlet_第6张图片

发现竟然不用重写任何方法,我们就去HttpServlet看一下源码

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    long lastModified;
    if (method.equals("GET")) {
        lastModified = this.getLastModified(req);
        if (lastModified == -1L) {
            this.doGet(req, resp);
        } else {
            long ifModifiedSince;
            try {
                ifModifiedSince = req.getDateHeader("If-Modified-Since");
            } catch (IllegalArgumentException var9) {
                ifModifiedSince = -1L;
            }

            if (ifModifiedSince < lastModified / 1000L * 1000L) {
                this.maybeSetLastModified(resp, lastModified);
                this.doGet(req, resp);
            } else {
                resp.setStatus(304);
            }
        }
    } else if (method.equals("HEAD")) {
        lastModified = this.getLastModified(req);
        this.maybeSetLastModified(resp, lastModified);
        this.doHead(req, resp);
    } else if (method.equals("POST")) {
        this.doPost(req, resp);
    } else if (method.equals("PUT")) {
        this.doPut(req, resp);
    } else if (method.equals("DELETE")) {
        this.doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
        this.doOptions(req, resp);
    } else if (method.equals("TRACE")) {
        this.doTrace(req, resp);
    } else {
        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[]{method};
        errMsg = MessageFormat.format(errMsg, errArgs);
        resp.sendError(501, errMsg);
    }

}

发现HttpServlet已经帮我们实现了service方法,里面对GET、POST等7中请求方式做了判断分别走不同的逻辑,那我们实际上的是需要重写这7个请求方法就可以了,实际上我们常用的就是GET和POST,我们的ServletDemo3就重写这2个方法

package com.lingaolu.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
 * @author 林高禄
 * @create 2020-07-06-10:46
 */
@WebServlet(value="/demo3")
public class ServletDemo3 extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet......");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("doPost......");
    }
}

 

我们知道浏览器直接访问的走的get请求,所以我们启动访问一下

HttpServlet,GenericServlet_第7张图片

后台输出

HttpServlet,GenericServlet_第8张图片

下面演示doPost请求

我用Postman演示

HttpServlet,GenericServlet_第9张图片

后台输出

HttpServlet,GenericServlet_第10张图片

不会使用的postman的那就自己写一个表单请求吧......

 

你可能感兴趣的:(Web核心,Servlet,HttpServlet,GenericServlet)