Servlet 返回“HTTP 状态 404 请求的资源 (/servlet) 不可用”

Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available"

提问人:pongahead 提问时间:7/31/2012 最后编辑:BalusCpongahead 更新时间:10/23/2023 访问量:241326

问:

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

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

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

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

HTTP 状态 404 — /servlet

描述:请求的资源 (/servlet) 不可用。

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

HTTP 状态 404 — 未找到

消息:/servlet

说明:源服务器未找到目标资源的当前表示形式,或者不愿意披露存在该表示形式

或者在 Tomcat 10 中如下所示:

HTTP 状态 404 — 未找到

类型:状态报告

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

说明:源服务器未找到目标资源的当前表示形式,或者不愿意披露存在该表示形式

为什么它不起作用?

Servlet http-status-代码-404

评论


答:

165赞 BalusC 7/31/2012 #1

介绍

这可能有很多原因,这些原因在以下部分中细分:

  • 将 servlet 类放在package
  • url-pattern
  • @WebServlet仅适用于 Servlet 3.0 或更高版本
  • javax.servlet.*在 Servlet 5.0 或更高版本中不再起作用
  • 确保编译后的文件存在于构建的 WAR 中*.class
  • 在没有任何 JSP/HTML 页面的情况下单独测试 servlet
  • 使用相对于域的 URL 从 HTML 引用 Servlet
  • 在 HTML 属性中使用直引号

将 servlet 类放在package

首先,将servlet类放在Java中。您应该始终将可公开重用的 Java 类放在包中,否则它们对包中的类(例如服务器本身的源代码)不可见。这样,您就可以消除潜在的特定于环境的问题。无包 servlet 仅适用于特定的 Tomcat+JDK 组合,永远不应依赖此组合。如果您不知道要选择哪个包裹,请从 .packagecom.example

对于“普通”IDE项目,需要将类放在“Java Sources”文件夹内的包结构中,而不是放在“Web Content”文件夹中,该文件夹用于 JSP 等 Web 文件。下面是一个默认 Eclipse 动态 Web 项目的文件夹结构示例,如 Navigator 视图所示(默认情况下,“Java Sources”文件夹在此类项目中由 folder 表示):src

EclipseProjectName
 |-- src
 |    `-- com
 |         `-- example
 |              `-- YourServlet.java
 |-- WebContent
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    `-- jsps
 |         `-- page.jsp
 :

在 Maven 项目的情况下,类需要放在其内部的包结构中,因此不是,这是针对非类文件,绝对不是,这是针对 Web 文件的。下面是默认 Maven Web 应用项目的文件夹结构示例,如 Eclipse 的 Navigator 视图所示:main/javamain/resourcesmain/webapp

MavenProjectName
 |-- src
 |    `-- main
 |         |-- java
 |         |    `-- com
 |         |         `-- example
 |         |              `-- YourServlet.java
 |         |-- resources
 |         `-- webapp
 |              |-- WEB-INF
 |              |    `-- web.xml
 |              `-- jsps
 |                   `-- page.jsp
 :

请注意,子文件夹并不是绝对必要的。您甚至可以不使用它并将 JSP 文件直接放在 webcontent/webapp 根目录中,但我只是从您的问题中接管了这一点。/jsps

url-pattern

Servlet URL 被指定为 Servlet 映射的“URL 模式”。根据定义,它绝对不是 servlet 类的类名/文件名。URL 模式将被指定为注释的值。@WebServlet

package com.example; // Use a package!

import jakarta.servlet.annotation.WebServlet; // or javax.*
import jakarta.servlet.http.HttpServlet; // or javax.*

@WebServlet("/servlet") // This is the URL of the servlet.
public class YourServlet extends HttpServlet { // Must be public and extend HttpServlet.
    // ...
}

如果要支持路径参数,例如 ,请改用 URL 模式。另请参阅 Servlet 和路径参数,如 /xyz/{value}/test,如何在 web.xml 中映射?/servlet/foo/bar/servlet/*

请注意,使用或尝试使用“前端控制器”的 Servlet URL 模式被认为是一种不好的做法。因此,不要滥用这些 URL 模式来尝试捕获所有 URL。有关深入说明,另请参阅 servlet 映射 url 模式中 / 和 /* 之间的区别/*/

@WebServlet仅适用于 Servlet 3.0 或更高版本

为了使用 ,您需要确保您的文件(如果有)(自 Servlet 3.0 以来是可选的)被声明为符合 Servlet 3.0+ 版本,因此不符合例如 2.5 版本或更低版本。它绝对也不应该有任何线条。下面是一个完整的 Servlet 6.0 兼容版本(与 Tomcat 10.1+、WildFly 27+(预览版)、GlassFish/Payara 7+ 等匹配):@WebServletweb.xml<!DOCTYPE>

<?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"
>
    <!-- Config here. -->
</web-app>

下面是一个兼容 Servlet 5.0 的(匹配 Tomcat 10.0+、WildFly 22+(预览版)、GlassFish/Payara 6+ 等)。

<?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_5_0.xsd"
    version="5.0"
>
    <!-- Config here. -->
</web-app>

下面是一个兼容 Servlet 4.0 的(匹配 Tomcat 9+、WildFly 11+、GlassFish/Payara 5+ 等)。

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
    version="4.0"
>
    <!-- Config here. -->
</web-app>

或者,如果您还没有使用 Servlet 3.0+(例如 Tomcat 6 或更早版本),请删除注释(并确保还删除所有错误的 JAR 文件或 Maven 依赖项,这些文件或 Maven 依赖项错误地使您能够成功编译代码):@WebServlet

package com.example;

import javax.servlet.http.HttpServlet;

public class YourServlet extends HttpServlet {
    // ...
}

并像这样注册 servlet:web.xml

<servlet>
    <servlet-name>yourServlet</servlet-name>
    <servlet-class>com.example.YourServlet</servlet-class> <!-- Including the package thus -->
</servlet>
<servlet-mapping>
    <servlet-name>yourServlet</servlet-name>
    <url-pattern>/servlet</url-pattern>  <!-- This is the URL of the servlet. -->
</servlet-mapping>

因此,请注意,您不应同时使用这两种方式。使用基于注释的配置基于 XML 的配置。当您同时拥有两者时,基于 XML 的配置将覆盖基于注释的配置。

javax.servlet.*在 Servlet 5.0 或更高版本中不再起作用

从 Jakarta EE 9 / Servlet 5.0(Tomcat 10、TomEE 9、WildFly 22 Preview、GlassFish 6、Payara 6、Liberty 22 等)开始,该软件包已重命名为 package。javax.*jakarta.*

换句话说,请确保您不要仅仅为了编译包而将不同服务器的 JAR 文件随机放入您的 WAR 项目中,例如 tomcat-servlet-api.jar。这只会引起麻烦。完全删除它们,并从javax.*

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;

import jakarta.servlet.*;
import jakarta.servlet.annotation.*;
import jakarta.servlet.http.*;

如果您使用的是 Maven,您可以在以下答案中找到 Tomcat 10+、Tomcat 9-、JEE 9+ 和 JEE 8- 的正确声明示例:如何在 Tomcat 的 Maven pom.xml 中正确配置 Jakarta EE 库?另一种方法是将服务器降级到旧版本,例如从 Tomcat 10 降级到 Tomcat 9 或更早版本,但这显然不是推荐的方法。pom.xml

如果您使用的是 Spring 而不是 Jakarta EE,那么 Spring 6 和 Spring Boot 3 是第一个面向 Servlet 5.0 的版本,因此也是第一个使用该包的版本。旧版本仍使用该包。相应地调整您的导入。jakarta.*javax.*

您需要绝对确保依赖项中没有任何冲突的库(pom.xml 或 /WEB-INF/lib 中的物理文件),这些库错误地使得仍然可以成功编译 .在至少以 Servlet 5.0+ 为目标的项目中,使用 must 给出编译错误(因此,Jakarta EE 9+ 或 Spring 6+ 或 Spring Boot 3+)。javax.servlet.*javax.servlet.*

确保编译后的文件存在于构建的 WAR 中*.class

如果您使用的是 Eclipse 和/或 Maven 等构建工具,那么您需要绝对确保编译的 servlet 类文件位于生成的 WAR 文件文件夹中的包结构中。如果是 ,它必须位于 中。否则,如果还出现 404 错误,或者出现如下所示的 HTTP 500 错误,您将面临:/WEB-INF/classespackage com.example; public class YourServlet/WEB-INF/classes/com/example/YourServlet.class@WebServlet<servlet>

HTTP 状态 500

实例化 servlet 类 com.example.YourServlet 时出错

并在服务器日志中找到 a ,后跟 a ,然后依次是 。java.lang.ClassNotFoundException: com.example.YourServletjava.lang.NoClassDefFoundError: com.example.YourServletjakarta.servlet.ServletException: Error instantiating servlet class com.example.YourServlet

验证 servlet 是否正确编译并放置在类路径中的一种简单方法是让构建工具生成一个 WAR 文件(例如,右键单击项目,在 Eclipse 中导出> WAR 文件),然后使用 ZIP 工具检查其内容。如果 中缺少 servlet 类,或者导出导致错误,则项目配置不正确,或者某些 IDE/项目配置默认值被错误地恢复(例如,在 Eclipse 中禁用了 Project > Build Automatically)。/WEB-INF/classes

您还需要确保项目图标没有表示生成错误的红叉。您可以在“问题”视图(“窗口”>“显示视图”>“其他...”)中找到确切的错误。通常错误消息很好 谷歌可搜索。如果您不知道,最好是从头开始重新启动,不要触及任何 IDE/项目配置默认值。如果您使用的是 Eclipse,可以在如何在 Eclipse 项目中导入 javax.servlet / jakarta.servlet API 中找到说明?

在没有任何 JSP/HTML 页面的情况下单独测试 servlet

如果服务器在 上运行,并且 WAR 已成功部署在上下文路径上(默认为 IDE 项目名称或 Maven 构建工件文件名,区分大小写!),并且 servlet 初始化未失败(读取服务器日志以查找任何部署/servlet 成功/失败消息以及实际上下文路径和 servlet 映射), 则 URL 模式为 的 servlet 位于 。localhost:8080/contextname/servlethttp://localhost:8080/contextname/servlet

您可以直接在浏览器的地址栏中输入它以进行个性化测试。如果它被正确覆盖和实现,那么您将在浏览器中看到它的输出。或者,如果您没有任何或错误地调用,则会显示“HTTP 405:此 URL 不支持 HTTP 方法 GET”错误(这仍然比 404 更好,因为 405 是实际找到 servlet 本身的证据)。doGet()doGet()super.doGet()

覆盖是一种不好的做法,除非你正在重新发明一个 MVC 框架——如果你刚刚开始使用 servlet,并且对当前问题中描述的问题一无所知,这不太可能。另请参阅基于 Web 的应用程序的设计模式service()

请注意,当 servlet 在进行独立测试时已经返回 404 时,那么尝试使用 HTML 表单是完全没有意义的。因此,从逻辑上讲,在有关 servlet 的 404 错误的问题中包含任何 HTML 表单也是完全没有意义的。

使用相对于域的 URL 从 HTML 引用 Servlet

一旦您验证了 servlet 在单独调用时工作正常,您就可以前进到 HTML。至于HTML表单的具体问题,该值必须是有效的URL。这同样适用于 、、 等。您需要了解绝对/相对 URL 的工作原理。您知道,URL 是一个 Web 地址,您可以在 Web 浏览器的地址栏中输入/查看。如果您将相对 URL 指定为表单操作,即没有方案,那么它就会相对于当前 URL,就像您在 Web 浏览器的地址栏中看到的那样。因此,它绝对不像许多初学者所认为的那样,与服务器的 WAR 文件夹结构中的 JSP/HTML 文件位置有关。<form action><a href><img src><script src>http://

因此,假设带有 HTML 表单的 JSP 页面是由 (而不是由 ) 打开的,并且您需要提交到位于 中的 servlet,以下是几种情况(请注意,您可以在这里安全地用 、、 等替换):http://localhost:8080/contextname/jsps/page.jspfile://...http://localhost:8080/contextname/servlet<form action><a href><img src><script src>

  • 表单操作提交到带有前导斜杠的 URL。

      <form action="/servlet">
    

    前导斜杠使 URL 相对于域,因此表单将提交到/

      http://localhost:8080/servlet
    

    但这可能会导致 404,因为它处于错误的上下文中。


  • 表单操作提交到不带前导斜杠的 URL。

      <form action="servlet">
    

    这使得 URL 相对于当前 URL 的当前文件夹,因此表单将提交到

      http://localhost:8080/contextname/jsps/servlet
    

    但这可能会导致 404,因为它在错误的文件夹中。


  • 表单操作提交到一个 URL,该 URL 向上移动一个文件夹。

      <form action="../servlet">
    

    这将向上移动一个文件夹(与本地磁盘文件系统路径完全相同!),因此表单将提交到

      http://localhost:8080/contextname/servlet
    

    这个必须有效!


  • 但是,规范的方法是使 URL 相对于域,这样当您碰巧将 JSP 文件移动到另一个文件夹时,您就不需要再次修复 URL。

      <form action="${pageContext.request.contextPath}/servlet">
    

    这将生成

      <form action="/contextname/servlet">
    

    因此,它将始终提交到正确的 URL。


在 HTML 属性中使用直引号

你需要绝对确保你在 HTML 属性中使用直引号,例如 or,因此而不是像 or 这样的大引号。HTML 不支持大引号,它们只会成为值的一部分。从博客中复制粘贴代码片段时要小心!众所周知,一些博客引擎,特别是 Wordpress,默认使用所谓的“智能引号”,因此也会以这种方式破坏代码片段中的引号。另一方面,与其复制粘贴代码,不如尝试自己在代码上键入。通过你的大脑和手指实际获取代码的另一个好处是,从长远来看,它会让你更好地记住和理解代码,也会让你成为一个更好的开发人员。action="..."action='...'action=”...”action=’...’

另请参阅:

HTTP 状态 404 错误的其他情况:

评论

1赞 KP Singh 11/23/2023
非常感谢您的详细回答。我错误地使用 jar 命令创建了 war 文件。当我直接从eclipse创建战争时,我的问题得到了解决。
0赞 O R Imon 6/25/2018 #2

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

  1. 项目>物业
  2. 单击“Run”(运行)
  3. 相对 URL:/index.jsp (选择项目根 URL)

enter image description here

5赞 KANJICODER 7/16/2018 #3

场景 #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类标记中具有错误的包路径。

简短的回答 #3.2: java 文件有错误的 import 语句。


以下是方案 #1 的更多详细信息:


1:停止 Tomcat

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

2:删除“target”文件夹。(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 target/*.war

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

我遇到了:

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

消息 /if-student-test.jsp

说明:源服务器未找到当前表示形式 对于目标资源或不愿意披露该资源 存在。

Apache Tomcat/8.5.31

以下是方案 #3 的更多详细信息:


场景 3.1: servlet 类包路径错误 在 Web.xml 文件中。

它应该与顶部的 package 语句匹配 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 文件的顶部。

例如:

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

你错误地写了:

package com.my_stuff

这很棘手,因为:

1:maven 构建(mvn 包)不会在这里报告任何错误。

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

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

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

评论

0赞 jla 10/31/2018
您的 AppName.war,因此分解的文件夹名称与您的预期名称不匹配,例如,当您的 war 文件版本控制为 AppName-1.0-SNAPSHOT.war 并且您正在尝试 /AppName/ 时。
0赞 THE_DOM 1/5/2019 #4

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

0赞 Sajal Saha 3/21/2019 #5

执行以下两个步骤。我希望它能解决 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

0赞 Saige Zhang 3/25/2019 #6

我删除了旧的 Web 库,例如 spring 框架库。并构建库的新路径。然后它起作用了。

-1赞 Wiem Rachman 5/20/2019 #7

请检查上下文根不能为空

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

0赞 Chaitanya 7/31/2019 #8

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

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

enter image description here

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

0赞 Selby Khuzwayo 9/24/2019 #9

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

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

0赞 joseph zhao 12/8/2019 #10

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

0赞 matak8s 3/22/2020 #11

如果您想在不使用“表单”和“提交”按钮的情况下使用 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 时在浏览器中显示的路径

0赞 Sidharth Jain 8/17/2020 #12

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

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

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

  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")
0赞 Tejas Naresh Suvarna 10/3/2020 #13

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

0赞 Mudassar Malik 11/7/2020 #14

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

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

你的问题一定会得到解决。

2赞 Lakindu Hewawasam 11/12/2020 #15

检查是否输入了 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 从前端(例如:表单)调用 servlet 的名称。因此,当您在前端引用 Servlet 时,为了确保请求转到 Servlet “ControllerA”,它应该引用表单中指定的 URL 模式 “theController”。<url-pattern>/theController</url-pattern>

例如:

<form action="theController" method="POST">
</form>
0赞 Mark 11/22/2020 #16

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

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

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

0赞 Yasiru Ops 5/21/2021 #17

我有同样的问题。尝试了所有这些,但没有帮助。我设法通过在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>
2赞 Suitcase Coder 8/5/2021 #18

如果您使用的是 IntelliJ,这就是为我修复它的方法:

转到 Tomcat 配置:enter image description here

“配置>部署”选项卡enter image description here

向下滚动并添加到“应用程序上下文”下拉列表/enter image description here

0赞 Waqar Detho 9/10/2021 #19

我遇到了同样的问题。我正在开发一个基于 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>