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

本文解决了一个在Tomcat 5.5环境下,由于CLASSPATH配置不当导致的ClassNotFoundException问题。通过调整server.xml中的appBase和docBase配置,确保了所有JSP文件能够正确访问共享的类资源。
问题现象

主要的目录结构
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进行修正

这样就可以了! 
 

<think>我们正在讨论Servlet和JSP访问机制。根据引用[1],Servlet的实现(如com.tsccg.controller.ServletDemo01)不能被直接访问,因为它的路径很长且复杂,用户难以记忆和输入。因此,在web.xml配置中,我们通过<servlet>和<servlet-mapping>标签为Servlet实现设置一个简短的别名(如/demo01),这样用户就可以通过这个别名来访问。而JSP文件本质上是一个以.jsp为扩展名的文件,它被放置在Web应用的可见目录下(如WebContent或WEB-INF之外),因此用户可以直接通过JSP文件的路径来访问(例如:http://localhost:8080/MyWeb/login.jsp)。但是,JSP在运行时会被容器(如Tomcat)编译成一个Servlet(即“servlet”)来执行。为什么实现不能直接访问?1.**安全性**:如果允许用户直接访问Servlet实现,那么用户就需要知道完整的名和包结构,这可能会暴露应用程序的内部结构,增加安全风险。2.**封装性**:通过配置别名,可以将内部实现细节隐藏起来,只暴露一个简洁的URL给用户。3.**灵活性**:通过配置,可以轻松更改实现而不影响用户访问的URL。为什么JSP可以直接访问?1.**位置可见**:JSP文件通常放在Web应用的根目录或子目录下,这些目录是Web服务器可以直接访问的。2.**容器处理**:当请求一个JSP时,容器会自动将其转换为Servlet并执行,然后将结果返回给用户。总结:-Servlet实现不能直接访问是因为它被封装在WEB-INF/classes目录下(受保护),且通过配置别名来提供访问。-JSP可以直接访问是因为它位于Web应用的公开目录下,并由容器自动编译执行。相关问题:1.如何在web.xml中配置Servlet的访问路径?2.为什么JSP文件不需要在web.xml中配置就可以直接访问?3.WEB-INF目录下的文件有什么访问限制?</think>### Servlet与JSP访问机制分析 #### 1. **Servlet实现无法直接访问的原因** - **安全隔离机制**:Servlet实现通常位于`WEB-INF/classes`目录下,该目录受容器保护[^1]。用户直接访问时会触发安全拦截,返回404错误。 - **访问路径抽象**:通过`web.xml`配置的`<servlet-mapping>`将实现路径映射为简短别名(如`/demo01`)[^1]。例如: ```xml <servlet> <servlet-name>demo01Path</servlet-name> <servlet-class>com.tsccg.controller.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo01Path</servlet-name> <url-pattern>/demo01</url-pattern> <!-- 用户实际访问的路径 --> </servlet-mapping> ``` - **容器管理要求**:Servlet生命周期(初始化、服务、销毁)必须由Servlet容器(如Tomcat)控制,直接访问会绕过容器管理流程。 #### 2. **JSP可直接访问的原因** - **自动编译机制**:JSP文件存放在Web根目录(如`/webapp/*.jsp`),容器会自动将其编译为`HttpJspPage`实现(本质仍是Servlet)[^2]。 - **默认路径映射**:容器内置`*.jsp`的URL模式匹配,无需额外配置。例如`login.jsp`可直接通过`http://host/login.jsp`访问。 - **设计定位差异**:JSP侧重视图层(HTML+动态标签),天然面向直接请求;Servlet侧重控制逻辑,需通过配置暴露接口[^3]。 #### 3. **Servlet与JSP的技术关系** $$ \text{JSP} \xrightarrow{\text{编译}} \text{Servlet} \xrightarrow{\text{容器托管}} \text{HTTP响应} $$ - JSP本质是Servlet的语法糖,最终仍以Servlet形式运行[^2]。 - 区别在于: - **Servlet**:需显式配置别名,业务逻辑与HTML分离 - **JSP**:直接路径访问,混合Java与HTML标签 #### 4. **安全设计对比** | 组件 | 直接访问性 | 原因 | |-------------|------------|--------------------------| | Servlet实现 | ❌不可 | 受`WEB-INF`目录保护 | | JSP文件 | ✅可 | 位于Web根目录开放区域 | | 配置别名 | ✅可 | 通过`<url-pattern>`暴露 | > **关键结论**:Servlet实现不能直接访问是容器安全机制与设计规范的要求,而JSP通过自动编译和路径开放实现直接访问。两者本质都是Servlet技术栈的不同表现形式[^3]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值