Foros del Web » Programación para mayores de 30 ;) » Java »

Problema comunicacion Applet+Servlet

Estas en el tema de Problema comunicacion Applet+Servlet en el foro de Java en Foros del Web. Hola que hay.. Aquí traigo una duda, a ver si me la podeis resolver porque yo ya no sé que puede ser... Me explico. Tengo ...
  #1 (permalink)  
Antiguo 11/11/2009, 10:06
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Exclamación Problema comunicacion Applet+Servlet

Hola que hay..

Aquí traigo una duda, a ver si me la podeis resolver porque yo ya no sé que puede ser... Me explico.

Tengo por un lado un Applet que recoge información del usuario, la almacena en un objeto serializable llamado "usuario" y lo envía mediante POST a un servlet.

El servlet recoge el objeto, lo "des-serializa" y lo introduce en una BBDD.. después envía un objeto de tipo String al Applet para enviarle la confirmación..

Hasta aquí el funcionamiento que cabría esperar... pero no es así.

Parece ser que el Servlet no realiza su acción doPost correctamente... es decir, ni recoge el Usuario, ni lo almacena en la BBDD, ni escribe luego el String en el "response" para enviarlo al InputStream...

Es como si el Servlet estuviera muerto... o algo así. El Servlet está desplegado en el Tomcat 6..

Aquí os pego el código para que me ayudeis..

Edit: He creado un método doGet de prueba... y me sale el error de:...
El Metodo HTTP GET no es soportado por esta URL

Puede que esto aporte algo más de información...

Alguien sabe porque puede ser?


APPLET. Registro de Usuario.

Código:
       try{
        log("Conectando al servlet");
        URL userDBservlet = new URL(webServerStr);
        servletConnection = (HttpURLConnection)userDBservlet.openConnection();
        log("Conectado");

        // inform the connection that we will send output and accept input
        servletConnection.setRequestMethod("POST");
        servletConnection.setDoInput(true);
	servletConnection.setDoOutput(true);

        // Don't used a cached version of URL connection.
        servletConnection.setUseCaches (false);

        // Specify the content type that we will send binary data
        servletConnection.setRequestProperty("Content-Type", "java-internal/"+usuario.getClass().getName());

        sendUserToServlet(servletConnection,usuario);

        //Se lee la contestacion del Servlet.
        readServletResponse(servletConnection);

        
       }catch(Exception e){
           log(e.toString());
       }
APPLET... Método sentUserToServlet.

Código:
private void sendUserToServlet(HttpURLConnection servletConnection, User usuario){
        ObjectOutputStream outputToServlet = null;
        Object usuarioObj = usuario;
        try{
            //Se envia el objeto User, utilizando serializacion
            log("enviando usuario...");
            outputToServlet = new ObjectOutputStream(servletConnection.getOutputStream());
            //se serializa el objeto.
            outputToServlet.writeObject(usuarioObj);
            outputToServlet.flush();
	    outputToServlet.close();
	    log("Complete.");

        }catch(Exception e){
            log(e.toString());
        }
    }
APPLET. Método readServletResponse

Código:
protected void readServletResponse(HttpURLConnection servletConnection)
    {
      try{
        ObjectInputStream input = new ObjectInputStream(servletConnection.getInputStream());
        Object respuesta = input.readObject();

        String confirmacion = (String)respuesta;
        log(confirmacion);

      }catch(Exception e){
          log(e.toString());
      }
    }
------------------------------------------------------------------------------------------------------

SERVLET.
Código:
public void doPost(HttpServletRequest request, HttpServletResponse response)
    {

        ObjectInputStream inputFromApplet = null;
        ObjectOutputStream outputToApplet=null;
        Object salida = null;
        User usuario = null;
        String cadena = null;

        try{
            //capturar el input stream del applet
            inputFromApplet = new ObjectInputStream(request.getInputStream());
            show("Conectado");

            //leer la informacion serializable del applet
            show("Leyendo datos...");
            usuario = (User) inputFromApplet.readObject();
            show("Finalizada lectura");

            inputFromApplet.close();
            //Usar el modelo de datos para registrar al Usuario.
            show("Registrando usuario...");
            modeloDatos.registerUser(usuario);

            show("Completado");

            //Se envia un mensaje al Applet
            cadena = new String("Confirmado");
            salida = cadena;
            response.setContentType("java-internal/"+salida.getClass().getName());
            outputToApplet = new ObjectOutputStream(response.getOutputStream());
            outputToApplet.writeObject(salida);
            outputToApplet.flush();
            outputToApplet.close();


        }catch(Exception e){
            e.printStackTrace();
        }
    }
Disculpad la longitud del código.
Un saludo y gracias.

Última edición por dani_demons; 11/11/2009 a las 10:28
  #2 (permalink)  
Antiguo 11/11/2009, 10:41
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

Wenas

El get no te funciona porque no lo tienes implementado tendrias que tener un doGet al igual que un doPost. Si ambos van a hacer lo mismo lo mas facil es implementarlo de esta manera.

Código:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException 
{
blablabla;
}
Si tu haces una llamada a tu servlet. Directamente a traves de la url, te responde?? te sale alguna traza??

Saludos
  #3 (permalink)  
Antiguo 11/11/2009, 10:45
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Si si, he implementado un método doGet de prueba para ver si funcionaba el servlet... Pero parece que mi método doGet se lo pasa por el forro...

Al igual que creo que mi método doPost también se lo pasa por el forro..

Código:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();

		contador++;
		out.println("&lthtml>");
		out.println("&lthead>&lttitle>Bienvenido al servlet contador</title></head>");
		out.println("&ltbody bgcolor=\"#FFFF9D\">&ltFONT color=\"#000080\" FACE=\"Arial,Helvetica,Times\" SIZE=2>"+
					"&ltCENTER>&ltH3>Servlets</H3></CENTER>");
		Date d = new Date();
		out.println("&ltHR>&ltp>¡Hola Mundo!. Fecha y hora: " + d.toString() +  "</p>");
		out.println("&ltp>Número de invocaciones a doGet(): " + contador + "</p>");
		out.println("</body></font></html>");

   }
Y me sale eso de... : Método GET no soportado.
  #4 (permalink)  
Antiguo 11/11/2009, 10:50
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

Tu web.xml?? Lo llamas directamente (desde el propio iexporer) y que te dice??
  #5 (permalink)  
Antiguo 11/11/2009, 11:03
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Mi web.xml lo tengo dentro de WEB-INF... segun tengo entendido no se puede acceder desde el navegador a archivos que se encuentran dentro de esa carpeta..

Veras mi estructura de despliegue es la siguiente:

/servlet
|-- WEB-INF
.......|-- web.xml
.......|-- classes
.............|-- servidor
.....................|-- utilities
.....................|-- UserDBServlet.class

Mi web.xml :
Código:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
        <servlet-name>UserDBServlet</servlet-name>
        <servlet-class>servidor.UserDBServlet</servlet-class>
</servlet>
<servlet-mapping>
		<servlet-name>UserDBServlet</servlet-name>
		<url-pattern>/UserDBServlet</url-pattern>
</servlet-mapping>
</web-app>
  #6 (permalink)  
Antiguo 11/11/2009, 11:10
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

y el http://maquina:puerto/aplicacion/UserDBServlet que te da??
  #7 (permalink)  
Antiguo 11/11/2009, 11:13
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Escribiendo.. http://localhost:8080/servlet/UserDBServlet

ME sale el error del método GET

Código:
Estado HTTP 405 - El Metodo HTTP GET no es soportado por esta URL

type Informe de estado

mensaje El Metodo HTTP GET no es soportado por esta URL

descripción El método HTTP especificado no está permitido para el recurso requerido (El Metodo HTTP GET no es soportado por esta URL).
Apache Tomcat/6.0.20
  #8 (permalink)  
Antiguo 11/11/2009, 11:55
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Ahora parece que el método GET si funciona.. y no he hecho absolutamente nada...

Si invoco un formulario con method=GET... me sale lo que me tiene que salir..
Pero en el applet sigue sin funcionar el method POST...

Has mirado el codigo para enviar el objeto al servlet?... Para enviar objetos a un servlet es el modo correcto no?..

Quiero decir, que no hay que invocar explícitamente el método "doPost" por ningún lado...

Alguna idea?
  #9 (permalink)  
Antiguo 12/11/2009, 00:20
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema comunicacion Applet+Servlet

Hola,

Cita:
Iniciado por dani_demons Ver Mensaje
Ahora parece que el método GET si funciona.. y no he hecho absolutamente nada...
¿Realizas un deploy cada vez que pruebas la aplicación, y borras el cache?
A veces se le olvida a uno ...

Cita:
Iniciado por dani_demons Ver Mensaje
... Quiero decir, que no hay que invocar explícitamente el método "doPost" por ningún lado...
Técnicamente no, pero ¿estas leyendo la respuesta del servlet? Creo que el post se realiza hasta que lees la respuesta. El Applet haría el header y body del post pero el Servlet no pasa por el método post hasta que intentas leer la respuesta.

Saludos,
  #10 (permalink)  
Antiguo 12/11/2009, 04:08
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Efectivamente, supongo que sería la Caché... llevo un par de días con esto de los servlets (aprendiendo a marchas forzadas como ves) y tengo fallos como los de no borrar la caché... De todo se aprende..

Hay algo más que deba tener en cuenta tipo "borrar Caché".. o cosas así..?

De todas formas, aquí te pongo el método doPost... mira a ver si falta algo...

Código:
public void doPost(HttpServletRequest request, HttpServletResponse response)
    {

        ObjectInputStream inputFromApplet = null;
        ObjectOutputStream outputToApplet=null;
        Object salida = null;
        User usuario = null;
        String cadena = null;

        try{
            //capturar el input stream del applet
            inputFromApplet = new ObjectInputStream(request.getInputStream());
            show("Conectado");

            //leer la informacion serializable del applet
            show("Leyendo datos...");
            usuario = (User) inputFromApplet.readObject();
            show("Finalizada lectura");

            inputFromApplet.close();
            //Usar el modelo de datos para registrar al Usuario.
            show("Registrando usuario...");
            modeloDatos.registerUser(usuario);

            show("Completado");

            //Se envia un mensaje al Applet
            cadena = new String("Confirmado");
            salida = cadena;
            response.setContentType("java-internal/"+salida.getClass().getName());
            outputToApplet = new ObjectOutputStream(response.getOutputStream());
            outputToApplet.writeObject(salida);
            outputToApplet.flush();
            outputToApplet.close();

        }catch(Exception e){
            e.printStackTrace();
        }

    }
  #11 (permalink)  
Antiguo 12/11/2009, 05:41
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

Cita:
Iniciado por HackmanC Ver Mensaje
pero el Servlet no pasa por el método post hasta que intentas leer la respuesta.
Ein?? Por otro lado, dani, que quiere decir que ahora el get te funciona?? Te salen las trazas por tu log??
  #12 (permalink)  
Antiguo 12/11/2009, 06:34
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Que parece ser que había una versión cacheada en el Tomcat sin el método doGet, y por ello no me funcionaba.. aunque tuviera desplegado el servlet con el método doGet codificado..
  #13 (permalink)  
Antiguo 12/11/2009, 06:38
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

Bueno, lo de la cache ya no se te olvida.

Si en el doPost tienes lo mismo que en el doGet... No tendria que tener nada que faltase.

Saludos.
  #14 (permalink)  
Antiguo 12/11/2009, 07:07
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

obviamente no es lo mismo el doGet y el doPost.. lo he puesto los dos métodos arriba..
El método doGet era simplemente para probar que funcionaba el servlet, el doPost es realmente el método que va a usarse en la aplicación..
  #15 (permalink)  
Antiguo 12/11/2009, 09:07
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problema comunicacion Applet+Servlet

Si, es cierto, perdona.

Vamos a mirar si hay algun problema con tu objeto. Has probado ha mandarle un dato normal y corriente (un byte por ejemplo) y recogerlo con un datainputstream??

Saludos.
  #16 (permalink)  
Antiguo 12/11/2009, 09:22
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Voy a hacer unas cuantas pruebas y ahora comento los resultados..
  #17 (permalink)  
Antiguo 12/11/2009, 12:40
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema comunicacion Applet+Servlet

Cita:
Iniciado por dani_demons Ver Mensaje
... De todas formas, aquí te pongo el método doPost... mira a ver si falta algo...
Hola,

Yo me refería al Applet, si el Applet no trata de leer del InputStream no hace el post, (¿? ) ...

Código:
sendUserToServlet(servletConnection, usuario);
BufferedReader br = new BufferedReader(
new InputStreamReader(servletConnection.getInputStream()));
// Leer de br la respuesta completa
br.close();
servletConnection.disconnect();
Saludos,

ps:
Por el método GET no creo que puedas pasar el objeto serializado, solamente que sea muy pequeño (2048 bytes) y trendrías que codificarlo con algo como URLEncode y decodificarlo depués (aparte de la serialización).
  #18 (permalink)  
Antiguo 12/11/2009, 13:15
Avatar de dani_demons  
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Problema resuelto!

Veamos aquí os pongo una serie de problemas que tenía mi aplicación para que le sirva a las demás personas..

Problema: Tenía dos clases "User" en distintos paquetes.
Solución: Sí, no me había dado cuenta y tenía dos clases User, una en servidor y otra en cliente... por lo que aunque tenían el mismo código y el mismo nombre.... no eran de la misma clase... por lo que el objeto nunca se enviaba

Problema: Tipo del Content-Type de Objeto Serializado
Solución: Tenía "java-internal/...", y eso solo funciona con las clases nativas de java.. Para pasar el objeto serializado hay que poner Content-type: "application/java-serialized-object"

Problema: No se iniciaba la conexión a la BBDD (este problema no es del código sino del Tomcat).
Solución: Incluir el conector de la bbdd en la carpeta "C:\Tomcat\lib" y además incluir esta ruta en el PATH..


Muchísimas gracias a todos los que han contestado al post prestandome su ayuda.

Un saludo
  #19 (permalink)  
Antiguo 05/12/2009, 13:33
 
Fecha de Ingreso: mayo-2006
Mensajes: 1
Antigüedad: 17 años, 11 meses
Puntos: 0
Respuesta: Problema comunicacion Applet+Servlet

Hola, antes de todo y sin que parezca vago me gustaría que si no es ningún inconveniente que me facilitaras el código completo con lo que importas y todo, para analizarlo por que estoy con el mismo problema que tu y soy newbie en esto de los servlets y necesito leer de una BD con un applet y no logro dar con la respuesta. Primero logré leer y escribir en una BD con el applet pero cuando lo monté en la JSP no me leia de la BD. Espero me puedan ayudar.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:21.