一、关系图
二、源码解析
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>");
}
}