Сервлет Tomcat: Ошибка 404 - Запрошенный ресурс недоступен

Я совершенно новичок в написании сервлетов Java и пытаюсь получить простой HelloWorld пример для правильной работы.

Класс HelloWorld.java:

package crunch;

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

public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("Hello World");
  }
}

Я использую Tomcat v7.0 и уже прочитал похожие вопросы, ответы на которые касаются изменения invokerservlet-mapping раздел в web.xmlэтот раздел на самом деле не существует в моем, и когда я добавил его, та же проблема все еще возникала.

7 ответов

Решение

Попробуйте это (если Java EE V6)

package crunch;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
@WebServlet(name="hello",urlPatterns={"/hello"})
public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("Hello World");
  }
}

теперь доберитесь до сервлета http://127.0.0.1:8080/yourapp/hello

где 8080 - порт tomcat по умолчанию, а yourapp - имя контекста вашего приложения.

Вам определенно нужно сопоставить свой сервлет с некоторым URL. Если вы используете Java EE 6 (это означает, по крайней мере, Servlet API 3.0), вы можете аннотировать свой сервлет как

@WebServlet(name="helloServlet", urlPatterns={"/hello"})
public class HelloWorld extends HttpServlet {
     //rest of the class

Тогда вы можете просто пойти в localhost:8080/yourApp/hello и значение должно отображаться. Если вы не можете использовать Servlet 3.0 API, вам нужно зарегистрировать этот сервлет в web.xml файл как

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>crunch.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

Написание Java-сервлетов легко, если вы используете Java EE 7

@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest request, 
                  HttpServletResponse response) {
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   out.println("Hello World");
   out.flush();
  }
}

С сервлетом 3.0

Хорошей новостью является то, что дескриптор развертывания больше не требуется!

Прочтите учебник по Java-сервлетам.

Это может быть связано с тем, что вы создали свой файл.jsp или.html в WEB-INF вместо папки WebContent.

Решение: просто замените файлы, которые находятся в папке WEB-INF, на папку Webcontent и попробуйте выполнить то же самое - вы получите соответствующий вывод

Вы должны использовать../../projectName/Filename.jsp в вашем действии attr. или HREF

../ = содержит текущую простую папку (demo.project.filename.jsp)

Сервлет может быть вызван только с 1 косой чертой в названии вашего проекта.

Для тех, кто застрял с "Запрошенный ресурс недоступен" в Java EE 7 и динамическом веб-модуле 3.x, возможно, это могло бы помочь: мастер "Создание сервлета" в Eclipse (протестирован на Mars) не создает аннотацию @Path для класса сервлетов, но мне пришлось включить его для успешного доступа к открытым методам.

Моя проблема была в web.xml файл. В одной <servlet-mapping> внутри произошла ошибка <url-pattern>: Я забыл добавить / до URL

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