Servlet,GenericServlet和HttpServlet关系详解

一、关系图

在这里插入图片描述

二、源码解析

Servlet,GenericServlet,HttpServlet是实现servlet的三个方法,其中Servlet是一个接口,它有五个方法,各种方法的作用在另一篇博客Servlet介绍与使用中已有介绍
在这里插入图片描述
其中ServletConfig接口用于获取servlet的配置信息,包括servlet的名字,servlet的初始化参数名和参数值等等,而该接口的实现由servlet容器tomcat自行实现,我们无需关心,下图是ServletConfig的接口源码:
在这里插入图片描述
我们再较之于GenericConfig的抽象类实现:
在这里插入图片描述
其还实现了ServletConfig接口,因此它需要同时覆写这两个接口中的方法,它定义了一个私有属性servletConfig用于tomcat自动调用init()方法时得到servlet的相关配置信息,还定义了一个无参的init方法供继承这个抽象类的servlet实体类进行覆写,所以当我们需要继承这个抽象类时,只需要override无参方法init()和有参方法抽象方法servlet即可实现一个servlet的正常功能
在这里插入图片描述
再来说说HttpServlet,这也是一个抽象类,但有趣的是这个抽象类中没有抽象方法,它继承了GenericServlet这个抽象类,也就是说它要覆写抽象方法service(),可以看到在HttpServlet.java中确实覆写了public void service(ServletRequest req, ServletResponse res),但是它内部还有一个service方法protected void service(HttpServletRequest req, HttpServletResponse resp),从下面源码中可以看到,当有请求时,tomcat自动调用第一个service方法,方法中进行强转将ServletRequest,ServletResponse强转为HttpServletRequest,HttpServletResponse,再去调用第二个service方法,
第二个service方法中从HttpServletRequest得到请求方法,根据请求方法的不同分别去执行doPost,doGet,doPut,doDelete等方法
在这里插入图片描述
而且我们再来看其中一个doGet方法

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

当继承HttpServlet的类没有覆写这一个方法时,自动调用父类中的这个方法,方法直接返回405,请求方法不支持,也就是说当我们需要继承HttpRequest时,务必重写doPost,doGet等方法。

三、基于GenericServlet实现servlet

这里为图简便,就采用注解的方式实现以下,另外一种配置方式也可以查看上文中那篇博文链接

@WebServlet(value = "/bServlet")
public class BServlet extends GenericServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("yeah,the servlet based on GenericServlet starts");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("wo,someone requests me");
    }
}

在浏览器一行输出对应url(具体情况视自己电脑上的tomcat配置为准)
在这里插入图片描述
在这里插入图片描述

四、基于HttpServlet实现servlet

@WebServlet(value = "/CServlet")
public class CServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setStatus(200);
        PrintWriter out = resp.getWriter();
        out.println("<h1>hello world!</h1>");
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值