106

我的文件WebContent/jsps夹中的 JSP 文件中有一个 HTML 表单。我在文件夹servlet.java中的默认包中有一个 servlet 类。src在我的web.xml它被映射为/servlet.

action在 HTML 表单的属性中尝试了几个 URL:

<form action="/servlet">
<form action="/servlet.java">
<form action="/src/servlet.java">
<form action="../servlet.java">

但这些都不起作用。它们都在 Tomcat 6/7/8 中不断返回 HTTP 404 错误,如下所示:

HTTP 状态 404 — /servlet

说明:请求的资源 (/servlet) 不可用。

或者在 Tomcat 8.5/9 中如下所示:

HTTP 状态 404 - 未找到

消息:/servlet

描述:源服务器没有找到目标资源的当前表示或不愿意透露存在的表示

或者在 Tomcat 10 中如下所示:

HTTP 状态 404 - 未找到

类型:状态报告

消息:请求的资源 (/servlet) 不可用

描述:源服务器没有找到目标资源的当前表示或不愿意透露存在的表示

为什么它不起作用?

4

19 回答 19

153
于 2012-07-31T00:24:34.553 回答
4

场景 #1:您在 tomcat已经运行时意外地从命令行重新部署

简答:停止 Tomcat,删除目标文件夹,mvn 包,然后重新部署


场景 #2: request.getRequestDispatcher(" MIS_SPELLED_FILE_NAME .jsp")

简短答案:检查文件名拼写,确保大小写正确。


场景#3:类未找到异常 (答案放在这里,因为:问题#17982240)(java.lang.ClassNotFoundException for servlet in tomcat with eclipse)(被标记为重复并在此处指示我)

简短答案 #3.1:web.xml 在 servlet-class 标记中有错误的包路径。

简短答案 #3.2:java 文件有错误的导入语句。


以下是场景 #1 的更多详细信息:


1:停止Tomcat

  • 选项 1:通过终端中的 CTRL+C。
  • 选项2:(终端关闭而tomcat仍在运行)
  • ------------ 2.1:按:Windows+R --> 输入:“ services.msc
  • ------------ 2.2:在列表的名称栏中找到“Apache Tomcat #.# Tomcat#”。
  • ------------ 2.3:右键-->“停止

2:删除“目标”文件夹。 (这里 mvn clean 帮不了你)

3:mvn包

4:YOUR_DEPLOYMENT_COMMAND_HERE

(我的:java -jar target/dependency/webapp-runner.jar --port 5190 target/*.war)

完整的故事:


不小心打开了一个新的 git-bash 窗口并尝试通过以下方式为我的 heroku 项目部署一个 .war 文件:

java -jar 目标/依赖/webapp-runner.jar --port 5190 目标/*.war

部署失败后,我意识到我打开了两个 git-bash 窗口,并且没有使用 CTLR+C 停止之前的部署

我遇到了:

HTTP 状态 404 - 未找到类型状态报告

消息 /if-student-test.jsp

描述 源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。

Apache Tomcat/8.5.31

以下是场景 #3 的更多详细信息:


场景 3.1:您的 web.xml 文件中的 servlet 类包路径错误。

它应该匹配 java servlet 类顶部的包语句。

文件:my_stuff/ MyClass.java

   package my_stuff;

文件:PRJ_ROOT/src/main/webapp/WEB-INF/ web.xml

   <servlet-class>
   my_stuff.MyClass
   </servlet-class>

场景 3.2:

您在 myClass.java 文件的顶部放置了错误的“ package ”语句。

例如:

文件位于:“ /my_stuff ”文件夹

你错误地写:

package com.my_stuff

这很棘手,因为:

1:maven build(mvn包)这里不会报错。

2:web.xml 中的servlet-class 行可以有正确的包路径。例如:

<servlet-class>
my_stuff.MyClass
</servlet-class>

使用的堆栈: Notepad++ + GitBash + Maven + Heroku Web App Runner + Tomcat9 + Windows10

于 2018-07-16T06:09:21.850 回答
1

检查您是否输入了 Web.xml 中指定的正确 URL 映射

例如:

在 web.xml 中,您的 servlet 声明可能是:

<servlet>
        <servlet-name>ControllerA</servlet-name>
        <servlet-class>PackageName.ControllerA</servlet-class>
</servlet>

<servlet-mapping>
        <servlet-name>ControllerA</servlet-name>
        <url-pattern>/theController</url-pattern>
</servlet-mapping>

这个片段所做的是<url-pattern>/theController</url-pattern>设置将用于从前端(例如:表单)通过 URL 调用 servlet 的名称。因此,当您在前端引用 servlet 时,为了确保请求到达 servlet“ControllerA”,它应该从表单中引用指定的 URL 模式“theController”。

例如:

<form action="theController" method="POST">
</form>
于 2020-11-12T08:05:02.317 回答
0

我的问题是我的方法缺少 @RequestBody 注释。添加注释后,我不再收到 404 异常。

于 2019-01-04T17:24:07.693 回答
0

执行以下两个步骤。我希望它能解决 java servlet 应用程序开发过程中 tomcat 服务器中的“404 not found”问题。

步骤1:Right click on the server(in the server explorer tab)->Properties->Switch Location from workspace metadata to tomcat server

第2步:Double Click on the server(in the server explorer tab)->Select Use tomcat installation option inside server location menu

于 2019-03-20T22:29:53.897 回答
0

NetBeans IDE 中的解决方案HTTP Status 404:右键单击您的项目并转到您的项目属性,然后单击运行,然后输入您的项目相对 URL,如index.jsp.

  1. 项目->属性
  2. 点击运行
  3. 相对 URL:/index.jsp(选择您的项目根 URL)

在此处输入图像描述

于 2018-06-25T11:27:06.547 回答
0

如果您是一名学生并且刚接触 Java,那么您的 web.xml 文件可能会出现一些问题。

  1. 尝试删除 web.xml 文件。
  2. 其次检查您的路径变量是否设置正确。
  3. 重启tomcat服务器或者你的PC。

你的问题一定会解决的。

于 2020-11-07T10:17:43.480 回答
0

如果有人在这里使用 MySQL,并且感觉代码在前一天可以工作,而现在却不行,那么我想你必须打开 MySQL CLI 或 MySQL Workbench,然后只连接一次数据库。连接后,数据库也会连接到 Java 应用程序。我曾经收到 Hibernate Dialect 错误,说明 com.mysql.jdbc.Driver 有问题。我认为某些计算机中的 MySQL 存在启动问题。这为我解决了。

于 2020-10-03T04:25:56.490 回答
0

如果您想在不使用“表单”和“提交”按钮的情况下使用 javascript 打开一个 servlet,下面是以下代码:

var button = document.getElementById("<<button-id>>");
button.addEventListener("click", function() {
  window.location.href= "<<full-servlet-path>>" (eg. http://localhost:8086/xyz/servlet)
});

钥匙:

1) button-id :在 html/jsp 文件中为按钮指定的“id”标签。

2)full-servlet-path:单独运行servlet时在浏览器中显示的路径

于 2020-03-22T10:46:05.130 回答
0

首先,以管理员身份运行 IDE。之后,右键单击项目文件夹 -> Project Facets 并确保 Java 版本设置正确。在我的电脑上。(例如 1.8)现在它应该可以工作了。

不要只使用 cmd 启动服务器,例如 Wildfly。它必须在 IDE 中启动,现在访问您的 localhost URL。示例:http://localhost:8080/HelloWorldServlet/HelloWorld

于 2019-09-24T11:06:24.677 回答
0

一个旧线程,但由于我在其他地方没有找到它,这里还有一种可能性:

如果您使用的是servlet-api 3.0+,那么您的 web.xml不得包含metadata-complete="true"属性

在此处输入图像描述

这告诉 tomcat 使用给定的数据web.xml而不是使用@WebServlet注释来映射 servlet。

于 2019-07-31T10:26:14.220 回答
0

我删除了旧的 web 库,例如 spring 框架库。并建立图书馆的新路径。然后它工作。

于 2019-03-25T06:08:09.317 回答
0

在 web.xml 中映射是我所做的:-

  1. 如果为新程序制作了另一个软件包,那么我们必须提到:-

xml 文件中 servlet-class 标记的打开和关闭之间的 packagename.filename。

  1. 如果您在 xml 中映射文件并且它们不工作或显示错误,请在相应文件中的代码注释行上进行注释。

两种方法都不能互相工作,所以我要么使用我们创建servlet时提到的文件的注释方法,要么使用映射的方式,然后我删除或注释注释行。例如:

 <servlet>
   <servlet-name>s1</servlet-name>
   <servlet-class>performance.FirstServ</servlet-class>
   </servlet>    
   
   <servlet-mapping>
   <servlet-name>s1</servlet-name>
   <url-pattern>/FirstServ</url-pattern>
   </servlet-mapping>
   
   <servlet>
   <servlet-name>s2</servlet-name>
   <servlet-class>performance.SecondServ</servlet-class>
   </servlet>
   
   <servlet-mapping>
   <servlet-name>s2</servlet-name>
   <url-pattern>/SecondServ</url-pattern>
   </servlet-mapping>

如果已完成 xml 中的映射,请在相应文件中注释代码的注释行。

//@WebServlet("/FirstServ")
//@WebServlet("/SecondServ")
于 2020-08-17T12:40:02.053 回答
0

如果您使用的是 IntelliJ,这就是为我解决的问题:

转到Tomcat配置: 在此处输入图像描述

配置 > 部署选项卡 在此处输入图像描述

向下滚动并添加/到应用程序上下文下拉列表 在此处输入图像描述

于 2021-08-04T16:54:35.663 回答
0

对我有用的修复是(如果您使用的是 Maven):右键单击您的项目,Maven -> 更新项目。这可能会给您在 JDK 和其他库(在我的情况下是 MySQL 连接器)方面带来一些其他错误,但是一旦您修复它们,您的原始问题应该得到修复!

于 2019-12-08T05:29:04.817 回答
0

我也遇到了这个问题,当访问我知道链接到 Servlet 的 URL 模式时,我收到了 404。原因是因为我有 2 个 Servlet,它们的 @WebServletname参数设置为相同的字符串。

@WebServlet(name = "ServletName", urlPatterns = {"/path"})
public class ServletName extends HttpServlet {}
@WebServlet(name = "ServletName", urlPatterns = {"/other-path"})
public class OtherServletName extends HttpServlet {}

两个name参数是一样的。如果您使用 name 参数,请确保它们与应用程序中的所有其他 Servlet 相比是唯一的。

于 2020-11-22T13:27:04.720 回答
0

我遇到了同样的问题。我正在开发一个基于 mvc 的 REST API,其中没有明确的 html 配置或文件。API 使用 Swagger 生成用户界面。当我介绍 Swagger 版本“3.0.0”时,问题就开始了。我恢复到 Swagger "2.9.2" 这解决了我的问题。

<!-- Swagger -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
于 2021-09-10T10:48:12.187 回答
0

我遇到过同样的问题。尝试了所有这些但没有帮助。我设法通过在 xml 文件的开头和结尾添加元素标签来解决这个问题。生病将我的 xml 文件留在下面以供参考。

<?xml version="1.0" encoding="UTF-8"?>

<element>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
     
<servlet> 
    <servlet-name>InsertServlet</servlet-name> 
    <servlet-class>com.worklog.InsertServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>InsertServlet</servlet-name> 
    <url-pattern>/insert</url-pattern> 
</servlet-mapping>

</web-app>

</element>
于 2021-05-20T23:25:17.487 回答
-1

请检查上下文根不能为空

如果您使用的是 eclipse:
右键单击,选择属性,然后选择web 项目设置。检查上下文根不能为空

于 2019-05-20T13:12:21.833 回答