servlet容器交互过程简述
1. 启动
servlet容器启动后,底层通过一个SocketServer.accept()等待客户端连接请求。
2. 连接
当servlet容器收到连接请求后,SocketServer.accept()后返回一个Socket对象,通过此对象,servlet可以获取与服务其的InputStream和OutputStream,通过这两个对象,服务器与客户端便可实现交互。
3. 封装
servlet容器,在获取到InputStream和OutputStream对象之后,会将此他们分别封装为request和response对象,以作为Servlet的service()方法的输入参数。
4. response返回
如果,客户端请求的是静态资源,则response对象通过OutputStream对象,直接将请求静态资源写入,返回给客户端。
如果,客户端请求的是servlet,则response对象首先根据请求地址查找到servlet二进制代码所在位置,通过实例化classloader实现对servlet对象的加载。事例化servlet后,将request和response作为services方法参数,调用services方法中,通过OutputStream返回请求结果。
注意:
java中类加载器主要包括四种,即:启动类加载器、扩展类加载器、应用程序加载器、自定义类加载器。其中,前三种加载器是在应用程序启动的时候就已经被实例化了的,在事例化的时候,已经定义了自己的二进制文件加载目录,在某个类需要被加载时候,按照从上到下的顺序,各个层次的类加载会去自己的二进制文件目录查找被加载的类是否在自己的加载目录中,如果在,则加载并实例化。