Sou novato em JAVA, estou lendo o livro java como Programar dos Deitel.
No capulitulo de servlets, eu acompanhei todos, mas quando chegou no último servlet que é com banco de dados esta dando erro o que pode ser:
Arquivo web.xml
[code]<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://ww.w3.org/2001/XMLSchema-instace"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/wep-app_2_4.xsd"
version="2.4">
<!-- Meu primeiro Servlet–>
<display-name>
Programando com Java
Utilizando Servlet
</display-name>
<description>
Demostração do uso do Java através de Servlet
</description>
<!-- Definições do meu primeiro servelet -->
<servlet>
<servlet-name>welcome1</servlet-name>
<descripton>Servelet que processa HTTP get request</descripton>
<servlet-class>WelcomeServlet</servlet-class>
</servlet>
<!-- Localização do meu Servlet -->
<servlet-mapping>
<servlet-name>welcome1</servlet-name>
<url-pattern>/welcome1</url-pattern>
</servlet-mapping>
<!-- fim do primeiro–>
<!-- Definições do meu segundo servelet -->
<servlet>
<servlet-name>welcome2</servlet-name>
<descripton>Servelet que processa HTTP get request com parametros</descripton>
<servlet-class>WelcomeServlet2</servlet-class>
</servlet>
<!-- Localização do meu Servlet -->
<servlet-mapping>
<servlet-name>welcome2</servlet-name>
<url-pattern>/welcome2</url-pattern>
</servlet-mapping>
<!-- fim do segundo–>
<!-- Definições do meu terceiro servelet -->
<servlet>
<servlet-name>welcome3</servlet-name>
<descripton>Servelet que processa HTTP post request com parametros</descripton>
<servlet-class>WelcomeServlet3</servlet-class>
</servlet>
<!-- Localização do meu Servlet -->
<servlet-mapping>
<servlet-name>welcome3</servlet-name>
<url-pattern>/welcome3</url-pattern>
</servlet-mapping>
<!-- fim do terceiro–>
<!-- Definições do meu terceiro servelet -->
<servlet>
<servlet-name>redirect</servlet-name>
<descripton>Servelet que redireciona de acordo com o parametro fornecido</descripton>
<servlet-class>RedirectServlet</servlet-class>
</servlet>
<!-- Localização do meu Servlet -->
<servlet-mapping>
<servlet-name>redirect</servlet-name>
<url-pattern>/redirect</url-pattern>
</servlet-mapping>
<!-- fim do terceiro–>
<!-- Definições do meu terceiro servelet -->
<servlet>
<servlet-name>animalsurvey</servlet-name>
<descripton>Servelet calcula os votos e exibe na tela.</descripton>
<servlet-class>com.deitel.jhtp6.servlets.SurveyServlet</servlet-class>
</servlet>
<init-param>
<param-name>databaseDriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>databaseName</param-name>
<param-value>jdbc:mysql://localhost:3306/bancodedados</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
<!-- Localização do meu Servlet -->
<servlet-mapping>
<servlet-name>animalsurvey</servlet-name>
<url-pattern>/animalsurvey</url-pattern>
</servlet-mapping>
<!-- fim do terceiro–>
</web-app>[/code]
Formulário que passa a opção marcada para o servlet
<form method = "post" action = "/Serve/animalsurvey">
<p>Qual seu animal favorito ?</p>
<p>
<input type = "radio" name = "animal"
value = "1" />
Cachorro<br />
<input type = "radio" name = "animal"
value = "2" />
Gato
<br />
<input type = "radio" name = "animal"
value = "3" />
Passarinho
<br />
<input type = "radio" name = "animal"
value = "4" />
Serpente<br />
<input type = "radio" name = "animal"
value = "5" checked = "checked" />
Nenhum
</p>
<p><input type = "submit" value = "Votar" />
</p>
</form>
classe SurveyServlet
[code]package com.deitel.jhtp6.servlets;
import java.io.PrintWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SurveyServlet extends HttpServlet
{
private Connection connection;
private Statement statement;
// configura a conexão de banco de dados e cria a instrução SQL
public void init( ServletConfig config ) throws ServletException
{
// tenta uma conexão ao banco de dados e cria instruções
try
{
Class.forName( config.getInitParameter( "databaseDriver" ) );
connection = DriverManager.getConnection(
config.getInitParameter( "databaseName" ),
config.getInitParameter( "username" ),
config.getInitParameter( "password" ) );
// cria Statement para consultar banco de dados
statement = connection.createStatement();
} // fim do try
// para qualquer exceção lança uma UnavailableException para
// indicar que o servlet não está atualmente disponível
catch ( Exception exception )
{
exception.printStackTrace();
throw new UnavailableException(exception.getMessage());
} // fim do catch
} // fim do método init
// processa as respostas da pesquisa
protected void doPost( HttpServletRequest request,
HttpServletResponse response )
throws ServletException, IOException
{
// configura as respostas para o cliente
response.setContentType( "text/html" );
PrintWriter out = response.getWriter();
// inicia o documento XHTML
out.println( "<?xml version = \"1.0\"?>" );
out.printf( "%s%s%s", "<!DOCTYPE html PUBLIC",
" \"-//W3C//DTD XHTML 1.0 Strict//EM\"",
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" );
out.println(
"<html xmlns = \"http://www.w3.org/1999/xhtml\">" );
// seção da cabeça do documento
out.println( "<head>" );
// lê a resposta da pesquisa atual
int value =
Integer.parseInt( request.getParameter( "animal" ) );
String sql;
// tenta processar um voto e exibe os resultados atuais
try
{
// atualiza o total para as respostas atuais da pesquisa
sql = "UPDATE surveyresults SET votes = votes + 1 " +
"WHERE id = " + value;
statement.executeUpdate( sql );
// obtém o total de todas as respostas da pesquisa
sql = "SELECT sum( votes ) FROM surveyresults";
ResultSet totalRS = statement.executeQuery( sql );
totalRS.next(); // posição para o primeiro registro
int total = totalRS.getInt( 1 );
// obtém os resultados
sql = "SELECT surveyoption, votes, id FROM surveyresults " +
"ORDER BY id";
ResultSet resultsRS = statement.executeQuery( sql );
out.println( "<title>Thank you!</title>" );
out.println( "</head>" );
out.println( "<body>" );
out.println( "<p>Thank you for participating." );
out.println( "<br />Results:</p><pre>" );
// processa os resultados
int votes;
while (resultsRS.next())
{
out.print(resultsRS.getString( 1 ));
out.print( ": " );
votes = resultsRS.getInt( 2 );
out.printf( "%.2f", ( double ) votes / total * 100 );
out.print( "% responses: " );
out.println( votes );
} // fim do while
resultsRS.close();
out.print( "Total responses: " );
out.print( total );
// fim do documento XHTML
out.println( "</pre></body></html>" );
out.close();
} // fim do try
// se ocorrer uma exceção de banco de dados, retorna a página de erro
catch ( SQLException sqlException )
{
sqlException.printStackTrace();
out.println( "<title>Error</title>" );
out.println( "</head>" );
out.println( "<body><p>Database error occurred. " );
out.println( "Try again later.</p></body></html>" );
out.close();
} // fim do catch
} // fim do método doPost
// fecha instruções de SQL e banco de dados quando servlet termina
public void destroy()
{
// tenta fechar instruções e conexão do banco de dados
try
{
statement.close();
connection.close();
} // fim do try
// trata exceções de banco de dados retornando um erro ao cliente
catch ( SQLException sqlException )
{
sqlException.printStackTrace();
} // fim do catch
} // fim do método destroy
} // fim da classe SurveyServlet[/code]
Estrutura de Diretórios
WEB-INF
Classes
com
deitel
jhtp6
servlets
lib
Erro:
[code]type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error allocating a servlet instance
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Unknown Source)
root cause
java.lang.NoClassDefFoundError: IllegalName: com/deitel/jhtp6/servlets/SurveyServlet
java.lang.ClassLoader.preDefineClass(Unknown Source)
java.lang.ClassLoader.defineClass(Unknown Source)
java.security.SecureClassLoader.defineClass(Unknown Source)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1812)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:866)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1319)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Unknown Source)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.[/code]