HTTP状态码404 - Servlet [ServletName]不可用。

5
问题:我的带有web.xml的index.jsp页面经常出现HTTP 404和500错误。
我使用的是Tomcat6。
以下是index.jsp的代码片段:
  <legend>Registration</legend>
  <form action="./register"> <%-- Address from web.xml  --%>
    First name: <input type="text" name="firstName"><br>
    Last name: <input type="text" name="lastName"><br>
    <input type="submit" value="Register">
  </form>

当我在注册页面时: enter image description here 当我输入名字和姓氏后,会进入404页面,出现以下信息:
HTTP状态404-Servlet RegistrationServlet不可用
类型:状态报告
消息:Servlet RegistrationServlet不可用
描述:请求的资源(Servlet RegistrationServlet不可用)不可用。
Apache Tomcat/6.0.35
您认为这个错误的原因是什么?
类RegistrationServlet位于文件RegistrationServlet.java中,位于src/coreservlets/文件夹下。
我已经检查了web.xml,但看起来没问题,这是它的内容(如果有帮助):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  <servlet>
    <servlet-name>ShowBalance</servlet-name>
    <servlet-class>coreservlets.ShowBalance</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ShowBalance</servlet-name>
    <url-pattern>/show-balance</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>RandomNumberServlet</servlet-name>
    <servlet-class>coreservlets.RandomNumberServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>RandomNumberServlet</servlet-name>
    <url-pattern>/random-number</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>RegistrationServlet</servlet-name>
    <servlet-class>coreservlets.RegistrationServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>RegistrationServlet</servlet-name>
    <url-pattern>/register</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>PrimeServlet</servlet-name>
    <servlet-class>coreservlets.PrimeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PrimeServlet</servlet-name>
    <url-pattern>/prime</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

我已经尝试了两天来解决这个小问题,但没有任何进展,非常感谢任何帮助。

编辑:

根据要求,这里是RegistrationServlet

package coreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RegistrationServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        synchronized (session) {
            NameBean nameBean = (NameBean) session.getAttribute("name");
            if (nameBean == null) {
                nameBean = new NameBean();
                session.setAttribute("name", nameBean);
            }
            nameBean.setFirstName(request.getParameter("firstName"));
            nameBean.setLastName(request.getParameter("lastName"));
            String address = "/WEB-INF/mvc-sharing/ShowName.jsp";
            RequestDispatcher dispatcher = request
                    .getRequestDispatcher(address);
            dispatcher.forward(request, response);
        }
    }
}

此外,这是项目树: enter image description here

1
在您的表单操作中,尝试将“./register”更改为“/register”(删除点)。 - Tomer
@ftom2:我得到了这个:`HTTP状态404 - /register类型状态报告消息/register描述所请求的资源(/register)不可用。Apache Tomcat/6.0.35` - JAN
@ITCuties:尝试过了,得到了这个:`HTTP状态404 - /register类型状态报告消息/register描述所请求的资源(/register)不可用。Apache Tomcat/6.0.35` - JAN
服务器日志显示了什么?有没有任何信息? - ITCuties
有没有人可以帮我检查一下这个问题?谢谢。https://stackoverflow.com/questions/29312999/http-status-404-liangweb-timeform - blackbird patel
显示剩余2条评论
4个回答

5
您的URL没有问题。如果URL错误,您将会收到以下404消息:

请求的资源register不可用

但是您得到了以下内容:

Servlet RegistrationServlet不可用

这意味着该servlet已被找到,但由于其构建和初始化失败而无法执行,出现了异常。在Tomcat的背后,基本上有以下一步失败了:
Servlet servlet = new RegistrationServlet();
servlet.init(servletConfig);
servlet.init();

您需要阅读服务器日志以查找此异常,然后相应地修复代码。


虽然您的URL完全没有问题,但它容易因上下文变化而出错。最好使用相对于域名的URL进行指定:

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

请参考这个相关的答案:当调用转发到JSP的Servlet时,浏览器无法访问/找到CSS、图片和链接等相对资源


@Pshemo:是的。这甚至是MVC中推荐的做法。只有servlet可以通过RequestDispatcher转发到它们。这样,用户被迫使用前端控制器servlet来访问JSP,并且永远不能单独访问那些需要预处理/后处理servlet的JSP。另请参阅我们的servlets wiki页面以了解如何使用servlets:http://stackoverflow.com/tags/servlets/info - BalusC
非常感谢。很抱歉我感谢得这么晚,但我需要测试你告诉我的内容,以确保我理解得正确 :) - Pshemo
@BalusC: 非常感谢您在我上一篇文章中的帮助。其次,我已经尝试使用这个<form action="${pageContext.request.contextPath}/register">,但我仍然会遇到如下类似的404页面:HTTP状态404 - Servlet RegistrationServlet不可用。状态报告类型消息Servlet RegistrationServlet不可用。请求的资源(Servlet RegistrationServlet不可用)不可用.。我该在哪里找到日志文件呢? - JAN
@BalusC:好的,那么我得到了这个“HTTP状态500 -类型异常报告消息描述 服务器遇到了一个内部错误(),阻止它满足这个请求。异常javax.servlet.ServletException:Wrapper无法找到servlet类coreservlets.RegistrationServlet或其依赖项”,这意味着它找不到该类。我该如何修复?这真让人恼火 :) - JAN
请阅读服务器启动日志,而不是HTTP 500错误页面。在Eclipse中,它只是在启动服务器时出现的控制台中。 - BalusC
显示剩余6条评论

1

嗯...这很明显,但是RegistrationServlet.class是否在/WEB-INF/classes/coreservlets/中?你编译了吗?(使用Tomcat,您需要显式编译吗?如果不需要,那将令人惊讶。)


0
如果在实例化Servlet时发生任何错误,我们将会得到这种类型的错误,即使WEB-INF\lib文件夹中缺少库。请确保所有库都放置在WEB-INF\lib中。

0

可能是注册路径没有考虑上下文路径。解决此问题的好方法是使用JSTL核心URL标签 -

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
...
<c:url value="/register" var="url">
<form action="${url}">

这将确保如果您的上下文路径添加到URL中。


我应该下载哪个jstl版本?然后,在index.jsp的头部(第一行)添加以下代码<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>即可。 - JAN
JSTL 1.2,您可以从此处下载 - http://search.maven.org/remotecontent?filepath=javax/servlet/jstl/1.2/jstl-1.2.jar,并在jsp文件顶部添加该声明。 - Biju Kunjummen
您提供的JSTL URI已经过时。请阅读我们的JSTL维基页面以获取正确的指南:http://stackoverflow.com/tags/jstl/info 除此之外,这并没有以任何方式回答具体的问题。 - BalusC
哦,谢谢,我没有意识到 jstl 链接已经过时了。是的,这个建议并不能解决根本问题,只是猜测这可能是 servlet 找不到的原因之一。对你的回答点赞。 - Biju Kunjummen

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