子目录下的JSP不能访问类的问题分析

来源:互联网 发布:中文版视频编辑软件 编辑:程序博客网 时间:2024/06/06 12:43
问题现象

主要的目录结构
index.jsp
test/test.jsp
WEB-INF/web.xml
WEB-INF/classes/MyClass.class

2个JSP里面全都调用了MyClass.class
程序内容完全相同,是复制过去改文件名的。

访问 http://127.0.0.1/index.jsp 没有任何问题
访问 http://127.0.0.1/test/test.jsp  报 ClassNotFoundException

服务器其是Tomcat 5.5

故障查找

经过程序测试,发现在/index.jsp里面包含了需要的CLASSAPTH目录,也就是 /WEB-INF/classes
而在 /test/test.jsp 里面,竟然不包含这个目录,当然也就无法访问MyClass类了

查看Tomcat/conf/server.xml, 发现如下配置

复制内容到剪贴板
代码:
 
<Host
    appBase="e:/abc"
    name="abc.123.net"
    <Context
        path="/"
        docBase="e:/abc"
    </Context>
</Host>



其中appBase 和 根的 docBase 指向了同一个目录。问题找到了

故障分析

appBase 的作用是,改目录将作为所有应用的根目录,其下面的任何一个子目录都将成为虚拟目录。
如果你把war文件放到这里,将会被自动解包,并配置成虚拟目录运行

因为每个虚拟目录都有自己独立的CLASSPATH,所以 
/test/test.jsp 被服务器解析为一个独立的虚拟目录,其CLASSPATH 应该在
/test/WEB-INF/classes 里面

故障排除

原因找到了,排除很简单
1 修改appBase到默认目录 appBase="webapps" 推荐这么做
2 修改appBase 到你指定的应用目录,比如 d:/project 目录,然后把你的项目放到这个目录的子目录里面,比如
d:/project/myRoot/index.jsp
d:/project/myRoot/test/test.jsp
d:/project/myRoot/WEB-INF/web.xml
d:/project/myRoot/WEB-INF/classes/MyClass.class

然后对docBase进行修正

这样就可以了!