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

118
我在我的WebContent/jsps文件夹中有一个JSP文件中的HTML表单。我在src文件夹中的默认包中有一个servlet类servlet.java。在我的web.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中所示:
HTTP状态404 - /servlet 描述:所请求的资源(/servlet)不可用。
或者在Tomcat 8.5/9中如下所示:
HTTP状态404 - 未找到 消息:/servlet 描述:源服务器未找到目标资源的当前表示,或者不愿透露该资源的存在。
或者在Tomcat 10中如下所示:
HTTP状态404 - 未找到 类型:状态报告 消息:所请求的资源(/servlet)不可用 描述:源服务器未找到目标资源的当前表示,或者不愿透露该资源的存在。
为什么不起作用呢?
19个回答

0
一个老的帖子,但是因为我在其他地方没有找到它,这里还有一种可能性:
如果您正在使用servlet-api 3.0+,那么您的web.xml文件必须不包括metadata-complete="true"属性。

enter image description here

这将告诉Tomcat使用web.xml中提供的数据来映射Servlet,而不是使用@WebServlet注释。


0
NetBeans IDE中的HTTP状态404解决方案: 右键单击您的项目并转到项目属性,然后单击运行,然后输入您的项目相对URL,例如index.jsp。
  1. 项目->属性
  2. 点击运行
  3. 相对URL:/index.jsp(选择您的项目根URL)

enter image description here


0

如果您是一名学生,新手学习Java时可能会遇到web.xml文件的某些问题。

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

您的问题肯定会得到解决。


0
我也遇到了这个问题,当访问一个我知道与Servlet相关联的URL模式时,我收到了404错误。原因是我有两个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参数是相同的。如果您正在使用name参数,请确保它们与应用程序中的所有其他Servlet唯一。


0
如果有人正在使用MySQL,并且感觉代码在前一天可以工作,但现在无法工作,那么我猜您必须打开MySQL CLI或MySQL Workbench,只需连接到数据库一次即可。一旦连接成功,数据库也会连接到Java应用程序。我曾经遇到过Hibernate方言错误,指出com.mysql.jdbc.Driver存在问题。我认为某些计算机上的MySQL存在启动问题。这对我来说解决了问题。

0

我移除了旧的Web库,换成了Spring框架库,并构建了新的库路径。然后它就可以工作了。


0

请按照以下两个步骤操作。希望这能解决在开发Java Servlet应用程序时Tomcat服务器出现的“404未找到”问题。

第一步:在服务器资源管理器选项卡中右键单击服务器 -> 属性 -> 将位置从工作区元数据切换到Tomcat服务器

第二步:在服务器资源管理器选项卡中双击服务器 -> 在服务器位置菜单中选择使用Tomcat安装选项


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")

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接