--- catalina
bootstrap --- system (sun misc Launcher&appClassLoad) --- common
--- webapp1
--- shared
--- webapp2 ...
--- web.xml 注册servlet, 映射路径,指定默认打开页面
--- WEB-INF 应用程序
--- classes 文件夹 --- class文件由webapp装载
应用程序
--- demo --- text.html
--- class文件直接由System类装载
张孝祥视频笔记
应用程序名称目录下的.class文件的装载器为system classload 如果需要找到关联类,必须把关联类servlet-api.jar文件复制到Jdk jre目录下的 lib 目录下ext 目录下 jar 包中
应用程序目录下WEB-INF目录下的classes目录下的.class文件则由Webappclassload 装载 ,只有Webapp自己可以加载到这个类
jdk目录下的jre文件下lib下的ext 目录下的jar包为核心装载器
webapp能够搜索到WEB-INF目录下classes文件夹下的.class文件
如果类文件没有找到,那么把文件所在路径增加到tomcat bin 目录下 setclasspath.bat文件中 set classpath=; ; ;
如果在不同目录下存在两个相同名字的.class文件,浏览器没有遵循sun公司的建议,只有删除system能够装载的那个.class文件,才会用org.apache.catalina.loader.WebappClassLoad去装载.
Tomcat中的类装载器
1 . Bootstrap 为Java虚拟机内嵌的类装载器与ExtClassLoader的总称,负责加载Java核心包中的类和存放在<JAVA_HOME>/jre/lib/ext目录下的类
2. System即系统类装载器,通常情况下就是AppClassLoader,负责加载CLASSPATH环境变量设置的目录中的类. Tomcat 不会继承操作系统上原来设置好的classpath环境变量的内容,而是将classpath环境变量重新设置为仅包含如下两个包:
<CATALINA_HOME>/bin/bootstrap.jar <JAVA_HOME>/lib/tools.jar
3. Common类装载器负责从<CATALINA_HOME>/COMMON/CLASSES中的.class类文件和<CATALINA_HOME>/common/lib中的jar包加载类
4. Catalina类装载器负责从<CATALINA_HOME>/server/classes中的.class类文件和<CATALINA_HOME>/server/lib中的jar包加载类
5 Shared类装载器负责从<CATALINA_HOME>/share/classes中的.class类文件和<CATALINA_HOME>/share/lib中的jar包加载类
6WebappX类装载器负责从当前Web应用程序的/WEB-INF/classes中的.class类文件和/WEB-INF/lib中的jar包加载类
编写自动编译工具
1 编写Servlet源文件时的两个繁琐问题:
(1) 必须将包含有Servlet API 的 jar文件加入到CLASSPATH环境变量的路径列表中
(2) 编译生成的.class文件必须放置在Web应用程序的WEB-INF/classes目录中,并且有与包名对应的子目录结构
2 解决方案:使用compile.bat批处理文件
set CLASSPATH=C:/tomcat6.0/lib/servlet-api.jar;%CLASSPATH%
javac -d d:/myweb/WEB-INF/classes %1
pause
tomcat也提供了是否自动重新装载被修改的Servlet的配置选项. 在tomcat6.0安装目录/conf/server.xml文件中,可以将<Context>元素的reloadable属性设置为true,这样 tomcat 将监视该WEB应用程序的/WEB-INF/classes和/WEB-INF/lib目录下的类是否发生了改变,然后自动重新装载那些发生了改变的类.
<Context path="/it315" docBase="d:/myweb" debug="0" reloadable"true"/>