Java Daten vom Browser an Java Applikation übergeben

gugus999

Ensign
Registriert
Aug. 2004
Beiträge
216
Ich bin auf der Suche nach Techniken, mit denen man Daten vom Browser an eine bereits geöffnete Java Applikation übermitteln kann. Es werden lediglich ein paar wenige Parameter sein. Am ehesten scheint mir, dass mir da Javascript weiterhelfen könnte.

Was für Tipps habt ihr dazu?
 
Soweit ich weiß ist das, aus Sicherheitsgründen, nicht ohne weiteres möglich. Was genau willst du denn übergeben und öffnen? Vielleicht würde dir ein Java-Applet weiterhelfen oder du schreibst ein entsprechendes Browser-Plugin.
 
Ja das mit der Sicherheit könnte ein Problem sein, aber vielleicht gibts ja Wege ;)

Ok, ich beschreibe es noch etwas genauer, was die Idee ist. Es gibt eine bestehende Java Applikation, die einen recht grossen Umfang an Funktionen hat und sich die Daten von einem Applikationsserver holt. Nun ist die Idee, dass man vom Browser her, Daten (es werden ein paar Werte zum Suchen sein) an die Java Applikation übergibt, die dann mit den übergebenen Werten, die Daten anzeigt (nachdem die Java Applikation sich die Daten vom Applikationsserver geholt hat).
 
Wenn die Java-App sich ohnehin Daten vom Server holen muss, dann trigger das Update über den Browser und der Server pusht die Daten dann an die Java App, wenn das technisch machbar ist.

Ansonsten würde ich für die Java-App einen lokalen Service starten, den die Web-App mittels AJAX ansprechen kann.
 
neuere Browser unterstützen web sockets, da könntest dann eine Verbdinung mit dem Java Programm oder dem Server aufnehmen. Wobei ich die lösung die daten aus dem browser vom Server direkt für das Programm zur verfügung stellen zu lassen am sinnvollsten halte.

Alternativ kannst ja auch die Seite mit dem java Programm aufrufen und die parameter parsen.

Eine weitere möglichkeit wäre sicherlich nen plugin für den browser zu schreiben.

Geht auch noch extremer, mit der robot klasse vo Java auf den Browser zugreifen und die Parameter auslesen, aber das ist wohl doch ein wenig overkilled.

Vlt. könnte man die ganze ausgabe aber auch in ein Applet packen und das kommuniziert dann mit deinem java prog.

Als letze möglichkeit daten vom browser lokal zu speichern würden mir jetzt Cookies einfallen. Sind ja bloße Text datein auf der Festplatte, die dein Programm in der Lage sein müsste auszulesen.
 
Ersteinmal vielen Dank für die Tips.

Wie schon erwähnt, kann man mit JavaScript nicht so einfach einen anderen Port geschweige denn einen anderen Server ansteuern. Deshalb habe ich mich vorerst mal für eine "einfache" und möglichst Browserunabhängige Variante entschieden. Dazu habe ich beim Client ein mini Webserver eingepflanzt (NanoHTTPD, falls wer noch auf der Suche nach einem Mini Webserver ist) und rufe vom Browser her mittels GET oder POST diesen auf. Somit klappt zumindest mal der Aufruf vom Browser her und die Daten kommen auch an. Die Weiterverarbeitung kriege ich dann auch noch hin.

Auf Plugins irgendwelcher Art versuche ich vorerst noch zu verzichten.
 
gugus999 schrieb:
Wie schon erwähnt, kann man mit JavaScript nicht so einfach einen anderen Port geschweige denn einen anderen Server ansteuern.

Doch, das ist mittlerweile möglich. Allerdings unterstützen das noch nicht alle Browser. WebSockets ist das Stichwort (was schon genannt wurde).

gugus999 schrieb:
Deshalb habe ich mich vorerst mal für eine "einfache" und möglichst Browserunabhängige Variante entschieden. Dazu habe ich beim Client ein mini Webserver eingepflanzt (NanoHTTPD, falls wer noch auf der Suche nach einem Mini Webserver ist) und rufe vom Browser her mittels GET oder POST diesen auf.

Seit Version 6 bringt Java schon alles mit, um solch eine Schnittstelle zu implementieren. Ein eigener Web-Server funktioniert natürlich auch. Ist halt wieder eine Abhängigkeit mehr.

http://weblogs.java.net/blog/vivekp/archive/2006/12/webservices_in.html
 
Ja Websockets entfallen derzeit noch - leider (nicht alle eingesetzten Browser unterstützen dies nativ).

Aber das mit dem Webserver muss ich mir anschauen. Bin auch nicht zwingend Freund von vielen Abhängigkeiten.
 
Heho,

die lösung in den Java Client den server zu basteln ist nicht schlecht, aber ich habe mitsoetwas schon schlechte erfahrung gesammelt.

Wenn jetzt jemand deinen Cliente nutzt kann es schnell passieren das der von außen gar nicht ereichbar ist weil der router / firewall den zugang sperren.

Kannst du das nicht so machen das der eigentliche Server von dem der client die daten abholt die daten vom browser empfängt und und anschließend zum Java Clienten pusht oder zumindest beim nächsten sync bereitstellt?
 
Es geht hier ja bloß um lokale Kommunikation. Die wird normalerweise nicht unterbunden. Aus Sicherheitsgründen sollten gar keine anderen Anfragen verarbeitet werden.

Am Server was zu ändern, wird schwieriger sein, als dem Client ein weiteres Feature hinzufügen.
 
Mit der Connectivity sollte es hoffentlich keine Probleme geben, da die Verbindung nur jeweils Lokal (Browser - Client) auf dem selben PC stattfindet.

Der direkte Serveraufruf ist um Grössenordnungen komplizierter.
 
gugus999 schrieb:
Aber das mit dem Webserver muss ich mir anschauen. Bin auch nicht zwingend Freund von vielen Abhängigkeiten.

Die Runtime-Lösung ist allerdings etwas komplexer, von daher wäre NanoHTTP vermutlich die einfachste Lösung. Zumal der Prototyp ja schon läuft. Zu wissen, dass Java sowas mittlerweile bereits offiziell mitliefert, könnte in Zukunft trotzdem helfen.
 
Hi!
Sagt dir das Java Network Launch Protocol etwas?
Eine Möglichkeit wäre, in deiner Java Anwendung einen SingleInstanceListener einzubauen.
Der sorgt für 2 Sachen:
1. Ist die Anwendung beim ersten Aufruf der JNLP noch nicht gestartet, so wird sie gestartet und als SingleInstanceService registriert. Ist die Anwendung bereits gestartet und man will sie nochmal über die JNLP öffnen, wird in die bereits bestehende Instanz verzweigt.
2. Beim Verzweigen in die bereits bestehende Instanz kann man Argumente mit übergeben, ergo könnte deine HTML Seite für die Generierung der JNLP Datei sorgen und die Argumente mit reinschreiben und somit kommen die dann in deiner Anwendung an.

Für Detailfragen einfach PN an mich.

Greets
 
Ja, der Name sagt mir was. Wenns mir recht ist, wird der jetzige Client sogar mit JNLP initialisiert, der dann, nachdem die nötigen Jars geladen wurden, den eigentlichen Client startet. Den SingleInstanceListener muss ich mal ausprobieren.
 
Hi, hier mal ein kurzer Abriss wie man das Implementieren kann.

1. Der SingleInstanceListener:

Code:
public class SingleInstanceAdapter implements SingleInstanceListener {

	private static final SingleInstanceAdapter INSTANCE = new SingleInstanceAdapter();

	private SingleInstanceService service;

	private SingleInstanceAdapter() {
		super();
		try {
			service =
				(SingleInstanceService)ServiceManager
					.lookup("javax.jnlp.SingleInstanceService");
			service.addSingleInstanceListener(this);
		}
		catch (UnavailableServiceException e) {
			service = null;
		}
	}

	public static SingleInstanceAdapter getInstance() {
		return INSTANCE;
	}

	public void newActivation(String[] arg0) {
		// Hier dann die vom Browser übergebenen Argumente parsen und in die Anwendung weitergeben
	}

}

2. Das Initialisieren in deiner Anwendung:

Code:
public class YourApplication {

	public static void main(String[] args) {
		//SingleInstanceAdapter initialisieren
		SingleInstanceAdapter.getInstance();
	}

}

Greetings
 
Zurück
Oben