文章目录
- 一、继承关系
- 二、相关方法
一、继承关系
Servlet接口下有一个GenericServlet抽象类。在GenericServlet下有一个子类HttpServlet,它是基于http协议。
继承关系
javax.servlet.Servlet接口 javax.GenericServlet抽象类 javax.servlet.http.HttpServlet
二、相关方法
javax.servlet.Servlet接口
-
void init(config) - 初始方法
-
void service(request, response) - 服务方法
当发请求过来时,service方法会被自动调用。(其实是tomcat容器调用的)
-
void destroy() - 销毁方法
javax.GenericServlet抽象类中service方法仍然是抽象的,但init()和destroy()方法已经实现
javax.servlet.http.HttpServlet实现了service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod(); // 获取请求的方式long lastModified;// 各种if判断,根据请求方式不同,决定去调用不同的do方法// 在HttpServlet中这些do方法默认都是405的实现风格-要我们子类去实现对应的方法,否则默认会报405错误// 因此,我们在新建Servlet时,我们才会去考虑请求方法,从而决定重写哪个do方法if (method.equals("GET")) { // 如果发过来的是GET请求...} 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);}}
查看doPost方法,如果我们继承HttpServlet的类没有重写HttpServlet的doPost请求,它就会调用父类(HttpServlet)的doPost方法,直接报405错。
在HttpServlet这个抽象类中,do方法基本都差不多。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String protocol = req.getProtocol(); // 获取http协议String msg = lStrings.getString("http.method_post_not_supported"); // 它会根据http.method_post_not_supported字符串去找另一个字符串,所对应的value值就是消息if (protocol.endsWith("1.1")) {resp.sendError(405, msg); // 报405错,然后把msg显示出来} else {resp.sendError(400, msg);}}