# object via post auf servlet send und weiter bearbeiten



## search (14. Nov 2004)

hallo zusammen

hat jemand eine idee oder kann mir jemand sagen wie ich ein object wie post auf ein httpServlet senden kann. habe bisher noch nichts gescheites gefunden. habs mal mit httpClient probiert... bin da aber auch nicht weiter gekommen... 
wäre für tips dankbar.

danke und gruss

Search


----------



## Bleiglanz (15. Nov 2004)

genauer Fragen?

entweder in einen String verwandlen (xml?) und als text mitschicken, oder serialisieren und binär mitschicken ("z.B. als File-Upload")

Was meinst du mit "ein object wie post auf ein httpServlet senden"??


----------



## search (15. Nov 2004)

hallo,

danke für eine antwort. hab jedoch geschrieben VIA nicht wie. ich möchte ein object von einem applet auf den server (httpServlet) senden. dieses möchte über post an das servlet schicken. 
hmmm... hab mal so ein bespiel mit fileUpload angesehen. dies funktioniert über den httpClient von apache commons. funktioniert soweit eigentlich auch. also ich komme auf den post. wie kann ich das file jetzt dort auslesen? bekomme ein filePart im request. wie kann ich jetzt da das object wieder auslesen.
hoffe ihr versteht halbwegs was ich meini. hier mal der code zur veranschaulichung:


```
public class SendMessage implements PartSource
{
	GekkoMessage gmsg = null;
	byte[] data = null;	
	
	public SendMessage(GekkoMessage msg)
	{
		this.gmsg = msg;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		try
		{			
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this.gmsg);
			data = baos.toByteArray();
		}
		catch (IOException e)
		{
			System.out.println("Can't write Object: " + e);
		}
	}
	
	public String getFileName()
	{
		return  "messageObj.bin";
	}

	public InputStream createInputStream() throws IOException
	{		
		return new ByteArrayInputStream(data);
	}

	public long getLength()
	{
		return data.length;
	}
}
```


```
MultipartPostMethod mpm = new MultipartPostMethod("http://localhost:8080/Servlet");

			mpm.addPart(new FilePart("message", new SendMessage(msg)));
			
			mpm.setRequestHeader("Content-Type","application/octet-stream");
		
			HttpClient httpclient = new HttpClient();
		
			int result = httpclient.executeMethod(mpm);
```

danke und gruss


----------



## Bleiglanz (15. Nov 2004)

> bekomme ein filePart im request. wie kann ich jetzt da das object wieder auslesen.


geht eigentlich nicht richtig mit Tomcat Bordmitteln, verwende eine extra Bibliothek, zum Beispiel

jakarta.commons.fileupload


----------



## search (15. Nov 2004)

hmm... ja habs nun irgendwie so:


```
MultipartStream multipartStream = new MultipartStream(req.getInputStream(), boundary);
			boolean nextPart = multipartStream.skipPreamble();
			OutputStream output;
			
			while(nextPart) 
			{
				multipartStream.readBodyData(output);
				nextPart = multipartStream.readBoundary();
			}
```

komm jetzt aber irgendwie nicht weiter. jetzt hab ich ja den filePart im output oder? und wie komme ich von da nun zu meinem objekt zurück? 
aja, und was ist boundary genau. dies ist ja vom type byte[]. aber wie oder woher bekomme ich das? hab mal gelesen das das die grösse vom inputStream ist... wie finde ich die jedoch heraus wenn ich den ja bekommen möchte?  :bahnhof: 

gruss


----------



## search (15. Nov 2004)

hmm... hab jetzt nochmal dran rumgepröbelt... bekomms aber einfach nicht hin irgendwie... kann sich vielleicht jemand die code schnipsel mal ansehen und mir sagen ob das so überhaupt funktionieren könnte... ich erhalt eine message auf den post weiss einfach nicht ob auch alles richtig ankommt... und mit dem auslesen aus dem request habe ich sowieso meine probleme... wäre echt super wenn mir jemand weiterhelfen könnte...

danke & gruss, search


----------



## search (16. Nov 2004)

niemand ne idee? komme echt nimmer weiter... 

danke


----------



## Bleiglanz (16. Nov 2004)

ja und?

was ist das Problem? Doku fuer den FileUpload gelesen?

andere Idee:

lass den Fileupload einfach weg und schreib den binaeren Objektstrom direkt in den POST body hineine, auf der server(bzw. servlet) seite kannst du den dann mit getInputStream

public ServletInputStream getInputStream()
                                  throws IOException

    Retrieves the body of the request as binary data using a ServletInputStream. Either this method or getReader() may be called to read the body, not both.

einfach auslesen.


oder noch besser:

serialisier dein Objekt in eine XML-Text-Datei, übergib diese als Post-parameter und hols dir mit getParameter wieder ab


----------



## search (16. Nov 2004)

meinst du mit xmlEncoder / Decoder? 

wie würde ich dann auf den post schreiben können? auch mit dem apache commons httpClient?

gruss


----------



## Bleiglanz (16. Nov 2004)

na klar, xml ist nichts anderes als text; schreib einfach

    myobject=[UNDJETZTDASXMLWIESAUSDENCODERKOMMT]

in den post body und mach dann

     String objectAsxml=request.getParameter("myobject");


----------



## search (16. Nov 2004)

hmmm... ich sehs irgendwie nicht... wie ich das object decoden kann kapier ich... wie kann ich es jedoch encoden? ich möchte es ja von meinem client auf das servlet schicken und dies über den post ... wie kann ich das object jedoch encoden? 
den post auf das servlet mache ich wie folgt:


```
PostMethod post = new PostMethod("http://localhost:8080/Messenger/ServerServlet");
		
		NameValuePair nvp = new NameValuePair();
		
		nvp.setName("objectName");
		nvp.setValue("xmlEncodedObject");
		
		post.addParameter(nvp);
		
		HttpClient httpclient = new HttpClient();
		
		httpclient.executeMethod(post);
```

wie bekomme ich nun das encodete object als string in die value?  :bahnhof: 

danke & gruss


----------



## search (16. Nov 2004)

habs mitem file upload doch noch hinbekommen.

danke für deine hilfe


----------

