在http://localhost:8080/WEB-INF/views/hello.jsp中显示404源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。Apache Tomcat/10.1.43
时间: 2025-07-07 19:19:27 浏览: 14
<think>我们遇到的是在Tomcat服务器上访问JSP页面时出现404错误。错误信息表明服务器找不到指定的资源(hello.jsp)或者虽然存在但不愿公开。这个问题通常与文件路径、部署配置或访问权限有关。
### 可能的原因及解决方案:
1. **文件路径错误**:
- 文件可能不在`WEB-INF/views/`目录下,或者路径大小写不匹配(Linux系统区分大小写)。
- 检查项目结构中`hello.jsp`的实际位置。
2. **WEB-INF目录的特殊性**:
- `WEB-INF`目录下的内容不能通过客户端直接访问,只能通过服务器内部转发(如Servlet转发)。因此,直接通过URL访问`WEB-INF`下的JSP会导致404。
- 正确的做法是通过一个Servlet来处理请求,然后转发到JSP。
3. **部署问题**:
- 项目可能没有正确部署到Tomcat的webapps目录下。
- 检查Tomcat的webapps目录中是否存在你的项目,以及项目结构是否正确。
4. **上下文路径配置**:
- 访问URL中的上下文路径(Context Path)可能不正确。例如,如果项目部署为`myapp`,则访问URL应为`http://localhost:8080/myapp/your_servlet_path`。
### 解决方案步骤:
#### 1. 确保通过Servlet转发访问JSP
由于`WEB-INF`下的内容受保护,不能直接通过URL访问,因此需要创建一个Servlet,在Servlet中处理请求并转发到JSP。
例如,创建一个名为`HelloServlet`的Servlet,将其映射到`/hello`,然后在`doGet`方法中转发到`/WEB-INF/views/hello.jsp`。
**HelloServlet.java**:
```java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/hello.jsp");
dispatcher.forward(request, response);
}
}
```
#### 2. 检查JSP文件位置
确保`hello.jsp`位于项目的`WEB-INF/views`目录下。项目结构应该如下:
```
Project
├── src
│ └── HelloServlet.java
└── web
├── WEB-INF
│ ├── views
│ │ └── hello.jsp
│ └── web.xml
└── index.html (可选)
```
#### 3. 部署到Tomcat
确保项目正确部署到Tomcat。如果使用IDE(如IntelliJ或Eclipse),检查部署配置:
- 确保部署的上下文路径正确(如`/myapp`)。
- 检查Artifact设置,确保WEB-INF目录被包含。
#### 4. 访问URL
通过Servlet的URL来访问,而不是直接访问JSP。例如:
```
http://localhost:8080/你的项目上下文路径/hello
```
如果项目上下文路径是`myapp`,则访问:
```
http://localhost:8080/myapp/hello
```
### 其他可能的原因:
- **web.xml配置问题**:如果使用注解`@WebServlet`,则不需要在web.xml中配置。但如果你没有使用注解,则需要在web.xml中配置Servlet和映射。
- **Tomcat版本兼容性**:确保你的Servlet和JSP版本与Tomcat版本兼容。Tomcat 10.1支持Servlet 6.0和JSP 3.1。
### 示例:web.xml配置(如果使用web.xml)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0"
metadata-complete="false">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
```
### 总结:
404错误通常是由于资源路径错误或访问受限资源(如WEB-INF下的文件)直接引起的。通过Servlet转发可以安全地访问WEB-INF下的JSP。同时,确保项目结构正确并部署到Tomcat。
### §§相关问题§§:
1. 为什么WEB-INF目录下的JSP不能直接通过URL访问?
2. 在Servlet中如何实现请求转发和重定向?它们有什么区别?
3. Tomcat部署Web应用时,如何配置上下文路径(Context Path)?
4. 如何解决Tomcat服务器中出现的JSP编译错误?</think>### 解决 Tomcat 中 JSP 404 错误:源服务器未能找到目标资源
这个错误通常发生在访问位于 `WEB-INF` 目录下的 JSP 文件时,因为 Tomcat 的安全机制会阻止直接访问该目录中的资源。以下是完整的解决方案:
#### 根本原因分析
1. **安全限制**:`WEB-INF` 目录下的内容受保护,不能通过浏览器直接访问
2. **路径错误**:URL 路径与实际文件位置不匹配
3. **部署问题**:应用未正确部署到 Tomcat
4. **配置错误**:web.xml 或上下文配置不正确
---
### 解决方案代码
#### 1. 创建 Servlet 控制器 (Java)
```java
// HelloController.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/hello")
public class HelloController extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/hello.jsp");
dispatcher.forward(request, response);
}
}
```
#### 2. 正确的 JSP 文件位置
确保项目结构符合标准:
```
WebContent/
├── WEB-INF/
│ ├── views/
│ │ └── hello.jsp # 你的JSP文件
│ └── web.xml
└── index.jsp
```
#### 3. web.xml 配置 (可选)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<!-- 如果使用注解方式可省略此配置 -->
<servlet>
<servlet-name>HelloController</servlet-name>
<servlet-class>com.example.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloController</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
```
#### 4. 正确访问 URL
使用控制器映射的路径访问:
```
http://localhost:8080/你的应用上下文路径/hello
```
而不是直接访问 JSP 路径
---
### 解决方案详解
1. **为什么不能直接访问 WEB-INF 下的文件?**
Tomcat 将 `WEB-INF` 视为受保护目录,直接访问会返回 404。必须通过 Servlet 或控制器转发。
2. **Servlet 控制器的作用**
- `@WebServlet("/hello")` 创建 URL 映射
- `request.getRequestDispatcher()` 获取 JSP 的转发器
- `forward()` 方法执行内部转发(不改变浏览器地址)
3. **项目结构要求**
JSP 必须放在 `WEB-INF` 子目录中,标准做法是使用 `views` 文件夹存放所有视图文件。
4. **访问流程**
客户端请求 → Servlet 处理 → 内部转发到 JSP → 返回渲染后的 HTML
---
### 其他常见修复方法
1. **检查上下文路径**:
```java
// 在Servlet中获取真实路径
String realPath = getServletContext().getRealPath("/WEB-INF/views/hello.jsp");
System.out.println("实际路径: " + realPath);
```
2. **部署验证**:
- 检查 Tomcat 的 `webapps` 目录是否包含你的应用
- 确认 `WEB-INF/views/hello.jsp` 文件已正确部署
3. **权限问题修复** (Linux/Mac):
```bash
# 确保Tomcat有读取权限
chmod -R 755 /path/to/tomcat/webapps/your-app
```
4. **清理缓存**:
- 删除 Tomcat 的 `work/Catalina` 目录
- 清理浏览器缓存
---
### 验证成功的标志
1. 访问 `http://localhost:8080/your-app/hello` 显示 JSP 内容
2. Tomcat 日志无 `FileNotFoundException`
3. 浏览器开发者工具中网络请求返回 200 状态码
---
###
阅读全文
相关推荐


















