Servlet学习总结(1)

1、Servlet接口实现类

servlet是Servlet规范下的一个接口,这个接口存在于Http服务器下提供的jar包中

在tomcat下的servlet-api.jar包的javax.servlet.Servlet接口,我们可以看到这个接口的内容

package javax.servlet;

import java.io.IOException;

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

在Servlet的规范中认为,Http服务器能够调用的 动态资源文件必须实现 Servlet这个接口

不是动态资源文件,服务器就没有权力调用,要是合法的动态资源文件就必须是实现Servlet这个接口的类

实现了Servlet这个接口的类,服务器(如tomcat)就可以调用它

2、Servlet接口实现类的书写过程

         第一步:创建一个Java类使之继承HttpServlet父类,使之成为一个Servlet实现接口类

        不是要实现Servlet接口才算是一个合法的动态资源文件嘛,看如下图

  

  

 oneServlet 继承HttpServlet   HttpServlet 继承 GenericServlet    GenericServlet 实现了Servlet这个接口

oneServlet (子类)

HttpServlet (父类) 

GenericServlet (爷爷类)  爷爷实现了Servlet,子类也就实现了Servlet接口

细心就会发现 父类和爷爷类都是抽象类,为什么要是抽象类?

回顾一下抽象类的作用:降低接口实现类对接口实现的难度

将接口中不需要使用的抽象方法交给抽象类去完成,这样接口实现类只需要对需要实现的方法进行重写就可以 ,明显降低了接口实现类的实现难度,只需要实现需要的方法就可以。

分析:

Servlet接口中有五个抽象方法:

import java.io.IOException;

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

只有service()方法才是有用的,其他四个抽象方法对接口实现类来说没有用

    1、HttpServlet(父类)查看代码发现没有实现这五个方法的任何一个方法

    2、GenericServlet (爷爷类)查看代码发现实现类 除service()方法外,其他四个方法都实现了

 3、GenericServlet (爷爷类)把service()方法留下,没有实现

     第二步:接口实现类重写doget()或者dopost()方法

这就比较奇怪了,服务器(如Tomcat)根据Servlet规范调用Servlet接口实现类的规则:会帮做一下两步:

1、Tomcat有权力创建Servlet接口实现类的实例对象(合法的动态资源文件,tomcat有权调用)

       Servlet one = new oneServlet();

2、Tomcat服务器根据实例对象调用service()方法处理当前请求

     one.service();

但是这个接口实现类当中现在没有service()方法,而是重写doget()或者dopost()方法

查看源码才知道,原来如此

HttpServlet(父类)重写GenericServlet (爷爷类)把service()留下的方法,并且httpServlet抽象类中有许多请求方式的方法,如dopost(),doget()....,oneServlet(子类)重写doget()或者dopost()方法

Tomcat服务器根据接口实现类示例对象调用service()方法(这个方法是父类HttpServlet的)子类中没有这个方法就是到上一级去找是否有这个方法

HttPservlet抽象类的service()方法可以看出,获取浏览器发起的什么方式的请求方式String method = req.getMethod();

在来判断是GET还是POST请求,调用(oneServlet)子类的doget()还是dopost()方法

这里就 看看Tomcat(服务器)是如何创建的对象  Servlet one = new oneServlet()

在这里可以看到this关键字,Tomcat创建接口实现类对象,Servlet one = new oneServlet()在调用service()方法,one.service()

其实在这里使用了设计模式--------模板设计模式

猜你喜欢

转载自blog.csdn.net/weixin_43725517/article/details/112559310
今日推荐