概述
是运行在web服务器上的java程序,用来处理前端(客户端)的响应和请求
生命周期
Servlet对象是由tomcat服务器创建的。默认第一次浏览器中输入servlet访问时创建该对象,也可以通过配置服务器一启动就创建对象
服务器关闭servlet就销毁了
使用
方法
/** * 运行一个项目,当开启服务器是都没有执行,输入地址访问,init()service()运行, * 刷新一次service执行一次,当关闭服务器tomcat时候,init()service()销毁,destroy执行 */ public class DemoServlet implements Servlet { //servlet对象创建的时候执行(并不是tomcat服务器启动的时候 是在浏览器输入的访问servlet类的时候) @Override public void init(ServletConfig servletConfig) throws ServletException { //ServletConfig参数作用 1、获取配置信息 2、获取xml中的参数 3、获取所有的参数名称 4、获取ServletContext对象 servletConfig.getServletName(); servletConfig.getInitParameter("xxx"); servletConfig.getInitParameterNames(); servletConfig.getServletContext(); } @Override public ServletConfig getServletConfig() { return null; } //ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息, // ServletResponse :代表响应 认为要封装的是响应的信息 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { } @Override public String getServletInfo() { return null; } //servlet销毁的时候执行 @Override public void destroy() { } }
配置
测试
浏览器输入http://localhost:8080/web02---servlet练习/abc后台就可以看到servlet方法中的内容
执行过程分析
配置说明
url-pattern配置
缺省的servlet
可以将url-pattern配置成一个/,代表该servlet是缺省的servlet,当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理
全局web.xml
静态资源加载过程
3.0时代
实现
从servlet3.0开始就可以直接使用注解的方式创建servlet,直接new一个servlet
//有了这个注解 就不用再写配置文件,括号内容就是地址栏中path后面跟的内容 @WebServlet("/myFirsetServlet") public class MyFirsetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.service(req, resp); } }
web.xml
metadata-complete是否扫描注解 true不扫描 false扫描
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <absolute-ordering/> <display-name>market</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
内部方法的调用过程
收到一个servlet请求,tomcat会找到这个servlet对应的service方法,如果没有service方法就会到父类当中去找
如下源码,内部会把ServletRequest参数转成HttpServletRequest,转换完成后继续调用HttpServletRequest的service方法,根据不同的参数类型调用不同的方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest)req; response = (HttpServletResponse)res; } catch (ClassCastException var6) { throw new ServletException(lStrings.getString("http.non_http")); } this.service(request, response); } 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); } }