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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tomcat не находит сервлет... скорее всего что-то с маппингом 
:(
    Опции темы
vovs
Дата 1.7.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

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



Доброго времени!

чтобы разобраться с сервлетами и хибернейтом попробовал сделать простенький проект.
Проект делал в Eclipse Helios.
Создал табличку в мускл(ид, имя, фамилия), подключился посредством хибернейт.
написал сервлетик, запускаю, а томкат и по ссылке http://localhost:8080/servlet_db/usermanager
мне выдает: HTTP Status 404 - Servlet UserManagerServlet is not available

маппинги пересмотрел - вроде правильно... не могу найти причину....
хотя по тексту ошибки видно что ошибка где-то сверху...

В директории org\test\ класс UserManagerServlet.class  присутствует..
это мой первый опыт в использовании хибернейта и веб-приложения. 
Исходный код написан неграмотно - много повторов.. знаю..))
архив проекта прилагается- надеюсь на помощь..

SQL таблички, к которой я обращаюсь:
Код

CREATE DATABASE IF NOT EXISTS `fortest` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `fortest`;


# Dumping structure for table fortest.users
CREATE TABLE IF NOT EXISTS `users` (

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `surname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;




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/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>servlet_db</display-name>
  <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>
  <servlet>
    <description></description>
    <display-name>UserManagerServlet</display-name>
    <servlet-name>UserManagerServlet</servlet-name>
    <servlet-class>org.test.UserManagerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UserManagerServlet</servlet-name>
    <url-pattern>/usermanager</url-pattern>
  </servlet-mapping>
</web-app>


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  HibernateTest.zip 13,17 Kb
PM MAIL ICQ Skype Jabber   Вверх
afon
Дата 1.7.2010, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Могу только сказать : да, очень странно, вроже все правильно.
Попробуйте только удалить теги display-name и desription.
С остальным не понятно. Вроде маппинг прописался, апп пытается найти указанный сервлет, но самого его не находит. Поверьте директорию, куда все собирается, действительно ли там есть web-inf/classes/org/test/UserManagerServlet

И еще было бы не плохо его обозвать по-другому (и УРЛ тоже). Мистика, но мало ли.
PM MAIL WWW   Вверх
vovs
Дата 1.7.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

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



Удалил теги display-name и desription.
На результат это не повлияло абсолютно.
класс UserManagerServlet.class находится в директории servlet_db\build\classes\org\test\

Директория servlet_db\WebContent\WEB-INF\ содержит папку lib(пустая) и файлик web.xml
Закидывал туда classes\org\test\UserManagerServlet.class -- результат тотже.

Все классы у меня лежат в директории servlet_db\build\classes\org\test\

я запускаю проект прямо в Эклипсе - может это еще принципиально..

попробовал запустить проект єкспортировав его и поместив в apache-tomcat-6.0.26\webapps\  -- тоже не помогло..
не находит он этот сервлет и все (

Это сообщение отредактировал(а) vovs - 2.7.2010, 00:28
PM MAIL ICQ Skype Jabber   Вверх
Skipy
Дата 2.7.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как разворачиваете? Какое имя war-архива? Откуда берется build в путях? Какая структура директорий должна быть у веб-приложения?

Вот в этой статье есть пример собирающегося веб-архива http://www.skipy.ru/technics/encodings_webapp.html.  Посмотрите, какая структура директорий там получается. Можете приспособить для сборки своего приложения.

Это сообщение отредактировал(а) Skipy - 2.7.2010, 09:31


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
MaxPayneC
Дата 2.7.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуйте ссылку http://localhost:8080/usermanager
PM   Вверх
vovs
Дата 2.7.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

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



2Skipy
Запускал проект в эклипсе(Run As - Run on Server)

Пробовал экспортировать проект в *.war архив.
Архив назвал servlet_db.war
Поместил в директорию C:\apache-tomcat-6.0.26\webapps\
запустил Томкат, в  логах нашел следующее:

02.07.2010 10:47:11 org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive servlet_db.war

В браузере захожу по ссылке http://localhost:8080/servlet_db/
попадаю на index.jsp с единственной гиперссылкой, перенаправляющей меня на адрес http://localhost:8080/servlet_db/usermanager

По адресу http://localhost:8080/servlet_db/usermanager вижу, что томкат не может найти сервлет: Servlet UserManagerServlet is not available

Структура папок после деплоя:


C:\apache-tomcat-6.0.26\webapps\servlet_db\
|
---META-INF
|                |
|                 -----MANIFEST.MF  
---WEB-INF
|                |
|                 -----classes
|                |                |
|                |                 -org
|                |                       |
|                |                        -test
|                |                              |
|                |                               -UserManagerServlet.class, userAddToBD.class, users.class
|                |
|                 ---- lib(пустая)
|                |
|                 --web.xml
|
-index.jsp

Содержимое index.jsp:
Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<a href="usermanager">Users manager</a>
</body>
</html>


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

2MaxPayneC

HTTP Status 404 - /usermanager
PM MAIL ICQ Skype Jabber   Вверх
Skipy
Дата 2.7.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Взял Ваш код, закомментировал все, что связано с Hiberbate, собрал war, продеплоил на Tomcat 6.0.26 - сервлет работает. Попробуйте, если действительно так - ищите, где Hibernate ломает картину.

Несколько комментариев по самому коду.

1. Данные добавляются не через GET, а через POST. GET предназначен только для чтения. Иначе Вы нажмете F5 - и добавите пользователя еще раз. Плюс GET имеет серьезные органичения на объем передаваемой информации. После того, как отработал POST, пользователю посылается redirect (через sendRedirect) на страницу получения списка (которая работает через GET). Это является защитой от повторной посылки формы.

2. SessionFactory инициализируется ОДИН раз, при старте сервлета, а не в каждом методе - три (!!!) раза на запрос. В каждом запросе создается объект Session, которы потом передается во все методы, где нужно работать с базой. У Вас транзакция открывается снаружи методов сохранения и чтения (кстати, читать в транзакции необязательно), однако в методе сохранения Вы создаете новую сессию (и фабрику!) и открытая транзакция НИКАК не повлияет на Вашу запись данных.

3. Я не уверен, что Вы вправе закрывать Writer, который получили из HttpServletResponse. Дело в том, что в него потом могут дописывать что-то фильтры (имеют полное право и этим часто пользуются - например, вся обвязка страницы генерируется фильтром, а doGet генерирует только таблицу с данными). Вообще правило - не закрывайте то, что открывали не Вы.

4. Вот это сравнение - ServletException.class.isInstance(ex) - переписывается проще: ex instanceof ServletException

5. У Вас поломана разметка - забыли угловые скобки на кнопке в форме. Но это мелочь.

Это сообщение отредактировал(а) Skipy - 2.7.2010, 16:08


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
vovs
Дата 3.7.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

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



Спасибо за подробное пояснение!

Я попробовал настолько хватает знаний учесть Ваши замечания.
Пока что не до конца разобрался с пунктом №1.
Я разделил между методами GET и POST прорисовку и добавление информации.

Но получил очередную ошибку. Также не до конца разобрался с редиректом.
Ниже привожу листинг переделанного сервлета и класса, где происходит инициализация SessionFactory.
А также текст ошибки..

Класс HibUtil
Код

package utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.test.users;

public class HibUtil {

    private static final SessionFactory sessionFactory;
    static {
         try {
              sessionFactory = new AnnotationConfiguration().addAnnotatedClass(users.class).configure("hibernate.cfg.xml").buildSessionFactory();
         }catch (Exception e) {
              System.err.println("Initial SessionFactory creation failed." + e);
         throw new ExceptionInInitializerError(e);
         }
    }
    
    public static SessionFactory getSessionFactory() {
         return sessionFactory;
    } 
     
    public static void closeSession(){
         sessionFactory.close();
    }
}



Сервлет
Код

package org.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import utils.HibUtil;

/**
 * Servlet implementation class UserManagerServlet
 */
public class UserManagerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserManagerServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        try{
            PrintWriter out = response.getWriter();
            out.println("<html><head><title>Users Manager</title></head><body>");
            
            //Create page
            printUserForm(out);
            listUsers(out);
            
            //Footer of the page
            out.println("</body></html>");
            out.flush();
        
        } catch (Exception ex) {
            if (ex instanceof ServletException) {
                throw (ServletException) ex;
            } else {
                throw new ServletException(ex);
            }
        }
    }
    
    private void createAndStoreUser(String userName, String userSurname) {
        
        users user = new users();
        user.setName(userName);
        user.setSurname(userSurname);
        HibUtil.getSessionFactory().getCurrentSession().save(user);
    }

    private void listUsers(PrintWriter out) {
        
        List result = HibUtil.getSessionFactory().getCurrentSession().createCriteria(users.class).list();
        
        for (Iterator iter = result.iterator(); iter.hasNext();){
            users us = (users) iter.next();
            out.println(us.getName()+us.getSurname());
        }
    
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        try{
            PrintWriter out = response.getWriter();

            //Events
            
            if ("store".equals(request.getParameter("action"))) {
                String userName = request.getParameter("userName");
                String userSurname = request.getParameter("userSurname");
                if ("".equals(userName) || "".equals(userSurname)) {
                    out.println("<b><i>Please enter user name and user surname.</i></b>");
                } else {
                        createAndStoreUser(userName, userSurname);
                        out.println("<b><i>Added user</i></b>");
                }
            }

        out.flush();
        } catch (Exception ex) {
            //if (ServletException.class.isInstance(ex)) {
            if (ex instanceof ServletException){
                throw (ServletException) ex;
            } else {
                throw new ServletException(ex);
            }
        }
        
    }
    
    private void printUserForm(PrintWriter out){
        out.println("<h2>Add new user:</h2>");
        out.println("<form method='post'>");
        out.println("name: <input name='userName' length='50'/><br/>");
        out.println("surname: <input name='userSurname' length='50'/><br/>");
        out.println("<input type='submit' name='action' value='store'/>");
        out.println("</form>");
    }
}


Ошибка, которую выдает Томкат:

Код

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Servlet execution threw an exception


root cause 

java.lang.NoClassDefFoundError: Could not initialize class utils.HibUtil
    org.test.UserManagerServlet.listUsers(UserManagerServlet.java:80)
    org.test.UserManagerServlet.doGet(UserManagerServlet.java:53)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


53 строка:
Код

listUsers(out);

80 строка:
Код

List result = HibUtil.getSessionFactory().getCurrentSession().createCriteria(users.class).list();


Как же мне правильно проинициализировать класс utils.HibUtil?
PM MAIL ICQ Skype Jabber   Вверх
vovs
Дата 4.7.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

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



Спасибо всем за советы. Разобрался. Проект работает.Ура smile 
Проблема была с *.jar
PM MAIL ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0791 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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