本文转载自:https://blog.csdn.net/TomasEdision/article/details/76059408
但是我根据他的主要内容进行了提炼和总结。
Servlet工作流程描述
在浏览器地址栏输入网址http://localhost:8080/sgrweb/MyFirstServlet时
每个部分含义分别是什么:
localhost代表的是主机
8080代表的是端口号
sgrweb代表的是web应用名称
MyFirstServlet代表资源名称
(1)找到主机的ip。
用户在浏览器地址栏输入网址http://localhost:8080/sgrweb/MyFirstServlet时候,浏览器会自己先解析主机名localhost,回去本地的host文件去查询主机有没有配备一个ip地址如果在host文件当中查不到的话浏览器会去dns查询。
(2)服务器(tomcat)解析。
查到主机的ip地址之后就会转到web服务器去了。首先浏览器会先向web服务器发送一个试探包(尝试连接),如果web服务器对浏览器有响应的话,浏览器就会发出http请求。web服务器收到浏览器发出的http请求之后它会自己先解析出主机名(因为tomcat管理多个主机),然后解析出web应用。web服务器解析出web应用之后就会知道对应web应用的web.xml文件,因为我们知道每一个web应用都对应一个web.xml文件。最后web服务器解析出资源名称这里就是MyFirstServlet。
(3)通过配置文件(web.xml)找到相应的servlet
完成之后web服务器去查询对应web应用的web.xml文件得知资源(MyFirstServlet)在哪一个包下面。具体web.xml关键代码如下:
- <servlet>
- <servlet-name>MyFirstServlet</servlet-name>
- <servlet-class>com.sgrweb.MyFirstServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>MyFirstServlet</servlet-name>
- <url-pattern>/MyFirstServlet</url-pattern>
- </servlet-mapping>
从下往上找。
(4)servlet中函数处理request对象。
成功之后就会找到相应的Servlet了。然后web服务器就会使用反射机制,创建实例。调用init()方法将该实例装载到内存,该方法只被调用一次。web服务器把接收到的http请求封装成一个Request对象,作为service函数的参数传递进去。service函数会被调用多次,每访问一次Servlet,它的service函数就会被调用一次
(5)servlet返回response对象。
要返回结果给web服务器的话需要获取response对象,该对象有各种信息。web服务器获取到结果之后不是直接返回给浏览器而是先将response的信息拆解出来形成http响应格式。然后将这个结果返回给浏览器。
(6)浏览器得到结果之后会自己能识别的格式进行解析。
(7)当在某些情况下(主要有三种)web服务器会调用该Servlet的destroy函数,将该Servlet销毁。
注意:
1.当Servlet第一次被调用的时候会触发init函数,该函数会把servlet实例加载到内存。该函数只会被调用一次。
2.然后去调用servlet的service函数
3.当第二次包括第二次以后就直接调用service函数
4.当web应用需要reload或者是关闭tomcat或者关机都会去调用destroy函数。该函数就会去销毁servlet。
下面三种情况会调用destroy函数第一种就是关闭tomcat,第二种就是web应用reload,第三种情况就是关机