Tomcat为什么要破坏双亲委派模型
这一点其实是Servlet规范里面有提到,建议Servlet容器优先加载Web应用下的类。而实际上Tomcat也这么做了,并且是通过破坏双亲委派模型去实现的。主要目的为了实现各个Web应用的隔离性。因为各个Web应用里面可以用同名的Servlet,如果按照默认的双亲委派模型的话,那么这些同名的Servlet最终都会成为一个Servlet。所以Tomcat就破坏了双亲委派模型
破坏的方法,就是自定义一个WebApplicationClassLoader,继承了ClassLoader类,然后重写了loadClass()方法,因为双亲委派模型就是在这里实现。那在这个方法里面,首先会去查看对应的类是否加载过了,加载过的话就不重复加载。否则的话,它先回去调用扩展类加载器进行加载,这样做的目的是保证一些核心库不被覆盖,因为虽然说优先加载Web应用下面的类,但是肯定有一个原则就是不能覆盖核心类。如果扩展类加载器和启动类加载器加载失败的话,就直接进行自定义加载,也就是对应findClass()方法嘛。从而实现一个隔离性
Tomcat的IO模型
Tomcat的IO模型有三种,BIO,NIO(JDK4),NIO2(或者叫AIO,在JDK7加入),其实还有一个叫APR。
Tomcat如何生成Servlet
其实这个从两个方面去说:
- 从作用域角度,它可以分为单例和复例。默认是单例的。也就是多个线程会共用一个Servlet,这是会产生线程安全问题。对于里面的一些共享变量,可以用ThreadLocal去做;还有一个就是复例,如果Servlet实现了SingleThreadModel接口的话,那么它就是复例的,一个请求到来的时候如果没有空余的Servlet,它会通过反射创建新的Servlet,当然不是无限的,最大可以创建20个Servlet,如果还不够的话,接下来的请求会阻塞
- 类型角度:分为原本Servlet类,还有jsp文件。jsp文件最后也会变成servlet嘛,其实它会先对jsp文件进行解析成一棵结点树,然后再变成一个java文件,然后最后编译成为一个servlet。
有几种在Tomcat中部署Web应用的方法?
- 就是应用放到webapp目录下就可以了
- 在conf文件里面的server.xml配置文件,在host标签下,添加context标签,然后写上路径等信息,也可以部署
- catalina目录下,可以建立一个xml文件来配置