Estrutura de diretorios - Servlets nao funcionam

11 respostas
M

Bom, o meu problema é estupido e idiota, mas ja me custou 1 dia inteiro e eu nao consigo configurar a estrutura de diretorios do meu projeto para que o tomcat rode minha Servlet. Vamos la:

A configuração do meu workspace está apontado para meu TOMCAT_HOME/webapps
Eu criei um novo WebDinamicProject chamado Teste.
Meu context Root foi setado para /Teste
Meu Content Directory foi setado como WebContent
Meu source folder onde vai ficar os .java ficou src

Assim, o eclipse gerou a minha estrutura de diretorios assim:

->Teste
----> src -> pacote ->Teste.java
----> JRE System Library
----> Apache Tomcat v6.0[apache TomCat v6.0]
----> build
----> WebContent
-------> META-INF
-------> WEB-INF
----------> lib -> web.xml
-------> index.jsp

Bom, beleza. Então, fiz uma servlet básica la que eu vi na apostila da Caelum. Nada demais. Configurei meu xml assim:

<display-name>Teste</display-name>
	
	<servlet>
		<description> </description>
		<display-name>Teste</display-name>
		<servlet-name>Teste</servlet-name>
		<servlet-class>pacote.Teste</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Teste</servlet-name>
		<url-pattern>/Teste</url-pattern>
	</servlet-mapping>

Aí acesso la no browser: http://127.0.0.1:8080/Teste/Teste e não funciona. Nao consegue achar a Servlet. Aí eu digitei http://127.0.0.1:8080/Teste/WebContent/index.jsp e minha pagina jsp abriu. Então, o que eu fiz: tirei o WEB-INF e minha pagina jsp de dentro do WebContent e joguei tudo na raiz, dentro do /Teste . Aí minha Servlet funcinou, mas minha pagina jsp nao. Deu um erro de api la. Fiquei nervoso e apaguei o projeto e refiz ele. Pq nao tem sentido nenhum. Pelo que eu li nos tutoriais, o browser teria que enxergar a pasta webContent como raiz. Por isso que ele nao consegue acessar minha Servlet. Acho neh…

queria que vcs me ajudassem a fazer uma configuração decente! Obrigado desde ja!

11 Respostas

D

Por isso acho mais simples e interessante utilizar o NetBeans, a estrutura que ele cria é mais visual e inteligível, além de permitir, no momento da criação de um servlet,
Onde está o diretório “teste”?
A estrutura que você mostra ali não a apresenta.
E qual o erro apresentado? 404?

M

Teste é o meu projeto. ele está dentro do webapps/Teste

Então, qndo eu coloco o WEB-INF dentro do WebContent ele da 404. Agora que eu tirei o WEB-INF do webcontent e joguei ele na raiz do projeto, estám e dando o erro 500.

Veja o log:

11/11/2010 17:35:22 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextDestroyed()
11/11/2010 17:35:22 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextDestroyed()
11/11/2010 17:35:25 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
11/11/2010 17:35:25 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
11/11/2010 17:35:33 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Teste as unavailable
11/11/2010 17:35:33 org.apache.catalina.core.ApplicationContext log
SEVERE: Error loading WebappClassLoader
  context: /Teste
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1eed786
 pacote.Teste
java.lang.ClassNotFoundException: pacote.Teste
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
11/11/2010 17:35:33 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet Teste
java.lang.ClassNotFoundException: pacote.Teste
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
11/11/2010 17:35:36 org.apache.catalina.core.StandardWrapperValve invoke
INFO: Servlet Teste is currently unavailable
11/11/2010 17:35:42 org.apache.catalina.core.StandardWrapperValve invoke
INFO: Servlet Teste is currently unavailable
D

O erro 500 é por não existir uma informação de configuração do projeto, assim, o servidor não sabe o que está acontencendo.
O erro 404 se refere a página (ou recurso) não localizado, que é o caso. O web.xml está dizendo que existe um servlet em um determinado local, mas o local não está lá ou o servlet não está.
Detalhe da URL que você informa no browser. Efetuei um teste e, a princípio, tente assim: http://127.0.0.1:8080/Teste

M

Obrigaod pelas respostas.

Então, como eu descrevi acima, depois que eu tire o WEB-INF do WebContent e deixei na raiz do projeto ele passou a dar erro 500, de configuração de projeto, tanto que é que estou pedindo um auxilio para uma correta configuração.

Colocar o nome da Servlet direto como vc mencionou deu erro 404. Ele consegue enxergar o meu projeto, tanto é que se eu colocar um jsp la, eu consigo acessa-lo através do localhost:8080/Teste/pagina.jsp o problema está pra ele enxergar as servlets mesmo.

M

Seguinte:

Eu fucei e fucei aqui, fiz uma configuração la no eclipse e exclui a pasta webContent, deixando minha WEB-INF na raiz do projeto e minha servlet funcionou. Mas agora as minhas JSPs nao funcionam. Da erro de nullpointer. Tipo, parece que ele nao consegue enxergar o jsp-api.jar na minha WEB-INF/lib . Ja removi e incluí de novo no Build Path e nda. Mas é estranho pq ele consegue enxergar o servlet-api.jar (senoa minha servlet nao funcionaria). Onde pode estar o erro agora?

Obrigado

D

Bom, criei um projeto com o nome ddd, com a mesma estrutura usada por ti.
No web.xml, que criei dentro de web-inf > lib, coloquei o seguinte código:

<?xml version="1.0" encoding="UTF-8"?>
<display-name>Teste</display-name>
<servlet>
	<description></description>
	<display-name>Teste</display-name>
	<servlet-name>Teste</servlet-name>
	<servlet-class>pacote.Teste</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>Teste</servlet-name>
	<url-pattern>/Teste</url-pattern>
</servlet-mapping>

Após isto, criei um package, dentro do diretório src, com o nome pacote.
Dentro do package, criei um servlet com o nome Teste.
Então, executei o projeto.
Ao digitar http://localhost:8080/ddd/pacote/Teste, o erro retornado foi 404.
Mas, quando inseri a URL http://localhost:8080/ddd/Teste trouxe o servlet.

Tenta aí.

M

Vc criou um WebContent e colocou o WEB-INF la?

Vc criou um web.xml dentro do web-inf/lib ??

Abraço

T

-------> WEB-INF
----------> lib -> web.xml

Este caminho está errado.
O web.xml deve ficar no WEB-INF, e não dentro da pasta lib

-------> WEB-INF
----------> lib
---------->web.xml

M

JA corrigi isso. MAs mesmo assim nao funciona. O problema está que meu tomcat nao consegue entender a pasta WebContent. E se eu arranco ela e coloco o WEB-INF na raiz do projeto, ele nao consegue enxergar a lib servlet-api e jsp-api, mesmo eu reconfigurando o buildpath ¬¬

M

Cara, deixa quieto. Abandonei o eclipse e to usando o NetBeans e o GrassFish e funcionou! Vlw aew pela atenção!

L

Tópico antigo, mas enfim…

Seu web.xml está dentro do WEB-INF/lib

Ele deveria estar dentro do WEB-INF só…

Não abandone o Eclipse, po… tão melhor que o Netbeans! :stuck_out_tongue: ahushauhsua

[]'s

Criado 11 de novembro de 2010
Ultima resposta 23 de mar. de 2012
Respostas 11
Participantes 4