2013-03-21 3 views
2

Извините, если это общий вопрос, но я сойду с ума. Я начинаю с разработки JSP, используя Tomcat, работающий на сервере Ubuntu. Я пытаюсь запустить свой первый сервлет «Hello World» без успеха.Ошибка отображения сервлетов Tomcat 404

У меня есть следующие вещи на сервере:

  • каталог webapps является: /var/lib/tomcat6/webapps/
  • в webapps я создал контекстно-Root hello/ списочный
  • hello/ содержит index.html и WEB-INF/
  • WEB-INF содержит web.xml и classes/HelloServlet.class

Это index.html:

<html> 
     <body> 
       Click to request the HelloServlet. 

       <form action = "/hello/helloworld" method = "get" > 
         <input type = "submit" value = "REQUEST" /> 
       </form> 
     </body> 
</html> 

Это WEB-INF/web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

     <servlet> 
       <servlet-name>test</servlet-name> 
       <servlet-class>HelloServlet</servlet-class> 
     </servlet> 

     <servlet-mapping> 
       <servlet-name>test</servlet-name> 
       <url-pattern>/hello/helloworld</url-pattern> 
     </servlet-mapping> 

</web-app> 

и, наконец, это исходный файл HelloServlet:

// HelloServlet.java, a simple Hello World servlet. 

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

public class HelloServlet extends HttpServlet 
{ 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
     { 
       response.setContentType("text/html"); 
       PrintWriter outputStream = response.getWriter(); 

       outputStream.println("<html>"); 

       outputStream.println("<head>"); 
       outputStream.println("<title>Hello, World!</title>"); 
       outputStream.println("</head>"); 

       outputStream.println("<body>"); 
       outputStream.println("Hello, world! This is my first servlet!"); 
       outputStream.println("</body>"); 

       outputStream.println("</html>"); 

       outputStream.close(); 
     } 
} 

Проблема заключается в том, что, на стороне клиента, только http://localhost/hello/ (т. Е. Страница index.html). Если я нажму кнопку формы-отправки, я получаю ошибку http 404 (ресурс недоступен).

Возможно, есть ошибка в сервлет-сопоставлении в форме и/или в web.xml, но мне действительно нужна помощь в ее обнаружении.

+2

Включите имя пакета в тег '' ex. 'org.firstservletapp.HelloServlet' – Meherzad

ответ

1

Добавить контекст root в jsp action, ниже изменения могут работать для вас.

<form action = "/hello/hello/helloworld" method = "get" > 
    <input type = "submit" value = "REQUEST" /> 
</form> 
+0

К сожалению, нет. Я всегда получаю ошибку 404. – eang

+1

@ital Попробуйте просто «action =»/helloworld »после изменения вашего url-шаблона на то, что сказал BalusC. –

4
<url-pattern>/hello/helloworld</url-pattern> 

Вы не должны включать в себя путь контекста в шаблон URL сервлета. Это уже относительно корня контекста.

Избавьтесь от него.

<url-pattern>/helloworld</url-pattern> 

Unrelated к конкретной проблеме, написание HTML-кода в сервлет является очень плохой практикой. Для этого JSP следует использовать. См. Также our own Servlets wiki page which contains sane Hello World examples.

+0

К сожалению, нет. Я всегда получаю ошибку 404. Вероятно, я буду использовать JSP через несколько секунд, спасибо в любом случае за подсказку. – eang

1

404 может привести в:

  1. пессимистичных сценариев отображения (возможно, включили дополнительный контекст, как ответил выше или неправильно подстановочные знаки схему)
  2. сервлет не запускается (см лог запуска стека в консоли или файл каталины, вы должны найти след отслеживания сбоев сервлета)
0

Мне потребовались годы, чтобы понять это.В моем случае я получал 404s, потому что я не понимал, что URL-адреса Tomcat: с учетом регистра!

.: например

http://server:8080/acme.MyPackage/DoStuff 

... 404!

http://server:8080/acme.myPackage/DoStuff 

... Отлично.

Madness.