1.Tomcat服务器是一个大的JAVA程序,这个程序的内部就编写了好多个类加载器,并且加这个类加载器安装到JAVA虚拟机上面。
2.我们实际开发中Servlet也是一个JAVA类,这个Servlet的JAVA类就是被Tomcat自己提供的类加载器加载的。
新建一个 web工程,然后部署Tomcat服务器,新建一个servlet,输入以下代码:
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
PrintWriter out=response.getWriter();
ClassLoader loader=this.getClass().getClassLoader();
while(loader!=null){
out.println(loader.getClass().getName());
loader=loader.getParent();
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}//浏览器返回了一个页面如下:
由此,可以明白Servlet是由Apache公司提供的类加载器加载的.而Tomcat加载器,是由sun公司加载的。
我们把MyServlet打包到你当前Tomcat服务器所使用的jdk的目录下,由根类加载器去加载.
这时我们会看到,Tomcat服务器会报一大堆的错误:
上图说明Tomcat服务器未加载到HttpServlet类,说明它已经找到了我当前创建的MyServlet,在用到MyServlet的时候还用到HttpServlet,再去找HttpServlet的时候没找着,就报错。
刚开始,MyServlet和HttpServlet由webAppClassLoader加载,也就是Tomcat自己的加载器加载的。
如果A用到B,B就由加载A的加载器去加载。
如果按sun建议,发布到lib/ext/itcast.jar中后,没有删除web-inf/classes/目录下的MyServlet.class文件,则不应该出现问题。
这说明Tomcat似乎没有按照sun的建议去做,可是根据以前邮件视频中的类加载,可以确定WebAppClassLoader是自己先加载。
补充说明:以上红色部分是摘自张老师高新技术PPT,个人不是很明白,有时间的话,一定要把张老师所有的视频看完。(目标)
同时,也欢迎各位高手给于指点!!
解决上面这个问题,可以把Tomcat服务器中的serlvet-api.jar复制到与itcast.jar同一个目录下。这样extClassLoader就可以直接找到它,如下图: