Primeira Servlet

10 respostas
Ze1

Olá pessoal.
Li o tutorial ensinando a fazer uma servlet que se encontra nesta página (http://www.guj.com.br/servlet/guj?PARSE=true&MAMUTE_ACTION=br.com.guj.action.ListTutorial&MAMUTE_TEMPLATE=ShowTutorial&LIST_TUTORIAL=single&PAGE=1&TutorialId=9). Fiz exatamente como estava descrito. O meu Tomcat etá ok, pois consigo visualizar os exemplos que vieram nele. Porém a servlet que criei (pelo tutorial) não está funcionando direito. Reebi o seguinte erro(desculpe por colar essa mensagem extensa, mas acho que auxiliará), vejam se sabem qual é a causa:

HTTP Status 500 -


type Exception report

message

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

exception

javax.servlet.ServletException: Wrapper cannot find servlet class HelloServlet or a class it depends on

at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:880)

at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:658)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2397)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:171)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)

at java.lang.Thread.run(Thread.java:536)

root cause

java.lang.ClassNotFoundException: HelloServlet

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1428)

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)

at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:874)

at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:658)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2397)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:171)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)

at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)

at java.lang.Thread.run(Thread.java:536)

10 Respostas

F

Olá Zé!

Eu fiz esse exemplo aqui e funcionou normalmente! Entao fiz o seguinte teste: apaguei a classe HelloServlet.class que estava no diretorio:

“…\webapps\HelloServletApp\WEB-INF\classes”

e baixei e reiniciei o Tomcat. Tentei rodar de novo e deu um erro praticamente igual ao erro que vc postou. Então a minha suspeita é que vc nao tenha compilado e/ou copiado o arquivo HelloServlet.class para o diretorio acima.

Se esse não for o caso, poste aqui o conteudo do seu arquivo “…\webapps\HelloServletApp\WEB-INF\web.xml” para que a gente possa tentar procurar onde está o erro!

Ze1

Realmente não é esse o problema. O arquiv está lá sim. Fiz exatamente igual, portanto o web.xml está como no exemplo. Segue ele:

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
http://java.sun.com/dtd/web-app_2_3.dtd”>

<web-app>

&lt;!-- Indica ao Tomcat as Servlets da nossa aplicacao --&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;HelloServlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;HelloServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;!-- Define um padrão de url através do qual a HelloServlet será acessada.
 No caso qualquer url do tipo 
 "http://localhost:8080/HelloServletApp/QualquerCoisa.teste"
 faz com que a nossa HelloServlet seja chamada --&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;HelloServlet&lt;/servlet-name&gt; 
    &lt;url-pattern&gt;*.teste&lt;/url-pattern&gt; 
&lt;/servlet-mapping&gt;

&lt;!-- Define outro padrão de url através do qual a HelloServlet será acessada.
 No caso, a url "http://localhost:8080/HelloServletApp/HelloServlet"
 faz com que a nossa HelloServlet seja chamada --&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;HelloServlet&lt;/servlet-name&gt; 
    &lt;url-pattern&gt;/HelloServlet&lt;/url-pattern&gt; 
&lt;/servlet-mapping&gt;

&lt;session-config&gt;
    &lt;session-timeout&gt;30&lt;/session-timeout&gt; &lt;!-- 30 minutes --&gt;
&lt;/session-config&gt;

</web-app>

Aproveitando que respondeste, vou puxar outro assunto. Qual a vantagem de se ter um Servlet e não uma JSP. Explico porque da minha dúvida: num servlet terei de colocar o HTML que será respondido no meio do código Java, enquanto JSP eu colocaria o código “java” no meio do código HTML, ou seja, se for necessário mudar a parte HTML ou mesmo a parte “java” num JSP, não será necessário recompilar nada, quanto num servlet terei de recompilar a classe.
Outra questão é em relação a um JSP usar RMI, há como eu chamar o Naming.lookup()?

Desculpe pelo “bombardeio” de perguntas!

Ze1

Tchê, já achei o problema. Era o seguinte:

O nome do diretório “classes” estava com o “C” maiúsculo. Aí não rola!!!

Valeu pela atenção.

Paulo_Silveira

hehehe
puts

fogo esse tipo de problema hein?

F

acontece
:mrgreen:

Paulo_Silveira

Só Agora li isso!

Zé, NUNCA FAÇA ISSO!!! o guj tem html e nao tem UMA (bem, umas tem) linha de html no meio de servlets!!!

da uma olhada em http://cvs.arca.ime.usp.br, a gente usa o VELOCITY do jakarta.apache.org, que separa o html do seu codigo java em templates!!!

nunca coloque html no seu java! nos nao usamos jsp, por causa q mistura java com html. nos tambem nao misturamos sql e java, deixamos em arquivos de configuracao!

falou

Ze1

Interessante. Dei uma olhada e saquei qual o lance das querys. Usam um arquivo MySQL.sql com as querys já escritas e com HoldPlaces (’?’). Usam o setObject() da interface PreparedStatement para “setá-los”. Acho que esta é idéia, certo (me corrija se estiver errado)? Foi uma olhada rápida…

Vou olhar com mais calma para ver como é feito para o código HTML.

Valeu pela força galera…

A

Olá,

Estou tendo problemas para executar meus testes, iniciais, como chama uma servlet por um link e por um form ?

estou tentando executar aquela primeira servlet do tutorial chamando diretamente pelo endereço da servlet, assim funciona.
<<< http://localhost:8080/HelloServletApp/HelloServlet >>> OK

tento executar criando um html com um link para a servlet HelloServlet porém, da este erro: << http://localhost:8080/HelloServletApp/index.html >>
HTTP Status 404 - /HelloServletApp/WEB-INF/classes/HelloServlet

type Status report
message /HelloServletApp/WEB-INF/classes/HelloServlet
description The requested resource (/HelloServletApp/WEB-INF/classes/HelloServlet) is not available.

Apache Tomcat/4.1.8

o link está com está tag href configurada: http://10.81.141.121:8080/HelloServletApp/WEB-INF/classes/HelloServlet

como configurar este link para a servlet ?
<a href=“HelloServlet”>HelloServlet</a> ? assim ?

obrigado…

Alexandre S. Melo

F

O jeito correto de colocar o link é colocando o mesmo link que vc usou para chamar diretamente a servlet. No caso seria:

&lt;a href=&quot;http&#58;//localhost&#58;8080/HelloServletApp/HelloServlet&quot;&gt;Clique aqui para rodar a HelloServlet&lt;/a&gt;

Entretanto…

do jeito acima também deve funcionar pois tanto o index.html quanto a HelloServlet possuem a mesma URL base, no caso: http://localhost:8080/HelloServletApp.

Apesar de a HelloServlet nao estar no mesmo diretorio do index.html, no arquivo web.xml fazemos um mapeamento da Servlet de modo que ela é
acessada como se estivesse no mesmo diretorio do arquivo index.html.

A

Ai embaixo está o meu web.xml, gostaria de saber mais sobre estas configurações…
para a ServletA esta configurada a url servlet, isto quer dizer que a ServletA será acessada no mesmo nível que o meu index.html que está no diretório root da minha aplicação ?
e para configurar o local da minha pagina inicial, pode-se modificar seu local por este arquivo web.xml ?
onde encontrar um guia para este e outros arquivos de configuração para web apps ?

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
http://java.sun.com/dtd/web-app_2_3.dtd”>

<web-app>

&lt;!-- Indica ao Tomcat as Servlets da nossa aplicacao --&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;HelloServlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;HelloServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;

 &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;ServletA&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/servlets&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;ServletB&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/servlets&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;session-config&gt;
    &lt;session-timeout&gt;30&lt;/session-timeout&gt; &lt;!-- 30 minutes --&gt;
&lt;/session-config&gt;

</web-app>

Criado 9 de setembro de 2002
Ultima resposta 11 de set. de 2002
Respostas 10
Participantes 4