Servlet como um RMI Cliente

Olá a todos,

já tentei de todas as formas colocar um Servlet pra rodar como RMI Cliente e não consegui. Tenho um projeto de cadastro de alunos via Web e ao clicar em cadastrar um aluno novo o Tomcat me retorna o seguinte erro:

exception

javax.servlet.ServletException: Class ClienteAlunosCadastro is not a Servlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:322)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1732)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:662)

root cause

java.lang.ClassCastException: ClienteAlunosCadastro cannot be cast to javax.servlet.Servlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:322)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1732)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:662)

A minha classe ClienteAlunosCadastro é a seguinte:

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javax.servlet.;
import javax.servlet.http.
;
import java.io.*;
import java.rmi.Naming;

public class ClienteAlunosCadastro{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, MalformedURLException, RemoteException, NotBoundException {

        ComunicadorAlunos chat = (ComunicadorAlunos) Naming.lookup("//localhost/ChatService");

        String matricula = req.getParameter("matricula");
        String aluno = req.getParameter("aluno");
        String nota1 = req.getParameter("not1");
        String nota2 = req.getParameter("not2");
        String frequencia = req.getParameter("freq");
        Aluno alun = new Aluno(matricula, aluno, nota1, nota2, frequencia);
        chat.adicionaAluno(alun);

    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.println("<HTML>");
    out.println("<HEAD>");
    out.println("<TITLE>Hello World Sample Servlet</TITLE>");
    out.println("</HEAD>");
    out.println("<BODY TEXT=#ffffff BACKGROUND=Vitruviano.jpg>");
    out.println("<LEFT><H4>Aluno: " + aluno + "<br>Matricula: " + matricula + "<br>Nota1: " + nota1 + "<br>Nota2: " + nota2 + "<br>Frequencia: " + frequencia + "<br><br>Aluno Cadastrado com Sucesso!</H4></LEFT>");
    out.println("<A HREF=http://localhost:8080/examples/ClienteAlunosCadastro.html>Voltar</A>");
    out.println("</BODY>");
    out.println("</HTML>");
    out.close();

}
}

A classe acima pega os parâmetros da Web e adiciona um novo aluno na Lista de Alunos que eu criei.
O método adiciona aluno está da seguinte forma no Serviço remoto do servidor:
public void adicionaAluno(Aluno alun) throws RemoteException {
listaAlunos.add(alun);
}

Toda a interface está configurada corretamente e o servidor também(acredito eu)…Fiz uma lista de Objetos Aluno com certos atributos como Matrícula, Nota, Frequencia e Média. Preciso de alguma luz…Att.
Geyson Santana

Simples:

Sua classe não é uma Servlet porque não estende HttpServlet.

Deu certo! Só que agora ele está mostrando a seguinte mensagem:

exception

java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.io.NotSerializableException: Aluno
sun.rmi.server.UnicastRef.invoke(UnicastRef.java:138)
InterfaceServidorAlunos_Stub.adicionaAluno(Unknown Source)
ClienteAlunosCadastro.doGet(ClienteAlunosCadastro.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.io.NotSerializableException: Aluno
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:274)
sun.rmi.server.UnicastRef.invoke(UnicastRef.java:133)
InterfaceServidorAlunos_Stub.adicionaAluno(Unknown Source)
ClienteAlunosCadastro.doGet(ClienteAlunosCadastro.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Andei pesquisando e precisarei serializar a classe Aluno…A questão é que eu não compreendo que classe no RMI vai gravar o Objeto no arquivo se é o cliente ou a interface servidor e como vai funcionar a serialização pela rede?..Os materiais que encontrei sobre o assunto não são nada didáticos…Desde já agradeço…

Finalmente consegui. Serializei a classe Aluno e criei uma classe Serializar de acordo com o site abaixo:
http://www.meupost.com/2008/12/03/serializacao-de-objeto-no-java/

fiz alguns ajustes, como,por exemplo, se eu precisava alterar o aluno cadastrado bastava ler o arquivo serializado, jogar em um arraylist alterar o objeto em um endereço i e depois mandas gravar no arquivo novamente…
Se alguém precisar de uma ajuda…Vlw

Geyson, so uma duvida, porque usar RMI direto?
Porque não um EJB?

Cadeira de Sistemas Operacionais distribuídos…tinha que unir servlet’s com rmi e no rmi vi a necessidade de serialização… :lol:

Não foi essa a pergunta do Jaba. Usar um EJB remoto dentro de um Servlet é na prática invocar um método por RMI, porém o conteiner JEE faz isso pra você por debaixo dos panos. O que ele perguntou é porque você está fazendo isso na unha ao invés de usar a API.

Infelizmente não conheço EJB e sou iniciante em java. Mas, pelo que acabei de ler ele é um componente do tipo servidor que executa no container do servidor de aplicação. A classe que estava executando é do tipo cliente de um rmi que estava chamando métodos remotos…isso é um pouco confuso…pelo menos pra mim…se puder dar uma explicada de como eu poderia implementar isso …eu agradeço! estou no aprendizado e subindo…