当前位置: 首页 > 知识库问答 >
问题:

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

容磊
2023-03-14

我的WebContent/jsps文件夹中的JSP文件中有一个HTML表单。我有一个servlet类servlet。javasrc文件夹中的默认包中。在我的网站上。xml它被映射为/servlet

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

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

但这些都不管用。它们都会不断返回HTTP 404错误,如Tomcat 6/7/8中的以下错误:

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

或如Tomcat 8.5/9中所示:

消息:/servlet

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

或者在Tomcat 10中如下所示:

类型:状态报告

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

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

为什么不起作用?

共有3个答案

易淳
2023-03-14

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

例如:

在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>

这个片段做的是

如:

<form action="theController" method="POST">
</form>

邴英毅
2023-03-14

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

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

场景2:请求。getRequestDispatcher(“拼写错误的文件名.jsp”)

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

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

简短回答#3.1:网络。xml在servlet类标记中有错误的包路径。

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

1:停止Tomcat

  • 选项1:通过终端中的CTRL C。
  • 选项2:(当tomcat仍在运行时终端关闭)
  • ------------ 2.1:按:Windows R--

2:删除目标文件夹。(mvn清洁在这里帮不了你)

3:mvn包

4:你的部署命令在这里

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

全背故事:

意外地打开了一个新的git bash窗口,并试图部署。我的heroku项目的war文件,通过:

java-jar-target/dependency/webapp-runner。jar——端口5190 target/*。战争

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

我遇到了:

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

信息/如果学生测试。jsp

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

ApacheTomcat/8.5.31

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

它应该与java servlet类顶部的package语句相匹配。

文件:my_stuff/MyClass。爪哇:

   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中的servlet类行。xml可以有正确的包路径。例如:

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

使用的堆栈:记事本GitBash Maven Heroku Web App Runner Tomcat9 Windows 10:

皇甫浩壤
2023-03-14

这可能有很多原因,这些原因在以下章节中被分解:

  • 将servlet类放入一个包中
  • 在URL模式中设置servlet URL
  • @WebServlet仅适用于Servlet 3.0或更新版本
  • javax.servlet.*在Servlet 5.0或更新版本中不再工作
  • 确保编译的*. class文件存在于构建的WAR中
  • 在没有任何JSP/超文本标记语言页面的情况下单独测试servlet
  • 使用域相关URL从超文本标记语言引用servlet
  • 在超文本标记语言属性中使用直引号

首先,将servlet类放在Java中。您应该始终将可公开复用的Java类放在包中,否则它们对于包中的类是不可见的,例如服务器本身。这样您就消除了潜在的环境特定问题。无包servlet仅在特定的Tomcat JDK组合中工作,这一点永远不应该被依赖。

对于“普通”IDE项目,该类需要放在“Java源”文件夹中的包结构中,而不是放在“Web内容”文件夹中,后者用于JSP等Web文件。下面是在Navigator视图中看到的默认Eclipse动态Web项目的文件夹结构示例(“Java Sources”文件夹默认位于该项目中,由src文件夹表示):

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

对于Maven项目,类需要放在main/java内的包结构中,因此不是main/resources,这是针对非类文件的,也绝对不是main/webapp,这是针对web文件的。下面是在Eclipse的Navigator视图中看到的默认Maven webapp项目的文件夹结构示例:

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

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

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.
    // ...
}

如果您想支持路径参数,比如/servlet/foo/bar,那么可以使用/servlet/*的URL模式。另请参见Servlet和路径参数,如/xyz/{value}/test,如何在web中映射。xml?

要使用@WebServlet,只需确保网站。xml文件(如果有)(自Servlet 3.0以来是可选的)被声明为符合Servlet 3.0版本,因此不符合Servlet 2.5或更低版本。下面是一个兼容Servlet 5.0的版本(与Tomcat 10、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或更早版本),请删除@WebServlet注释。

package com.example;

import javax.servlet.http.HttpServlet;

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

并在web中注册servlet。xml如下所示:

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

因此请注意,您不应同时使用这两种方法。使用基于注释的配置或基于XML的配置。如果两者都有,则基于XML的配置将覆盖基于注释的配置。

自雅加达EE 9/Servlet 5.0(Tomcat 10、TomEE 9、WildFly 22预览版、GlassFish 6、Payara 6、Liberty 22等)以来,javax* 软件包已重命名为雅加达* 软件包。

换句话说,请绝对确保不要在WAR项目中随机放置不同服务器的JAR文件,比如tomcat-servlet-api-9。x、 jar只是为了获得javax* 要编译的包。这只会带来麻烦。将其全部删除,并从中编辑servlet类的导入

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-的适当pom.xml声明的示例:Tomcat将servlet转换为javax.servlet.Servlet,而不是jakarta.servlet.http.HttpServlet。另一种选择是将服务器降级到旧版本,例如从Tomcat 10恢复到Tomcat 9或更旧版本,但这显然不是推荐的方式。

如果您使用的是Eclipse和/或Maven等构建工具,那么您需要绝对确保编译的servlet类文件位于生成的WAR文件的/WEB-INF/classes文件夹中的包结构中。如果是包com。实例公共类YourServlet,它必须位于/WEB-INF/classes/com/example/YourServlet中。类。否则,在@WebServlet的情况下,您也将面临404错误,或者

错误实例化servlet类com.example.YourServlet

并在服务器日志中找到一个java。lang.ClassNotFoundException:com。实例你的servlet,后面跟着一个java。lang.NoClassDefFoundError:com。实例YourServlet,然后是雅加达。servlet。ServletException:实例化servlet类com时出错。实例你的servlet

验证servlet是否被正确编译并放置在类路径中的一个简单方法是让构建工具生成一个WAR文件(例如右键单击项目,导出

您还需要确保项目图标没有表示生成错误的红十字。您可以在“问题”视图(窗口)中找到确切的错误

假设服务器运行在localhost:8080上,并且WAR成功部署在/conextname的上下文路径上(默认为IDE项目名称,区分大小写!),并且servlet没有初始化失败(读取任何部署/servlet成功/失败消息的服务器日志以及实际上下文路径和servlet映射),那么具有/servletURL模式的servlet可在http://localhost:8080/contextname/servlet处获得。

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

重写service()是一种糟糕的做法,除非你正在重新创建一个MVC框架——如果你刚开始使用servlet,并且对当前问题所描述的问题一无所知,这是不太可能的;)另请参见基于web的应用程序设计模式。

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

一旦验证了servlet在单独调用时工作正常,就可以进入HTML。至于HTML表单的具体问题,

因此,假设带有HTML表单的JSP页面是由http://localhost:8080/contextname/jsps/page.jsp(因此不是通过file://...),您需要提交到位于http://localhost:8080/contextname/servlet,以下是几种情况(请注意,您可以在这里安全地替换

>

  • 表单操作提交到带有前导斜杠的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属性中使用直接引号,如action=“…” 操作='…' 这样就不需要像action=“…”这样的卷曲引号了 操作='…' 。HTML中不支持卷曲引号,它们只会成为值的一部分。从博客复制粘贴代码片段时要小心!一些博客引擎,尤其是Wordpress,默认情况下会使用所谓的“智能引号”,这也会以这种方式破坏代码段中的引号。另一方面,与其复制粘贴代码,不如试着自己简单地在代码上打字。通过大脑和手指实际获取代码的另一个好处是,从长远来看,它将使你更好地记住和理解代码,并使你成为一名更好的开发人员。

    • 我们的servlets wiki页面-包含一些hello world示例
    • HTTP状态404-Servlet[ServletName]不可用
    • HTTP状态404-请求的资源(/ProjectName/)不可用
    • HTTP状态404-请求的资源(/)不可用
    • /WEB-INF中的JSP返回“HTTP状态404请求的资源不可用”
    • 引用JSP文件中WEB-INF文件夹中的资源会返回HTTP 404 on resource
    • 当调用转发到JSP的Servlet时,浏览器无法访问/查找CSS、图像和链接等相关资源

  •  类似资料:
    • 我的文件夹中的JSP文件中有一个HTML表单。我在文件夹的默认包中有一个servlet类。在我的中,它被映射为。 我在HTML表单的属性中尝试了几个URL: 但这些都没用。它们都在Tomcat 6/7/8中不断返回HTTP 404错误,如下所示: 描述:请求的资源(/servlet)不可用。 或在Tomcat 8.5/9中如下所示: 消息:/servlet 描述:源服务器找不到目标资源的当前表示形

    • 我正在制作一个简单的程序,以几个字段作为输入,然后点击确认按钮后,confirm.jsp将出现。 我创建了Controller.java servlet来标识单击的按钮,然后打开JSP。controller.java存储在web-inf/classes/ch2/servletController目录中,而submit.jsp、register.jsp、confirm.jsp存储在/ch2/serv

    • 我在使用MyEclipse IDE中的Tomcat服务器和Struts 2框架时遇到了一个反复出现的问题。我正在运行我的程序作为一个服务器应用程序,当它运行时,默认的index.jsp文件将成功打开,但该应用程序的其他过去都将无法工作。当试图加载任何我的。do页面,我得到以下错误:HTTP状态404:请求的资源....不可用。当我以前遇到这个错误时,我只是重启了服务器,一切都很好,但是我现在没有同

    • 当我开始login.jsp表单并键入用户名和密码时,我有这个错误错误错误是HTTP状态404:请求的资源不可用。 我错过了什么?有什么帮助吗? 登录。JAVA 登录。jsp Web.xml Struts配置 这就是我http://www.tutorialspoint.com/struts_2/struts_database_access.htm

    • 问题内容: 在Tomcat服务器上运行Eclipse项目时出现以下错误: HTTP状态404-请求的资源(/ ProjectName /)不可用。 浏览器地址栏中的URL为。 我真的不知道文件中缺少什么。我在文件夹中有一个,并且我的包含以下条目: 问题答案: 默认情况下,当您打开项目根文件夹而不是中的物理文件时,服务器将在中查找欢迎文件。如果未找到任何内容,则将出现此404“找不到页面”错误。 就

    • 问题是:我的index.jsp和web.xml总是进入HTTP404和500 我用的是Tomcat6。 这来自index.jsp: 当我注册时: 我点击名字和姓氏,进入404,信息是: 类型状态报告 根据请求,下面是 这里还有项目树: