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


Автор: azalia 14.5.2015, 17:02
Доброго времени суток!
Не получается развернуть сервлет на Томкат 7. 
Я пока не использую JSP. Не хочу пока заморачиваться отделением логики от представления.
Сервлет хранится в C:\Tomcat 7.0\webapps\testApp\WEB-INF\classes\test1\web. В папке C:\Tomcat 7.0\webapps\testApp\WEB-INF хранится web.xml
Код


<web-app>
 
  <servlet>
    <servlet-name>DBServlet</servlet-name>
    <servlet-class>test1.web.DBServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>DBServlet</servlet-name>
    <url-pattern>/DBServlet</url-pattern>
  </servlet-mapping>
 
</web-app>


Запускаю http://localhost:8080/testApp/DBServlet

Возникает ошибка 500.

Код сервлета могу привести позже, если будет нужен.

Я понимаю, что тема уже избитая, но я все равно что-то никак не пойму ЧЯДНТ?

Автор: azalia 14.5.2015, 19:14
попробовала запустить типовой сервлет:
Код


import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class NewServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
        // Параметр
        String parameter = request.getParameter("parameter");
 
        // Старт HTTP сессии
        HttpSession session = request.getSession(true);
        session.setAttribute("parameter", parameter);
 
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Заголовок</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Пример сервлета"+parameter+"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    } 
 
    @Override
    public String getServletInfo() {
        return "Пример сервлета";
    }
 
}


Добавила в web.xml в C:\Tomcat 7.0\webapps\testApp\WEB-INF

Код

<web-app>
 
  <servlet>
    <servlet-name>DBServlet</servlet-name>
    <servlet-class>test1.web.DBServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>DBServlet</servlet-name>
    <url-pattern>/DBServlet</url-pattern>
  </servlet-mapping>
 
  <servlet>
    <servlet-name>NewServlet</servlet-name>
    <servlet-class>test1.web.NewServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>NewServlet</servlet-name>
    <url-pattern>/NewServlet</url-pattern>
  </servlet-mapping>


</web-app>


Запускаю http://localhost:8080/testApp/NewServlet
Тоже ошибка 500.

Код

HTTP Status 500 - test1/web/NewServlet (wrong name: NewServlet)

--------------------------------------------------------------------------------

type Exception report

message test1/web/NewServlet (wrong name: NewServlet)

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

exception 

java.lang.NoClassDefFoundError: test1/web/NewServlet (wrong name: NewServlet)
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClass(Unknown Source)
    java.security.SecureClassLoader.defineClass(Unknown Source)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Unknown Source)


note The full stack trace of the root cause is available in the Apache Tomcat/7.0.61 logs.



Автор: azalia 14.5.2015, 19:30
добавила package test1.web;
запустился...

а в моем ему тогда что не нравится?

Код

package test1.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class DBServlet extends HttpServlet {

public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
String sql = "SELECT TOP 10 * FROM Person.Contact";

Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
ResultSetMetaData rsm=null;

response.setContentType ("text/html");
java.io.PrintWriter out = response.getWriter();

out.println("<html><head><title>Servlet DB Access</title></head></html>");
out.println("<h2>Database info</h2>");
out.println("<table border='1'>Database info<tr>");

try{
Class.forName ("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:1433/AdventureWorks";
conn= DriverManager.getConnection(url, "sa","123");

stmt= conn.createStatement();
rs= stmt.executeQuery(sql);
rsm= rs.getMetaData();
int colCount=rsm.getColumnCount();

for (int i=1; i <= colCount; ++i){
out.println ("<th>"+rsm.getColumnName(i)+"</th>");

}
out.println ("</tr>");
while (rs.next()){
out.println ("<tr>");

for (int i=1; i <= colCount; ++i)
out.println ("<td>"+rs.getString(i)+"</td>");
out.println ("</tr>");
}


}
catch (Exception e){ throw new ServletException(e.getMessage());}

 finally {

try {

if (stmt != null) stmt.close();
if (conn !=null) conn.close();
}

catch (Exception sqle){}

}
out.println("</table><br><br>");
out.println("</body>");
out.println("</html>");
}


}


Автор: AntonSaburov 15.5.2015, 09:36
Так сам сервлет запустился ? Без всяких баз данных - пока просто вернуть просто Hello world. Это получилось ?

Автор: azalia 15.5.2015, 12:01
Цитата(AntonSaburov @  15.5.2015,  09:36 Найти цитируемый пост)
Так сам сервлет запустился ? Без всяких баз данных - пока просто вернуть просто Hello world. Это получилось ? 


Да, получилось.

А с БД пока проблемы.

Автор: AntonSaburov 15.5.2015, 12:12
Надо смотреть логи в Tomcat - <Tomcat>/logs/ - скорее всего файлы catalina или дщсфдрщые - там можно посмотреть на ошибку. Иначе что-то сказать не получится. Учтите на будущее - без описания ошибки только по коду 500 ничего выяснить не получится - так что смотрите логи. Всегда. Это иногда единственное, что спасает.

Код 500 - это скорее всего какая-то проблема уже внутри сервлета.

Автор: azalia 15.5.2015, 12:29
Цитата(AntonSaburov @  15.5.2015,  12:12 Найти цитируемый пост)
Надо смотреть логи в Tomcat


Я уже пыталась там смотреть... Ничего путного не нашла. Странно, что у меня ничего не выводится. Может есть способ заставить его вывести ошибку на экран?

Когда у меня не работал типовой сервлет, то на экран выводилась ошибка 500 вместе со стеком ошибок и было видно, что это выдача Томкат. А  тут  тоже ошибка 500, но она какая-то немного странная. Вернее, выглядит совсем по-другому, как будто сам сервер (Томкат) не доступен (Внутренняя ошибка сервера), и никаких признаков о том, что это вообще обработано Томкат.

Значит сам сервлет с доступом к БД какой-то неправильный? Я его взяла с книжки. Только в ней была описана попытка доступа к Оракл, а я заменила на Майкрософт.

Автор: azalia 15.5.2015, 14:39
нигде не могу найти ответ на свой делитанский вопрос - чем же отличаются http-сервлеты от обычных? или обычных сервлетов не существует? можно ли превратить обычный java-класс с main в http-сервлет просто обернув его в следующую конструкцию?

Код

public class NewServlet extends HttpServlet {
 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

Автор: Samotnik 15.5.2015, 17:32
http://docs.oracle.com/javaee/6/api/javax/servlet/Servlet.html, http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServlet.html 
понятно или объяснить?

Автор: azalia 15.5.2015, 18:14
Цитата(Samotnik @  15.5.2015,  17:32 Найти цитируемый пост)
понятно или объяснить? 


в общих чертах, да.

Автор: AntonSaburov 15.5.2015, 21:38
Во-первых - если сервлет без базы выводит Hello World, значит проблема в коде уже внутри сервлета. 
Во-вторых - навставляйте внутрь сервлета System.out.println через каждый оператор и смотрите в логи - Томкат туда все пишет. А так разговор слепого с глухим.

Автор: azalia 16.5.2015, 15:20
Цитата(AntonSaburov @  15.5.2015,  21:38 Найти цитируемый пост)
Во-первых - если сервлет без базы выводит Hello World, значит проблема в коде уже внутри сервлета. 
Во-вторых - навставляйте внутрь сервлета System.out.println через каждый оператор и смотрите в логи - Томкат туда все пишет. А так разговор слепого с глухим. 



все, у меня получилось! спасибо!

Автор: sergioK1 19.8.2015, 09:48
Цитата(azalia @ 14.5.2015,  18:30)
добавила package test1.web;
запустился...

а в моем ему тогда что не нравится?

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

error 500 говорит что у вас нет драйвера к БД jar в папке lib есть? 
Я угадал ?  

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