1、图解:
(1)
servlet处理http请求,容器指的是tomcat等
(2)servlet处理多个http请求,容器指的是tomcat等,此时多线程,Servlet容器默认是采用单实例多线程的方式处理多个请求的
(3)时序图,举例:访问次URL: http://localhost:8080/day10/first 的过程?
2、springMVC
(3)jvm
第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。(servlet init() 后会生成class文件)Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点像make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。
第二步:字节码由java虚拟机解释运行。(servlet 调用service() 后)因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。
(1)类加载器(class loader)
Java中的类加载器实质上也是也是类,功能是把类加载入JVM中,值得注意的是JVM的类加载器有三个,原因有:一方面是为了分工明确,各自负责各自的区块,另一方面为了实现委托模型。
层次结构如下:
BootStrap Loader(引导类加载器) ----- 负责加载系统类
ExtClassLoader(扩展类加载器) ----- 负责加载扩展类
AppClassLoade(应用类加载器)r ----- 负责加载应用类
(2)Java类加载器的工作原理:
当执行Java的.class文件的时候,java.exe会帮助我们找到jRE,接着找到JRE内部的jcm.dll,这才是真正的Java虚拟机器,最后加载动态库,激活Java虚拟机器。虚拟机激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成后,就会产生第一个类加载器-----Bootstrap Loader,Bootstrap Loader是由C++撰写而成,这个Bootstrap所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载Launcher.java之中的ExtClassLoader,并设定其parent为null,代表其父加载器为BootstrapLoader。然后Bootstrap loader再要求加载Launcher.java之中的AppClassLoader,并设定其parent为之前产生的ExtClassLoader实体。这两个类加载器都是以静态类的形式存在的。注意:LauncherExtClassLoader.class与Launcher ExtClassLoader.class与LauncherExtClassLoader.class与LauncherAppClassLoader.class都是由Bootstrap Loader所加载,所以Parent和由哪个类加载器加载没有关系。
(3)类的生命周期
加载阶段,虚拟机需要完成哪些事情:
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将获取到的二进制字节流转化成一种数据结构并放进方法区
- 在内存中生成一个代表此类的java.lang.Class对象,作为访问方法区中各种数据的接口