Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Tomcat не находит сервлет...


Автор: vovs 1.7.2010, 19:20
Доброго времени!

чтобы разобраться с сервлетами и хибернейтом попробовал сделать простенький проект.
Проект делал в 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>

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

И еще было бы не плохо его обозвать по-другому (и УРЛ тоже). Мистика, но мало ли.

Автор: vovs 1.7.2010, 23:08
Удалил теги 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\  -- тоже не помогло..
не находит он этот сервлет и все (

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

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

Автор: MaxPayneC 2.7.2010, 09:52
Попробуйте ссылку http://localhost:8080/usermanager

Автор: vovs 2.7.2010, 12:06
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

Автор: Skipy 2.7.2010, 15:54
Взял Ваш код, закомментировал все, что связано с 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. У Вас поломана разметка - забыли угловые скобки на кнопке в форме. Но это мелочь.

Автор: vovs 3.7.2010, 01:18
Спасибо за подробное пояснение!

Я попробовал настолько хватает знаний учесть Ваши замечания.
Пока что не до конца разобрался с пунктом №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?

Автор: vovs 4.7.2010, 01:55
Спасибо всем за советы. Разобрался. Проект работает.Ура smile 
Проблема была с *.jar

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)