2012-10-09 30 views
7

Deseo enviar un objeto serializado de una clase Java a un servlet donde el servlet debe recuperar y guardar el objeto como un archivo. Soy consciente de que tengo que usar HttpURLConnection para hacer una solicitud POST a un servlet, pero no sé si el siguiente código es correcto.¿Cómo se usa HttpURLConnection para enviar un objeto serializado a un Servlet de la clase Java?

private static HttpURLConnection urlCon; 
private static ObjectOutputStream out; 

public static void main(String[] args) { 

    Names names = new Names(); 
    names.setName("ABC"); 
    names.setPlace("Bangalore"); 
    URL url; 
    try { 
     url = new URL("http://localhost:6080/HttpClientSerializable/HttpPostServlet"); 
    try { 
     out = (ObjectOutputStream) urlCon.getOutputStream(); 
     out.writeObject(names); 
     urlCon = (HttpURLConnection) url.openConnection(); 
     urlCon.setRequestMethod("POST"); 
     urlCon.setDoOutput(true); 
     out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
     } 
} 

Y en el servlet, tengo el siguiente código:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ObjectInputStream in = new ObjectInputStream(request.getInputStream()); 
     try { 
      names = (Names) in.readObject(); 

     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     in.close(); 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:/Documents and Settings/RAGASTH/Desktop/Names")); 
     out.writeObject(names); 
     out.close(); 

    } 

¿Qué debo hacer para que funcione? Además, quiero que el servlet envíe de vuelta el objeto que recibe como respuesta.

Cualquier ayuda sería apreciada. ¡Gracias!

+0

¿Por qué no sólo tiene que utilizar JSON o XML como formato de transferencia de datos? – BalusC

+0

Utilicé la biblioteca 'Gson' y funcionó bien. Solo quería probar el envío de objetos serializados. – Rajath

+0

Espero que aproveche sus principales desventajas lo suficientemente pronto. A menudo solo expone a largo plazo. – BalusC

Respuesta

8

Usted tendría que

  • Asegúrese de que la clase implementa Namesjava.io.Serializable interfaz de marcador.
  • Crear un ObjectOutputStream de OutputStream del servlet de la siguiente manera:

    out = new ObjectOutputStream(urlCon.getOutputStream()); 
    
  • En el lado receptor, una vez leído el objeto de flujo de entrada del servlet y persiste en el archivo, grabarla en una secuencia de salida de la respuesta de la siguiente manera:

    out = new ObjectOutputStream(response.getOutputStream()); 
    out.writeObject(names); 
    out.close(); 
    

Por el lado del remitente:

Names names = new Names(); 
names.setName("ABC"); 
names.setPlace("Bangalore"); 
URL url; 
try { 
    url = new URL("http://localhost:6080/HttpClientSerializable/HttpPostServlet"); 
    urlCon = (HttpURLConnection) url.openConnection(); 

    urlCon.setDoOutput(true); // to be able to write. 
    urlCon.setDoInput(true); // to be able to read. 

    out = new ObjectOutputStream(urlCon.getOutputStream()); 
    out.writeObject(names); 
    out.close(); 

    ObjectInputStream ois = new ObjectInputStream(urlCon.getInputStream()); 
    names = (Names) ois.readObject(); 
    ois.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
catch (MalformedURLException e1) { 
    e1.printStackTrace(); 
} 

En el lado del receptor:

ObjectInputStream in = new ObjectInputStream(request.getInputStream()); 
try { 
    names = (Names) in.readObject(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 
in.close(); 
ObjectOutputStream out = new ObjectOutputStream(
    new FileOutputStream("C:/Documents and Settings/RAGASTH/Desktop/Names")); 
out.writeObject(names); 
out.close(); 

ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); 
oos.writeObject(names); 
oos.close(); 
+0

¡Muchas gracias! Pero, ¿qué tipo debería ser el objeto 'out'? Obtengo una 'java.lang.ClassCastException: sun.net.www.http.PosterOutputStream no se puede convertir en java.io.ObjectOutputStream' para la línea' out = new ObjectOutputStream (urlCon.getOutputStream()); 'en el remitente . El tipo de 'out' que he declarado es' ObjectOutputStream'. – Rajath

+0

No estoy seguro de por qué está recibiendo ese error, pero puedo ejecutarlo normalmente. E.g URL url = nueva URL ("http://www.google.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod ("POST"); con.setDoOutput (verdadero); con.setDoInput (verdadero); ObjectOutputStream oos = new ObjectOutputStream (con.getOutputStream()); oos.close(); – Vikdor

+0

¡Funcionó perfectamente bien! ¡Gracias! :) – Rajath

Cuestiones relacionadas