# HTML Frontend für *.jar Programm das ständig auf Server laufen muss.



## Want more (6. Dezember 2013)

Hallo Community,

ich baue zur Zeit eine Anwendung für eine Anlagenautomatisierung in Java, welche lediglich per HTML Webseite (kein Applet) sondern maximal JSP bedient werden soll.
Ich habe bereits rudimentär alle Erfordernisse zu dem Tool erfüllt, und kann auch eine Webseite von der Klasse generieren lassen und mit "Live" Informationen füttern. Hierbei bin ich aber nun an meine Grenzen gestoßen und weiß mir leider auch nicht mehr mit Google zu helfen, da ich vermutlich nach den falschen Sachen suche.

Die HTML Seite die vom Java HttpServer ausgeliefert wird, soll JSP Elemente enthalten Buttons, Textfelder, Checkboxen), auf deren Ereignisse mein Programm reagieren soll, ich weiß leider nicht wie.

Bei den JSP's habe ich das immer mit einem Tomcat Server gelöst, nur weiß ich leider auch nicht wie man von JVM's unter Tomcat auf ein Programm innerhalb einer anderen JVM Instanz zugreift, bzw. kommuniziert, daher mein Ansatz mit dem integrierten Webserver.
Ist es unter Tomcat evtl. möglich mein Programm direkt vom Tomcat Start aus mit zu starten und dann den Seitenaufbau erst bei bedarf vornehmen zu lassen? und wenn ja wie baue ich die JSP Erzeugung dann in mein Programm ein ?

Weiterhin habe ich den sehr unschönen "dirty Hack" verwandt, das die erzeugte Webseite sich jede Sekunde selbst Neuladen muss um vom laufenden Java Programm die aktuellen Inhalte zu bekommen, dass müsste doch auch viel eleganter zu lösen sein.

Hat hier schonmal jemand soetwas gemacht und kann mir ein paar neue Anhaltspunkte liefern ? ICh könnte mir vorstellen das es direkt mit nem Tomcat gehen müsste, aber wie ich das mache weiß ich absolut nicht.

Gruß Want more 2 Know


----------



## benhaze (6. Januar 2014)

Was beduetet MAXIMAL JSP?

Ich vermute es geht dir mehr darum das dein *Programm* (oder evtl. besser *Frontend*) vollständig im (fast jedem) Browser lauffähig ist, ohne
das *Java* auf dem Client erforderlich ist.
Oder?!

Ganz ohne _JavaScript_ wirst du wohl nicht auskommen um eine _elegante_ Lösung zu bekommen.
Spontan fällt mir da so was wie Server-Push ein....in kombi mit JQuery z.B...

(Oder schau dir mal sowas wie Vaadin an, klappt auch wunderbar mit dem Tomcat)

EDIT:
Habe deinen Beitrag nochmal gelesen.
Offensichtlich ist dein Programm gar nicht als (Tomcat) Web-Application implementiert.
Du könntest dein Programm mit z.B Apache CXF um einen Application-Container (und Webserver) erweitern.
Das ist ziemlich einfach.
Statt Tomcat wird aber Jetty genutzt. Der funktioniert aber sehr ähnlich.
Dann kann dein Programm auch als Server fungieren und du brauchst keinen zus. Tomcat.
Dann würde auch alles in einer JVM laufen...


----------



## Want more (7. Januar 2014)

Hi und Danke für deine Antworten.

Ja, das hast Du richtig erkannt. Das Frontend soll auf allen Platformen lauffähig sein. Das ist der Punkt warum ich lediglich JSP zum Einsatz bringen will. Mitlerweile befürchte ich, so wie Du mir das ebenfalls nochmal bestätigt hast, dies nicht ohne andere Sprachen oder inhalte realisieren zu können. Naja, da muss ich dann später mal sehen wie ich das mache.

Nun zu meinem weit aus größeren Problem.
Ganz zu Beginn, meiner Arbeit habe ich mit Vaadin gestartet und ein Programm aus dem Netz gezogen. Leider kommt es da zu einer Exception jedesmal wenn ich die Webseite zum zweiten mal aufrufe (unabhängig ob gleicher, oder anderer Client).

Den Code habe ich von hier.
http://iqjar.com/jar/controlling-the-raspberry-pis-gpio-pins-from-a-web-browser/

Soweit ich das Problem analysieren konnte, besteht es darin, dass beim Öffnen des Browsers einer der GPIO-Pins initialisiert wird und beim schließen nicht wieder freigegeben wird. 
Wenn man nun das Browserfenster erneut öffnet, bzw. der GPIO Pin erneut erzeugt werden soll, wird von der JVM dies unterbunden, da die ressource bereits verwendet wird.
Ich habe dies aufgelöst indem ich die Ressourcen logischerweise immer beim beenden der Browser session freigegeben wird, es funktioniert auch aber das ist nicht was ich brauche... Mein Program auf dem Server sieht vor, das es mit den GPIO's permanent arbeiten kann und soll... Browser geöffnet oder nicht.
Daher habe ich Vaadin hier nicht weiter verfolgt, zunächst jedenfalls.
Ich habe zwischenzeitlich herausgefunden, dass es eine init() Methode geben muss in der man *.jars als Ressource der Anwendung zur Verfügung stellen kann, aber wie blieb das große Fragezeichen.

Selben Stand habe ich bei Jetty. Ich habe auch gelesen das dies gehen muss aber wie man es im einzelnen anstellt und die Fragen die sich daraus ergeben -> Fehlanzeige.
Wo müsste der permanent lauffähige Code liegen, wie muss dieser initialisiert werden und wie bekomme ich von diesen Threads die Informationen um meine JSP's mit Daten zu füttern, wenn der Bedarf da ist?

Hast Du darin Erfahrung ?


----------



## benhaze (8. Januar 2014)

Ist es möglich zuvor zu prüfen ob der GPIO-Pin bereits initialisiert wurde, bevor du ihn _nochmal _initialisierst?

Irgendwie sowas wie:

```
GpioController gpioController = GpioFactory.getInstance();
if (!gpioController.isInitialized() /*oder ähnlich*/)
{
   gpioController.provisionDigitalOutputPin(...)
}
```


----------



## Improof (13. Januar 2014)

Hi,

womöglich viel zu spät, da du ja schon ein fertiges Programm hast, aber für die Zukunft (und um es allgemein mal zu erwähnen) kann ich nur das Google Web Toolkit für solche Zwecke empfehlen.

Du programmierst rein in Java und gibst dem GWT-Compiler an, welche packages im "client" (also Browser) ausgeführt werden sollen. Dieser Java-Code wird dann in JavaScript "geparst".

Das ganze kannst dann auch in einem Jetty-Server laufen lassen. Also nur auf dem Server Java, auf dem Client nur ein Browser benötigt.

Ob ich jetzt helfen konnte bezweifle ich zwar, aber wie gesagt, ich wollte das nur mal erwähnen 

MfG
Daniel


----------



## Henn22 (11. Februar 2015)

Hallo zusammen,

der Thread ist zwar schon etwas älter, aber ich habe ein ähnliches Problem.
Ich möchte Vaadin für die Benutzerinteraktion, also die GUI benutzen. Im Hintergrund laufen aber teils komplizierte berechnungen (können mehrere Stunden dauern), daher ist es notwendig, dass die Anwendung eine Funktion auf dem Server ausführt. 

Das sieht ca so aus:
Benutzer stellt parameter ein -> Benutzer drückt start -> GUI meldet meiner Serverapplication, dass ein Algorithmus ausgeführt werden soll -> Diese läuft dauerhaft und sagt "oke hab grade Zeit" -> Benutzer bekommt angezeigt wie weit der Fortschritt ist, kann aber auch andere Dinge in der Zeit machen.

Nach meiner Recherche brauche ich dafür einen Websever, auf dem die UI Application mit Vaadin läuft und einen Applicationserver, auf dem meine dauerhaft laufende Anwendung läuft, die dann mittels JavaBeans kommunizieren. Gerne würde ich das umgehen und der Beitrag :

"Du könntest dein Programm mit z.B Apache CXF um einen Application-Container (und Webserver) erweitern.
Das ist ziemlich einfach.
Statt Tomcat wird aber Jetty genutzt. Der funktioniert aber sehr ähnlich.
Dann kann dein Programm auch als Server fungieren und du brauchst keinen zus. Tomcat.
Dann würde auch alles in einer JVM laufen..."

gab mir etwas Hoffung. Ist es möglich Apache CFX (oder etwas anderes) in meine Anwendung zu implementieren und den ganzen Server über eine Java-Anwendung laufen zu lassen?

Vielen Dank schonmal für eure Antworten.

LG!


----------

