Ошибка с аннотацией в сервлете 3.x

Это мой путь

 <welcome-file>home</welcome-file>

и мой сервлет, я объявляю urlpattern ниже

@WebServlet(urlPatterns="/home")

и переслать файл homeview.jsp

        RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/SimpleWebApp/WebContent/WEB-INF/views/homeview.jsp");
dispatcher.forward(request, response);

но когда я запускаю свое веб-приложение, это ошибка с htttp статусом 404 anyboby, помогите мне это исправить? Спасибо много

2 ответа

Ваш код работает правильно. Но,

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

HomeController (ваш сервис)

request.getRequestDispatcher("/WEB-INF/views/homeview.jsp").forward(request, response);

Состав

WebContent
       |
       |__static
       |
       |__WEB-INF
              |__lib
              |__views/homeview.jsp
              |__web.xml

Файл приветствия может быть только статическим файлом, поэтому, например, файл jsp или html, он не может указывать сервлет.

Если вы хотите, чтобы сервлет действовал как страница приветствия, вы должны установить его отображение на /*, что делает его сервлетом по умолчанию. Итак, в вашей аннотации:

@WebServlet (urlPatterns = "/*")

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

Также вам нужно исправить ваш запрос на пересылку, чтобы указать URL относительно корня содержимого приложения, как показано в другом ответе.

Для справки, вот как работает отображение в соответствии со спецификацией сервлета (этот текст взят из Раздела 12.1 спецификации Servlet 3.0):

  1. Контейнер попытается найти точное совпадение пути запроса с путем сервлета. Успешное совпадение выбирает сервлет.

  2. Контейнер будет рекурсивно пытаться найти самый длинный префикс пути. Это делается путем постепенного перехода вниз по дереву пути к каталогу с использованием символа "/" в качестве разделителя пути. Самое длинное совпадение определяет выбранный сервлет.

  3. Если последний сегмент в пути URL содержит расширение (например,.jsp), контейнер сервлета попытается сопоставить сервлет, который обрабатывает запросы на расширение. Расширение определяется как часть последнего сегмента после последнего '.' персонаж.

Если ни одно из трех предыдущих правил не приводит к совпадению сервлета, контейнер попытается обработать содержимое, соответствующее запрашиваемому ресурсу. Если для приложения определен сервлет "по умолчанию", он будет использоваться. Многие контейнеры предоставляют неявный сервлет по умолчанию для обслуживания контента.

Другие вопросы по тегам