Статус HTTP 404 - Сервлет [имя сервлета] недоступен

Проблема: мой index.jsp с web.xml продолжает переходить в 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 - Сервлет RegistrationServlet недоступен

тип Отчет о состоянии

сообщение Сервлет 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>

Я пытался исправить этого маленького преступника в течение последних двух дней, но ничего, никакая помощь не была бы высоко оценена.

EDIT:

В соответствии с запросом здесь 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

Ваш URL-адрес полностью прекрасен. Если URL-адрес был неправильным, вы получили сообщение 404, как показано ниже:

Запрошенный ресурс register недоступен

Но вместо этого вы получили

Сервлет RegistrationServlet недоступен

Это означает, что сервлет был найден, но он не может быть выполнен, потому что его конструкция и инициализация завершились с исключением. Под обложками Tomcat в основном один из следующих шагов не выполнен:

Servlet servlet = new RegistrationServlet();
servlet.init(servletConfig);
servlet.init();

Вам нужно прочитать журналы сервера для этого исключения, а затем исправить код соответствующим образом.


Пока ваш URL-адрес полностью прекрасен, он подвержен изменениям в контексте. Вместо этого вы предпочитаете указывать URL-адрес, относящийся к домену:

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

См. также этот ответ: Браузер не может получить доступ к относительным ресурсам, таким как CSS, изображения и ссылки, при вызове сервлета, который пересылает JSP

Ответ 2

Err... это очевидно, но это RegistrationServlet.class in/WEB-INF/classes/coreservlets/? Вы скомпилировали? (С Tomcat вам НЕОБХОДИМО составить компиляцию явно? Было бы удивительно, если бы вы этого не сделали.)

Ответ 3

Может быть, что путь к регистру не учитывает путь контекста. Хорошим способом исправить это было бы использовать тег url ядра jstl -

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

Это гарантирует, что если ваш URL-адрес добавлен в URL-адрес.

Ответ 4

Если произошла ошибка при создании экземпляра сервлета, мы получим этот тип ошибки, даже если библиотеки отсутствуют в папке WEB-INF\lib. Убедитесь, что все библиотеки размещены в WEB-INF\lib.