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()
其实在这里使用了设计模式--------模板设计模式