在这里我们讲到了Servlet例子与注解配置,但是这种实现Servlet的方式每次都要实现5个方法,而对我们来说用最多的往往只是service方法,而其他方法是没用的。所以我们换一种方式来实现Servlet
我们先看一下Servlet的体系结构
发现Servlet的实现类:GenericServlet
那我们就不实现Servlet接口了,去继承GenericServlet类看一下
package com.lingaolu.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /** * @author 林高禄 * @create 2020-07-06-10:46 */ @WebServlet(value="/demo2") public class ServletDemo2 extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("/demo2"); } }
运行访问
后台输出
是不是相当方便,因为其他方法GenericServlet已经重写了,只留了一个service抽象方法,所以我们只需要重写一个方法就可以了,其他方法如果需要那就重写就行
但是还有更方便的,我们看一下GenericServlet的体系
GenericServlet有一个子类:HttpServlet
那我们就集成HttpServlet看一下
发现竟然不用重写任何方法,我们就去HttpServlet看一下源码
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); long lastModified; if (method.equals("GET")) { lastModified = this.getLastModified(req); if (lastModified == -1L) { this.doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader("If-Modified-Since"); } catch (IllegalArgumentException var9) { ifModifiedSince = -1L; } if (ifModifiedSince < lastModified / 1000L * 1000L) { this.maybeSetLastModified(resp, lastModified); this.doGet(req, resp); } else { resp.setStatus(304); } } } 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); } }
发现HttpServlet已经帮我们实现了service方法,里面对GET、POST等7中请求方式做了判断分别走不同的逻辑,那我们实际上的是需要重写这7个请求方法就可以了,实际上我们常用的就是GET和POST,我们的ServletDemo3就重写这2个方法
package com.lingaolu.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; /** * @author 林高禄 * @create 2020-07-06-10:46 */ @WebServlet(value="/demo3") public class ServletDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); System.out.println("doGet......"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); System.out.println("doPost......"); } }
我们知道浏览器直接访问的走的get请求,所以我们启动访问一下
后台输出
下面演示doPost请求
我用Postman演示
后台输出
不会使用的postman的那就自己写一个表单请求吧......