以tomact服务器为例:
热知识:Servlet是java定义的处理动态资源(非静态资源)的java接口规范,HttpServlet是tomcat实现了servlet接口的类
一.当第一次发送请求时候:
1.查询web.xml中的url-parrtern中配置的路径,tomcat底层维护了两个hashmap,第一个hashmap的key为url-parrtern,value为servlet-name(一个servlet对象的唯一标识);第二个hashmap的key为servlet-name,value为servlet实例
2.查看请求的资源路径是否在xml配置中的url-parrtern,即tomcat底层遍历第一个hashmap,查看是否有key为url-parrtern的map结点,如果没有,则当静态资源(web路径下的资源)进行处理,静态资源也找不到则返回404的状态码,
否则在第一个hashmap中取出key为指定url-parrtern的value,即对应的servlet-name,然后在第二个hashmap中put一个值为上面找到的servle-name,value为该servlet对象的实例,底层扫描xml,
通过dom4j得到该servle-name对应的servlet-class,然后通过反射技术创建该servlet对象,然后放到第二个map中(访问指定存在的url-parrtern再创建对应的servlet实例,前提是未在servle配置信息中指明创建web项目时自动创建,即未指明
<load-on-startup>1</load-on-startup>//xml文件方式
@WebServlet(load-on-startup=1) //注解方式
如果指明了在web项目创建时,就创建,则项目启动就会把servlet实例放到第二个hashmap中,并且调用初始化init()方法
3.找到之后通过反射调用该servlet的初始化方法init()(如果有)然后调用service()方法,注意这里用到了多态的动态绑定的机制
即该类身上并没有service()方法,而在其父类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 = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
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);
}
}
从上图可以看出判断是get请求还是post请求返回调用对应的doGet()方法和doPost()方法,
而这两个方法要进行重写,写自己的业务逻辑,然后调用的便是自己写的doGet和doPost方法,
用到了多态的动态绑定机制!!
初始化init方法和service方法的调用顺序如下:
二.当第二次及以后再发送请求时候:
直接通过查询两个tomcat维护的hashmap,第一个通过url-parrtern得到servlet-name,第二个通过servlet-name得到servlet实例,然后调用service()方法
三.说明:
1.Servlet实例对象是单例的,因为默认只有在第一次访问对应的url时才创建,以后再访问则是通过hashmap直接取出来的
2.tomcat维护的两个servlet是常驻内存的,知道web工程销毁或其他指定的方式
3.redepoly就会销毁所有的servlet实例对象
下一期介绍HttpservletRequest和HttpservletResponse
注:封面背景来自百度,
笔记参照了教育机构的老师,如有侵权请与我联系qq1989866756