przesyłanie serializowanych obiektów

0

Witam

Próbuję opanować prostą komunikację applet - servlet. Przesyłanie standartowych obiektów (int, String etc.) działa bez problemu, ale nie udaje mi się przesłać własnej klasy. Jedyne co udało mi się znaleźć, to że klasa musi implementować interfejs Serializable, ale to nie wystarcza. Servlet uruchamiam na Sun Java System Application Server Enterprise Edition 8.1

Zamieszczam kod, który działa. W momencie kiedy próbuję zastępować przesyłane stringi obiektami mojObiekt, wywala IOException :/ Z góry dzięki za pomoc.

servlet:

mojServlet.java

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class mojServlet extends HttpServlet
{
	public void service(HttpServletRequest req, HttpServletResponse res)
    	throws ServletException, IOException 
	{
        	try
        	{
        		ObjectInputStream in = new ObjectInputStream( req.getInputStream() );
        		String str = (String)in.readObject();
        		str += "  ... doszlo";
        		ObjectOutputStream out = new ObjectOutputStream( res.getOutputStream() );
        		out.writeObject(str);
        		out.close();
        	}
        	catch (ClassNotFoundException e) {}
	}
}

applet

mojApplet.java

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;

public class mojApplet extends javax.swing.JApplet 
{
    	JLabel lab;
    	public void init()
    	{
        	Container c = getContentPane();
        	lab = new JLabel();
        	c.add(lab);     
    	}
    
    	public void start()
    	{
        	try
        	{
        		URL urel = new URL("http", "localhost" ,1054,  "/servlet/mojServlet");
 			URLConnection urlc = urel.openConnection();
			urlc.setDoOutput(true);
        		ObjectOutputStream out = new ObjectOutputStream( urlc.getOutputStream() );
        		out.writeObject("tekst ...");
        		out.close();

        		ObjectInputStream in = new ObjectInputStream( urlc.getInputStream() );      
        		String str = (String)in.readObject();
        		lab.setText(str);
        	}
        	catch(IOException e) {}
        	catch(ClassNotFoundException e) {}       
    	}
}

serializowana klasa

public class mojObiekt implements Serializable
{
	private int x;
	mojObiekt(int y)
	{
		x = y;
	}
}

0

Jak to mówią: "90% problemów poruszanych na forum użytkownicy rozwiązaliby sami gdyby nie mieli dostępu do internetu" i okazuje się to prawdą :) Problem tkwił w tym, że klasa którą probowałem przesyłać była zdefiniowana oddzielnie w źródłach servletu i appletu, a że były to inne package to chociaż identyczna to już nie była ta sama klasa. Nie rozumiem tylko dlaczego zwracało mi IOException zamiast ClassNotFoundException, ale to już szczegół.

// wątek właściwie do skasowania ale może się komuś kiedyś przyda, jeśli zaśmiecam forum to przepraszam ;)

0

A JEDNAK NIE DZIAŁA :(

Albo inaczej: działa ale nie tak jakbym chciał. Z komunikacją na kierunku servlet - applet nie ma problemu.
Jednak wysyłanie danych z appletu do servletu może się odbyć tylko na początku, po pierwszej transmisji w drugą stronę kanał applet - servlet nie działa. Na przykład taki kod po stronie appletu działa:

ObjectOutputStream out = new ObjectOutputStream( urlc.getOutputStream() );
out.writeObject("1 ...");
out.writeObject("2 ...");
ObjectInputStream in = new ObjectInputStream( urlc.getInputStream() );      
String str = (String)in.readObject();

(i analogicznie po stronie servletu dwa razy readObject() i raz writeObject())

a taki już nie:

ObjectOutputStream out = new ObjectOutputStream( urlc.getOutputStream() );
out.writeObject("1 ...");
ObjectInputStream in = new ObjectInputStream( urlc.getInputStream() );      
String str = (String)in.readObject();
out.writeObject("2 ...");  // jedynie ta linia zmieniła miejsce

powtórna próba wysłania danych z appletu nie przynosi efektu :/ Nie wiem czy wina leży po stronie appletu czy servletu. Czy w ogóle da się utworzyć taki kanał applet-servlet na stałe? Wydawałoby się że tak, w końcu są metody klas URLConnection getOutputStream() i ServletRequest getInputStream() ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.