Servlet como um RMI Cliente

7 respostas
geyson_santana

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.<em>;

import javax.servlet.http.</em>;

import <a href="http://java.io">java.io</a>.*;

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

7 Respostas

Jaba

Simples:

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

geyson_santana

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…

geyson_santana

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

Jaba

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

geyson_santana

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

rmendes08

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.

geyson_santana

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…

Criado 24 de junho de 2011
Ultima resposta 28 de jun. de 2011
Respostas 7
Participantes 3