# XML mit JAVA an URL senden (http post)



## Guest (4. Okt 2007)

Hallo Leute!

ich habe ein Problem: ich bin gerade in meiner Ausbildung, und habe die Aufgabe bekommen, eine klee Java Applikation zu basteln. das problem ist, das wir Java erst nächstes Jahr in der Schule lernen...

Sie Aufgabe: Ein kleines Programm, das ein "Öffnen" Fenster hat, um Dateien auswählen zu können –> dann sollen XML Dateien beim klicken auf öffnen an eine URL gesendet werden, mit Hilfe von HTTP Post.

So hört sich ja relativ einfach an^^. kann mir da jemand helfen?

Danke schonmal!


----------



## tuxedo (4. Okt 2007)

Senden von Post-Daten via HTTP und Java:
http://www.exampledepot.com/egs/java.net/Post.html

Einlesen der XML-File: 
http://www.rolandgeyer.at/kurse/german/javsrc/jav030.html

Für die GUI-Entwicklung:
http://www.galileocomputing.de/openbook/javainsel6/
http://www.javabuch.de/

Gruß
Alex


----------



## Niki (4. Okt 2007)

Zum Senden von Files über HTTP gibts was nettes: HTTPClient von jakarta

Hier der Code mit dem es geht

```
private static final String uploadServlet = "/mywebapp/upload";

	private HttpConnection connection = null;

	public MyHttpClient() {
		this(System.getProperty("http.host"), Integer.parseInt(System
				.getProperty("http.port")));
	}

	public MyHttpClient(String host, int port) {
		SimpleHttpConnectionManager connectionManager = new SimpleHttpConnectionManager(
				false);
		HostConfiguration hostConfiguration = new HostConfiguration();
		hostConfiguration.setHost(host, port);
		connection = connectionManager.getConnection(hostConfiguration);
	}

	public int fileUpload(File f) throws IOException {
		if (!connection.isOpen())
			connection.open();

		PostMethod filePost = new PostMethod(uploadServlet);
		Part[] parts = { new StringPart("fileupload_request", f.getName()),
				new FilePart(f.getName(), f) };
		filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost
				.getParams()));

		return filePost.execute(new HttpState(), connection);
	}
```

Ich hab das ganze mit einem eigenen Servlet gemacht, welches mir das File entgegen nimmt. Wenn das ganze über eine URL geht gibts sicher ein bisschen was zu ändern, aber es könnte dir trotzdem helfen


----------



## Ötzman (17. Dez 2007)

Hallo!

Ich beschäftige mich gerade mit dem von Niki angesprochenem Thema.

Ich möchte eine XML-Datei an ein Servlet senden und diese im Servlet bearbeiten.

Der Client und das Servlet laufen jedoch nicht auf einem Rechner. Die Verbindung läuft also über eine URL.

Wie muss ich da den Code von Niki modifizieren? Ich bin leider etwas unerfahren bei diesem Thema.

Und was mach ich auf Seiten des Servlets? Kommt das File auf den Request InputStream des Servlets und ich schreib das in ein Byte-Array?

Ich bin für jeden Hinweis dankbar! Gerne auch Links zum Thema!

mfg


----------



## Niki (17. Dez 2007)

Wenn du dich bis morgen geduldest kann ich den das notwendige Servlet posten. Benötigen tust du dafür die commons-io und commons-fileupload library!


----------



## Ötzman (17. Dez 2007)

Jo, kein Problem!

Die Libs finde ich schon, danke!


----------



## Niki (18. Dez 2007)

Hier der Code des Servlets:

```
protected void service(HttpServletRequest request, HttpServletResponse arg1)
			throws ServletException, IOException {
		File dir = getDir(request);
		RequestContext reqCon = new ServletRequestContext(request); 
		boolean isMultipart = ServletFileUpload.isMultipartContent(reqCon);

		if (isMultipart) {
			try {
				FileItemFactory factory = new DiskFileItemFactory();

				ServletFileUpload upload = new ServletFileUpload(factory);

				List<FileItem> items = upload.parseRequest(request);

				for (FileItem fi : items) {
					if (!fi.isFormField()) {
						byte[] b = fi.get();
						File newFile = Util.getUniqueFile(dir, fi.getName());
						store(newFile, b);
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();			
				throw new ServletException(ex);
			}
		}
	}

	private void store(File f, byte[] b) throws IOException {
		FileOutputStream fos = null;

		try {
			fos = new FileOutputStream(f);
			fos.write(b);
		} finally {
			if (fos != null) {
				fos.flush();
				fos.close();
			}
		}

		System.out.println(f.getCanonicalPath() + " saved");
	}

	private File getDir(HttpServletRequest request) {
		String s = request.getSession().getServletContext().getRealPath(
				"upload");
		File dir = new File(s);

		if (!dir.exists()) {
			dir.mkdirs();
		}

		return dir;
	}
```


----------



## Jourgenz (27. Mrz 2008)

Hi.
It's test. This site was probably down...


----------



## Sergeant_Pepper (18. Jun 2008)

Niki hat gesagt.:
			
		

> Hier der Code des Servlets:
> 
> ```
> File newFile = Util.getUniqueFile(dir, fi.getName());
> ```



Hallo,

aus welchem Paket kommt die Klasse "Util"?

Freundliche Grüße


----------



## Niki (18. Jun 2008)

Das ist eine eigene Klasse. Die Funktion liefert einfach ein eindeutiges File zurück. In etwa so:

```
public static synchronized File getUniqueFile(File dir, String name){
  int index = name.lastIndexOf(".");
  String praefix = null;
  String suffix = null;
  if(index > -1){
    praefix = name.substring(0, index);
    suffix = name.substring(index);
  } else {
    praefix = name;
    suffix = "";
  }

  File f = new File(dir, name);
  int i = 2;
  while(f.exists()){
    name = praefix + i + suffix;
    f = new File(dir, name);
  }
  return f;
}
```


----------



## Rookie123 (29. Jun 2008)

Hallo Leute!

Ich habe eine ähnliches Problem wie hier beschrieben. Ich möchte zwischen zwei HttpServlets XML-Daten per Http Post hin und her schicken. Es ist mein erstes Projket mit XML. Mit Servlets habe ich ein wenig Erfahrung, aber einen Datenaustausch habe ich noch nicht realisiert.

Was ich habe ist folgendes. Ich hole mir Daten aus einem HTML-Formular und schicke diese an ein Servlet um sie dort in eine XML Struktur zu bringen. Der Code der Klasse für die XML Erstellung sieht so aus:


```
import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import data.Bestelldaten;

public class MyXMLWriter {

	public Document createXMLDocument(Bestelldaten daten) {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("controlCard");

        Element element = root.addElement("State")
            .addText(daten.getStaat());
        
        element = root.addElement("Name")
        	.addText(daten.getBehoerde());
        
        element = root.addElement("Address")
        	.addText(daten.getAdresse());
        
        element = root.addElement("BodyName")
        	.addText(daten.getKontroll());
        
        element = root.addElement("BodyAddress")
        	.addText(daten.getAnschrift());
        
        element = root.addElement("PreferredLanguage")
        	.addText(daten.getSprache());

        return document;
    }
	
	public boolean writeXMLFile(Document doc) {
		
		try {
			// lets write to a file
			XMLWriter writer = new XMLWriter(
			    new FileWriter( "output.xml" )
			);
			writer.write( doc );
			writer.close();


			// Pretty print the document to System.out
			OutputFormat format = OutputFormat.createPrettyPrint();
			writer = new XMLWriter( System.out, format );
			writer.write( doc );

			// Compact format to System.out
			format = OutputFormat.createCompactFormat();
			writer = new XMLWriter( System.out, format );
			writer.write( doc );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}
}
```

Die Erzeugung funktioniert prima und auch das Schreiben auf meine HDD funktioniert. Was ich jedoch möchte ist, die XML Datei an ein Servlet per HTTP Post schicken. Und zwar möchte ich diese dazu vorher nicht auf HDD Speichern.

Wie macht man das denn so generell? Schickt man das "Document" Objekt rüber? Wandelt man das ganze in ein String um? Mir fehlt an dieser Stelle wohl ziemlich das Basis Wissen. 
Ich habe die Jakarte Libs ausprobiert und ein FileUpload hinbekommen, wo ich eine Datei von der HDD einlese und dann an ein Servlet schicke, aber so möchte ich es ja nicht machen.
Es wäre super, wenn mir jemand an dieser Stelle ein paar Hinweise geben kann.

Vielen Dank für eure Hilfe!


----------



## Niki (30. Jun 2008)

Die schönste Lösung wäre ein WebService, welches als Parameter das XML-Element bekommt. Das angenehme ist dass du dir einfach ein Interface definierst, welches die Schnittstelle für das WebService darstellt. Das Interface hat eine Methode welches ein Objekt übergeben bekommt. Dieses Objekt kann beliebige Daten enthalten. Aus diesem Interface kannst du dir dann die wsdl Datei generieren lassen. Diese beschreibt dein Service. Du brauchst dann nur noch das Service installieren und schon kannst du dir einen Client basteln der das ganze aufruft.
Ich hab meine WebServices bis jetzt immer mit axis/axis2 implementiert.


----------



## Rookie123 (30. Jun 2008)

Hi Niki,

das hört sich gut an. Ich hab mir das mit Axis mal angeschaut und würde das auch gerne machen, aber dafür fehlt mir die Zeit.

Ich möchte einfach nur die XML Datei übertragen.

Sollte ich dazu die Datei in einen String umwandeln und an den Request hängen?

Achso, danke vielmals für deine schnelle Antwort!


Gruß


----------

