Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Eclipse+Tomcat servlet deploy errors, Проблемы начинающего 
V
    Опции темы
chaZm
Дата 6.6.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Доброго времени суток. Начал заниматься разработкой сервлетов и javaEE вообще. Я долго работал с asp.net, так что в общем то представляю технологию веб программирования.
Использую Eclipse ide , tomcat
Пошел на www.ibm.com/developerworks для материалов для начинающих. 
Исходя из этого урока http://www.ibm.com/developerworks/ru/libra...jax1/index.html создал простой сервлет и простую html страницу которая на этот сервлет отправляет аяксовый запрос. 
Имеется такая страничка 
Код

...
<p>Some text!</p>

<!-- Таблица продуктов из каталога магазина, в строке по продукту  -->
<table>
<th>Name</th> <th>Description</th> <th>Price</th> <th></th>
...
<tr>
  <!-- Детали продуктов  -->
  <td>Hat</td> <td>Stylish bowler hat</td> <td>$19.99</td>
  <td>
    <!-- Нажмите кнопку, чтобы добавить продукт в корзину с помощью запроса Ajax -->
    <button onclick="addToCart('hat001')">Add to Cart</button>
  </td>
</tr>
...
</table>

<!-- Представление корзины покупателя, обновленной асинхронно  -->
<ul id="cart-contents">

  <!-- Список продуктов увеличится для каждого продукта в корзине  -->
  
</ul>

<!-- Общая стоимость продуктов, показанных внутри элемента span -->
Total cost: <span id="total">$0.00</span>

</body>
<script type="text/javascript">
/*
 * Добавляет продукт, определенный его кодом,
 * в корзину покупателя 
 * itemCode - код продукта для добавления.
 */
function addToCart(itemCode) {

  // Возвращает содержимое  XMLHttpRequest
  var req = newXMLHttpRequest();

  // Оператор для получения сообщения обратного вызова 
  // из объекта запроса
  var handlerFunction = getReadyStateHandler(req, updateCart);
  req.onreadystatechange = handlerFunction;
  
  // Открываем HTTP-соединение с помощью POST-метода к сервлету корзины покупателя.
  // Третий параметр определяет, что запрос  асинхронный.
  req.open("POST", "/TestJava", true);

  // Определяет, что в содержимом запроса есть данные 
  req.setRequestHeader("Content-Type", 
                       "application/x-www-form-urlencoded");

  // Посылаем закодированные данные, говорящие о том, что я хочу добавить 
  // определенный продукт в корзину.
  req.send("action=add&item="+itemCode);
}

/*
 * Returns a function that waits for the specified XMLHttpRequest
 * to complete, then passes its XML response
 * to the given handler function.
 * req - The XMLHttpRequest whose state is changing
 * responseXmlHandler - Function to pass the XML response to
 */
function getReadyStateHandler(req, responseXmlHandler) {

  // Return an anonymous function that listens to the 
  // XMLHttpRequest instance
  return function () {

    // If the request's status is "complete"
    if (req.readyState == 4) {
      
      // Check that a successful server response was received
      if (req.status == 200) {

        // Pass the XML payload of the response to the 
        // handler function
        responseXmlHandler(req.responseXML);

      } else {

        // An HTTP problem has occurred
        alert("HTTP error: "+req.status);
      }
    }
  }
}

function updateCart(cartXML) {

     // Получить корневой  &quot;cart&quot; элемент из документа
     var cart = cartXML.getElementsByTagName("cart")[0];

     // Проверим, что более ранний документ корзины не был обработан еще
     var generated = cart.getAttribute("generated");
     if (generated > lastCartUpdate) {
       lastCartUpdate = generated;

       // Очистим список HTML, необходимый для отображения содержимого корзины
       var contents = document.getElementById("cart-contents");
       contents.innerHTML = "";

       // Соединяем продукты в корзине
       var items = cart.getElementsByTagName("item");
       for (var I = 0 ; I < items.length ; I++) {

         var item = items[I];

         // Достаем ключевые понятия из имени и элементов количества 
         var name = item.getElementsByTagName("name")[0]
                                                   .firstChild.nodeValue;
                                                   
         var quantity = item.getElementsByTagName("quantity")[0]
                                                   .firstChild.nodeValue;

         // Создаем и добавляем список продуктов, HTML элемент  для этого продукта
         var li = document.createElement("li");
         li.appendChild(document.createTextNode(name+" x "+quantity));
         contents.appendChild(li);
       }
     }

     // Обновляем итого в корзине, используя значение из документа корзины 
     document.getElementById("total").innerHTML = 
                                              cart.getAttribute("total");
    }
</script>



и сервлет 
Код

package java.test.web;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.*;

/**
 * Servlet implementation class TestJava
 */
public class TestJava extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestJava() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
          String action = request.getParameter("action");
          String item = request.getParameter("item");
          
        
          // Записываем полученный XML в запрос.
          ((ServletResponse) request).setContentType("application/xml");
          ((ServletResponse) request).getWriter().write("test");

    }


}


Я думаю что проблема в общем подходе - что то не так настраиваю. Хтмл там и аякс пока не причем совсем. 
И собственно проблема в том что Tomcat как судя по всему не видит класс сервлета. Или не может его инициализиорвать. текст ошибки такой. И ошибка возникает при обращении по ссылке из маппинга(http://localhost:8081/testWeb/TestJava) в web.xml (запрос по кнопке на хтмл странице просто 404 возвращает). 

exception

javax.servlet.ServletException: Wrapper cannot find servlet class java.test.web.TestJava or a class it depends on
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)
root cause

java.lang.ClassNotFoundException: java.test.web.TestJava
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)

Я добавил в проект jar servlet-api из папки томката к проекту. И ошибок до этапа запроса нет.  И уже день бьюсь над этим. И кажется упускаю какую то мелочь примитивную.ПРосто понимания чего то не хватает. Я еще кое что попробовал - сдела сервлет не используя свой класс - просто новый сервлет на основе GenericServlet . И при попытке вызова его в браузере

javax.servlet.ServletException: Error instantiating servlet class javax.servlet.GenericServlet
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)
root cause

java.lang.InstantiationException
    sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(Unknown Source)
    java.lang.reflect.Constructor.newInstance(Unknown Source)
    java.lang.Class.newInstance0(Unknown Source)
    java.lang.Class.newInstance(Unknown Source)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

Активно прошу помощи ) Что я упускаю? может как то не так проект собираю?
Спасибо и извиняюсь за объемный пост.
PM MAIL   Вверх
SlavaSemushin
Дата 7.6.2010, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 13.4.2010
Где: Новосибирск

Репутация: 1
Всего: 1



- У вас Tomcat не может найти класс java.test.web.TestJava, проверьте, что существует файл WEB-INF/classes/java/test/web/TestJava.class
- Покажите ещё web.xml на всякий случай
- Странно, что у вас сервлет замаплен на адрес /testWeb/TestJava, а POST-запрос вы отправляете на /TestJava -- так и должно быть?
PM MAIL   Вверх
chaZm
Дата 7.6.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Спасибо за ответ. Итак.
Цитата

- У вас Tomcat не может найти класс java.test.web.TestJava, проверьте, что существует файл WEB-INF/classes/java/test/web/TestJava.class


Кстати тут еще вопрос возникает. Я подключил к Эклипс томкат через servers-new. и в дереве проектов WEB-INF/classes папки даже не было. Я думал что Эклипс сам должен генерировать подобные файлы, но их там не было. Были в папке .build. Это видимо не одно и то же ? я глянул в структуру примеров которые с томкатом идут и перенес к себе в проект файлы классов в WEB-INF/classes/java/test/web/TestJava.class. И ничего не поменялось. Нужно ли в  WEB-INF/classes/ создавать вручную все папки, перенося из build или это автоматически делается при компиляции ? И мне еще тут подумалось. Я запускаю проект "как в visual studio".То есть жму run и проверяю. Может нужно в папку с томкатом вручную все переносить и там смотреть ?Или это одно и то же получается?

Цитата

- Покажите ещё web.xml на всякий случай

Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" 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/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>testWeb</display-name>
    <servlet>
        <description>
        first ajax test</description>
        <display-name>TestJava</display-name>
        <servlet-name>TestJava</servlet-name>
        <servlet-class>
        java.test.web.TestJava</servlet-class>
    </servlet>
    <servlet>
        <description>
        </description>
        <display-name>TestJava2</display-name>
        <servlet-name>TestJava2</servlet-name>
        <servlet-class>
        java.test.web.TestJava</servlet-class>
    </servlet>
    <servlet>
        <description>
        </description>
        <display-name>GenServlet</display-name>
        <servlet-name>GenServlet</servlet-name>
        <servlet-class>
        javax.servlet.http.HttpServlet</servlet-class>
    </servlet>
    <servlet>
        <description>
        </description>
        <display-name>GenericServlet</display-name>
        <servlet-name>GenericServlet</servlet-name>
        <servlet-class>
        javax.servlet.GenericServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestJava</servlet-name>
        <url-pattern>/TestJava</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TestJava2</servlet-name>
        <url-pattern>/TestJava2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>GenServlet</servlet-name>
        <url-pattern>/GenServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>GenericServlet</servlet-name>
        <url-pattern>/GenericServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Обратите внимание на GenServlet .  Он производится от класса javax.servlet.http.HttpServlet - я так понимаю это стандартный класс и таким образом все должно "из коробки" заработать. В моем случае не происходит ничего (

Цитата

- Странно, что у вас сервлет замаплен на адрес /testWeb/TestJava, а POST-запрос вы отправляете на /TestJava -- так и должно быть?

Да, тут может быть косяк. Спасибо. НО я все таки думаю что это к проблеме пока не относится - напрямую вызов сервлета ведь не работает :(

Спасибо за помощь, надеюсь получится разобраться!
PM MAIL   Вверх
chaZm
Дата 7.6.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Я определенно делаю что тот не так. Видимо дело в какой то настройке. Сделал по гайду для полных чайников примитивный сервлет и результат такой же. не находится класс.

java.lang.ClassNotFoundException: java.test.hello.HelloJava
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)


Причем я проверил - я перенес servlet-api в web-inf\lib . Может быть дело в том что я создаю new-project-dynamic web project ? у меня нет new Tomcat project. Может поэтому classes не создается сразу? Я заметил что при создании проекта IDE спрашивает output path и он по дефолту в build\classes стоит. Я поменял на web-inf\classes ну как видно выше не особо помогло. 
PM MAIL   Вверх
chaZm
Дата 7.6.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Хм. есть еще новости smile 
Нашел я кажется часть своей ошибки. Установил плагин для томката -  http://www.eclipsetotale.com/tomcatPlugin.html#A4 и у меня в списке проектов появился New-Java/Tomcat project . И если  создавать его - то сервлет работает !!!! Сервлет стандартный, но тем не менее, работает. ПРоблема в том что елсли скопировать библиотеки из томкат проекта в мой - все равно не работает. Созданный томкат проект я так понимаю не веб(хотя бы потому что не создает web.xml, нет папки Meta-inf и его нельзя компилировать как страницу. Да и перелючает он эклипс на представление Java из JavaEE). Я пытался добавить в томкат проект хтмл страницу - но запустить ее нельзя. Он предлагает только как Java application и java aplet.

Еще обнаружил что папка classes на самом деле создается. ВОт только эклипс отказывается ее в иерархии проекта показывать :( но я думаю это не критично, раз он файлы туда правильные все таки добавляет

Кроме того кардинальной разницы между моим проектом и томкатовским я не вижу. Тем не менее сервлеты не работают :( 
Жду совета smile Спасибо!

Это сообщение отредактировал(а) chaZm - 7.6.2010, 13:12
PM MAIL   Вверх
chaZm
Дата 7.6.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Всем спасибо кажется я все решил. Ну точнее все сделал заново - аккуратно, без шума и пыли smile 
Я понял очевидную , наверное, вещь - не веб проект от веб проекта отличается наличием web.xml и обращаться к нему можно как к любому другому!
В общем я сделал все заново на его основе и аяксовые запросы теперь работают!! Все отлично. Пока разбирался многое понял.  smile
Всем спасибо ! Буду копать дальше.. Думаю еще не раз появлюсь с глупыми вопросами smile
 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0899 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.