Tomcat não acha Servlet Controller - java.lang.ClassNotFoundException

5 respostas
V

Olá pessoal, tudo bem?
Sou iniciante em java web e estou seguindo o curso do Caelum.
Estou na parte de ciração do framework mvc e quando vou acessar minha controller, que é a responsável por redirecionar as requisições, o tomcat não consegue achá-la!

Código da Controller

package br.com.caelum.mvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// imports...
public class ControllerServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		String business = request.getParameter("business");
		String className = "br.com.caelum.mvc." + business;
		try {
			Class clazz = Class.forName(className);
			BusinessLogic businessLogic = (BusinessLogic) clazz.newInstance();
			businessLogic.execute(request, response);
		} catch (Exception e) {
			throw new ServletException("A lógica de negócios causou uma exceção", e);
		}
	}
}

Código do testaMVC (servlet para qual o controller irá redicionar)

package br.com.caelum.mvc;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestaMVC implements BusinessLogic {
	
	public void execute(HttpServletRequest req, HttpServletResponse res) throws Exception {
	System.out.println("Executando a logica e redirecionando...");
	RequestDispatcher rd = req.getRequestDispatcher("/mvc-ok.jsp");
	rd.forward(req, res);
	}
}
Jsp com mensagem de ok!
<html>
<h1> MVC-OK </h1>
</html>
Código do meu arquivo 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>jsp</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>
    <servlet-name>servletDeTeste</servlet-name>
    <servlet-class>br.com.caelum.servlet.OiMundo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>servletDeTeste</servlet-name>
    <url-pattern>/oi</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>idade</servlet-name>
    <servlet-class>br.com.caelum.servlet.TestaParametros</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>idade</servlet-name>
    <url-pattern>/testa-idade</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>nossoContador</servlet-name>
    <servlet-class>br.com.caelum.servlet.Contador</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>nossoContador</servlet-name>
    <url-pattern>/conta</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>adicionaContato</servlet-name>
    <servlet-class>br.com.caelum.servlet.AdicionaContatoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>adicionaContato</servlet-name>
    <url-pattern>/testa-adiciona</url-pattern>
  </servlet-mapping>  
  
  <servlet>
	<servlet-name>syp</servlet-name>
	<servlet-class>br.com.caelum.mvc.ControllerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
	<servlet-name>syp</servlet-name>
	<url-pattern>/mvc</url-pattern>
  </servlet-mapping>
</web-app>

Estou tentando acessar o servlet por essa url:
http://localhost:8080/jsp/mvc?business=testamvc

E ele gera esse erro pra mim
31/12/2009 14:42:20 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet syp as unavailable
31/12/2009 14:42:20 org.apache.catalina.core.ApplicationContext log
SEVERE: Error loading WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@116471f
 br.com.caelum.mvc.ControllerServlet
java.lang.ClassNotFoundException: br.com.caelum.mvc.ControllerServlet
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
	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:128)
	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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
31/12/2009 14:42:20 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet syp
java.lang.ClassNotFoundException: br.com.caelum.mvc.ControllerServlet
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
	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:128)
	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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
31/12/2009 15:23:31 org.apache.catalina.core.StandardWrapperValve invoke
INFO: Servlet syp is currently unavailable

Já tentei de tudo e nada, refiz o tutorial, apaguei as classes, mudei o nome do mapping no web.xml e nada!
Desde já, obrigado pela atenção!

5 Respostas

A

Um detalhe bobo, mas às vezes faz muita diferença:
Você já tentou parar seu tomcat, remover a aplicação e dar um novo deploy ?

V

Já sim Alex, inclusive, fiz algumas alterações nos servlets que já estão rodando, e estas alterações não são compiladas pelo tomcat. Parece que ele tá pegando de um cache. Apaguei as pastas e dei um novo deploy, mas nada adianta!

A

Vagner podemos tentar duas coisas:

  • Você poderia verificar se ao dar um novo deploy se a pasta da aplicação no diretório webapp do Tomcat está sendo atualizada.
  • Ou você poderia dar um deploy manual. É só parar o Tomcat copiar seu .war para a pasta webapp e iniciá-lo novamente. Daí é só acessar pelo browser
    localhost:8080/nome_da_sua_app.
    No aguardo …
A

Bom dia,
Cara vc declarou em seu web.xml como

<servlet>   
    <servlet-name>syp</servlet-name>   
    <servlet-class>br.com.caelum.mvc.ControllerServlet</servlet-class>   
  </servlet>   
  <servlet-mapping>   
    <servlet-name>syp</servlet-name>   
    <url-pattern>/mvc</url-pattern>  <!--Aki está seu erro>
  </servlet-mapping>   
</web-app>

e esta acessando a url
http://localhost:8080/jsp/mvc?business=testamvc

no seu acesso vc teria q fazer

http://localhost:8080/jsp/mvc?business=mvc

Veja se isso funfa…

valew

A

Sorry…
Agora q li o codigo…e o acesso esta correto…estou no trampo e naum li com atenção…seu acesso esta aparentemente correto
logo posto algo… :oops:

Criado 31 de dezembro de 2009
Ultima resposta 4 de jan. de 2010
Respostas 5
Participantes 3