# JavaEE Backend < > HTML Frontend ( Frameworks )



## Chris81T (22. Feb 2012)

Hallo,

ich hoffe, ich schreibe hier ins richtige Forum (ansonsten bitte verschieben, danke). Wie soll ich beginnen: Ich arbeite im JavaEE Umfeld und Techniken wie JSF (Umsetzung mittels XHTML) sind mir bekannt. 

Nun würde ich gerne mit HTML(5) WebContent bereitstellen (typische Webseiten mit vielen Besuchern / keine gezielte Web- Anwendung für vereinzelnde Anwender), welche über EJB's (Services - Businessschicht) ihren Inhalt beziehen (Beispiel: Weblog = Die konkreten Artikel / Kategoriendaten usw. werden in einer DB gehalten, mittels JPA angesprochen und über die Businessschicht bereitgestellt).

Nun hab ich das Direct Web Remoting ( DWR ) Framework gefunden, welches über JavaScript Java- Klassen ansprechen kann. Zum Beispiel dann Delegate Klassen, welche mittels eines lookup's Zugriff auf die Service- EJB's bekommen. Nun ist sowas bestimmt nicht Ziel der Sache, dass der eigentliche Inhalt (Artikelübersichten/inhalte usw) erst nachträglich vom Client via JS geladen werden. Solche Sachen sollten schon im HTML statisch/serverseitig vorhanden sein. Ich habe schon mal eine Teststellung umgesetzt, die außerdem auch bei noch nicht viel Inhalt zeigt, dass die Seite merkbar sich so nach und nach aufbaut (ich hätte eher gedacht, dass das erst mit aufwendigeren Ereignissen / viel dynamischen Inhalt eintritt) und sich nicht "aus einem Guss" anfühlt.

Auch kommt hinzu, dass es Komponenten gibt, die auf vielen HTML Seiten identisch sind (zB header, footer). Nach dem DRY Prinzip wünscht man sich eine Möglichkeit, HTML Fragmente zu includieren. Es gibt zum Einem die Server-Side-Includes (sind schon was ältere Techniken?!) und Client-Side-Includes. Da ich nichts passendes zu SSI gefunden habe, hab ich mit jQuery ( load() ) eine Lösung gefunden, um HTML Fragmente in das eigentliche HTML Dokument zu integrieren.

Also wäre hier nun ein Web- Framework a'la Ruby on Rails, Django (Python) eher sinnvoll. Da es ja jRuby und Jython gibt, könnte eine Anbindung zwischen einem solchen Framework und der JavaEE Welt (JNDI lookup auf eine EJB) möglich sein?! Hat das jemand schon einmal gemacht (oder Ähnliches)?

Vielleicht kennt einer von euch Frameworks, welche mit Java direkt kommunizieren können (ansonsten wären WebServices eine weitere Möglichkeit) und HTML Content behandeln können, Templating Mechanismen beherrschen.

Pseudo Code Beispiel für ein event. Framework:

```
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>HTML Page</title>
 </head>
 <body>
  {% include html header fragment %}

  <div>
   some information's...
  </div>
  
  <section>
   {% call some script function, which provides html content by using EJB services / server-side %}   
  </section>
  
  <div id="nav">
   <a href="...">
   ....
  </div>
 </body>
```

Alle weiteren Sachen könnten dann mittels HTML5 / JavaSript / jQuery clientseitig gelöst werden ( Effekte, GUI Validierung, komplexere Komponenten (zB. DatePicker) )

Falls jemand Erfahrungen mit einer solchen Thematik, bzw. Tipps hat und/oder solche Frameworks kennt, bitte antworten ;-)

Vielen Dank!!

PS: Mir ist klar, dass man für einen Weblog nicht einen JavaEE AppServer benötigt und das einfacher lösen kann, es geht mir nur um ein Beispiel um zu prüfen, was es für Möglichkeiten gibt.


----------



## Guardi (25. Feb 2012)

WebServices sind doch hier am Naheliegendsten und sind auch ziemlich einfach zu implementieren.


----------



## schalentier (25. Feb 2012)

Ich wuerd sagen, REST ist hier das passende Stichwort. Jede Ressource deiner Anwendung (also letzlich jedes Businessobjekt) bekommt eine definitierte URL, ueber die man auf die Ressource per HTTP zugreifen oder sie veraendern kann (GET, PUT, POST, DELETE). Den Datenaustausch koennte man sinnigerweise mittels JSON realisieren, das kann man super auf dem Client mit JS/jQuery weiterverarbeiten.

Was JEE hier konkret bietet weiss ich nicht. Mit Ruby (on Rails oder Rack) geht das natuerlich super. Mit jRuby kannst duch auch EJB benutzen, nur macht das imho nicht wirklich viel Sinn (hoechstens wenn man einen Wrapper fuer eine EJB Legacy App bauen will). 

Bedenken sollte man in jedem Fall, dass durch so eine Architektur der Server tendenziell (deutlich) mehr Request bearbeiten muss, die allerdings weniger Daten zurueckliefern. Dafuer kannst du den gesamten statischen Content direkt von einem z.B. Lighttp sauschnell senden. 

Grad im Umfeld von Ruby bietet sich ein solches Verfahren aber an, da dort die allermeiste Performance fuer das Zusammenbauen der HTML-Views drauf geht.


----------



## Chris81T (26. Feb 2012)

schalentier hat gesagt.:


> Ich wuerd sagen, REST ist hier das passende Stichwort. Jede Ressource deiner Anwendung (also letzlich jedes Businessobjekt) bekommt eine definitierte URL, ueber die man auf die Ressource per HTTP zugreifen oder sie veraendern kann (GET, PUT, POST, DELETE). Den Datenaustausch koennte man sinnigerweise mittels JSON realisieren, das kann man super auf dem Client mit JS/jQuery weiterverarbeiten.
> 
> Was JEE hier konkret bietet weiss ich nicht. Mit Ruby (on Rails oder Rack) geht das natuerlich super. Mit jRuby kannst duch auch EJB benutzen, nur macht das imho nicht wirklich viel Sinn (hoechstens wenn man einen Wrapper fuer eine EJB Legacy App bauen will).
> 
> ...



Vielen Dank für die Antwort!

Lighttpd kannte ich noch gar nicht. Ich darf mal zusammenfassen um zu schauen, ob ich es richtig verstanden habe:

( Ich greif das Blog-Beispiel nochmal auf ) Du würdest keine EJB in der Business-Schicht zur Verfügung stellen, sondern die Kommunikation zum Frontend mit REST aufsetzen ( letztendlich sind das auch @WebServices, die für die Businessfunktionen umgesetzt werden ?!?! - habe mit REST keine Erfahrung. Muss ich mir mal anlesen ). Das Backend / Business mit dem WebService läuft zB. auf dem JavaEE AppServer.
Nun würdest du einen weiteren Server Lighttp einsetzen, welcher die eigentlichen Client-Anfragen (n Benutzer, welche auf den Blog zugreifen) übernimmt. Dieser ist mit nem Web Framework (zB Rails) gekoppelt, welcher sich um den dynamischen HTML Content kümmert; letztendlich sollten die Inhalte für Artikel schon serverseitig ins HTML includiert werden.
Oder hattest du das eher so gemeint, dass der Client die HTML Seite lädt, darin dann erst mit JS/jQuery die Anfragen an die REST-Business-Schicht gemacht werden, um zB. den Übersichtsinhalt von Blog-Artikeln zu laden? Aber eigentlich ist es doch besser, den konkreten Inhalt ( auch welcher aus zB ner DB kommt ) schon für den Client "statisch" im HTML zu haben.

...

Mir fehlt einfach noch was "Wissen" zu REST. Ist dieses Konzept denn eine gängige Herangehensweise? Auch ausgelegt für Massenzugriffe? ( ich habe mich im Frontend-Bereich vorrangig durch die Arbeit mit JSF gekoppelt mit einem aufsetzenden Framework (ICEFaces, Primefaces...) beschäftigt, welches sich teils schon "schwer" serverlastig anfühlt. Also für Unternehmensinterne Webapplikationen voll in Ordnung, aber für die Masse... )

Anders gesagt. Ich habe ein gesetztes JavaEE Backend/Businesslogik Enterprise Application. Nun suche ich die beste Vorgehensweise ein professionelles Frontend (geeignetes Framework) aufzusetzen (ggf. durch einen weiteren Server wie der genannte Lighttp), was für den öffentlichen Massenzugriff angedacht ist.

Man merkt, ich habe da noch einige ? stehen. Deshalb freue ich mich sehr über Antworten und Anregungen. Es gibt halt viele verschiedene Techniken, die man sich aber nicht alle auch aus zeitlichen Gründen tiefgehends anschauen kann. Deswegen ist es schon gut, durch Erfahrungen anderer ein paar Vorschläge zu erhalten, wo man dann selbst gezielter weiterschauen kann...


----------



## schalentier (26. Feb 2012)

Ich glaube mit meiner Antwort hab ich eher Verwirrung gestiftet.

Zunaechst mal ist mir noch bisschen unklar, was du eigentlich vorhast. Normalerweise wuerde ich sagen, entscheide dich fuer eine Plattform/Technologie und nutz die komplett (bei JEE wahrs. JSF oder so - aber in diesem Umfeld kenn ich mich nicht besonders gut aus). Das Mischen verschiedener Frameworks, auch noch in verschiedenen Sprachen entwickelt, wuerd ich nicht empfehlen. Sowas kann man evtl. machen, wenn man alle Technologien ordentlich beherrscht und entsprechende Erfahrungen gesammelt hat - um sich aus allen die jeweiligen Vorteile rauszupicken. Das ist aber alles andre als trivial.

Lighttp ist uebrigens ein kleiner aber superschneller Webserver, zum Ausliefern von statischem Content (Bilder, statisches HTML, JavaScript-Libraries, etc). Der hat nix mit dynamischem Zeug zu tun. 

Ich seh zwei potentielle Wege:
1. "klassisch": Dein Server sendet zu einer HTTP Anfrage ein komplettes HTML zum Client. Serverseitig haste dann sinnigerweise ein Backend (z.B. EJB) und ein Frontend (z.B. JSF). Ein Request holt sich dann die benoetigten Daten aus dem Backend und steckt sie ins Frontend, woraus dann HTML generiert wird, was zum Client geschickt wird. Dieses HTML ist dynamisch, weil der Server das fuer jeden Request neu zusammenbauen muss. 

2. REST, Web2.0, AJAX (nenns wie du willst): Die HTTP Anfrage wird von einem vorgeschalteten Server mit einer statischen HTML Seite und viel JavaScript beantwortet. Im Browser am Client laed das JavaScript nun per AJAX/jQuery die eigentlichen Inhalte der Seite und baut sie in das statische HTML ein. 

Natuerlich koennen beide Wege beliebig miteinander kombiniert werden (was die Programmierung aber nicht unbedingt vereinfacht). Mit Weg 2 spart man Rechenpower auf der Serverseite, da viel Arbeit einfach zum Client verlagert wird. 

---

Deine eigentliche Frage kann man mit den gegebenen Informationen nicht wirklich sinnvoll beantworten.  Im Zweifel wuerd ich zuerst mal ein paar Lasttests gegen die vorhandene Architektur fahren, um zu sehen wo es wirklich hakt. Vielleicht reichts dann aber auch, fuer den oeffentlichen Massenzugriff fertig vorgerenderte (dann statische) HTML Seiten auszuliefern? Das koennte dann ein normaler Apache (oder eben Lighttp) uebernehmen. Das nennt man uebrigens Caching. Bei JEE/JSF bin ich mal wieder ueberfragt, bei Ruby on Rails ist das ziemlich schick und einfach geloest (man schreibt an die HTML Views (oder Teile) nur dran, "bitte cache das bis dann-und-dann"). 

Von wievielen Zugriffen reden wir eigentlich? Und wie oft aendert sich eine HTML Seite? Ist da viel dynamisches Zeug drauf? Was genau ist fest vorgegeben und wo kannst du ueberhaupt dran drehen?


----------



## Chris81T (27. Feb 2012)

Hallo schalentier,



> Zunaechst mal ist mir noch bisschen unklar, was du eigentlich vorhast. Normalerweise wuerde ich sagen, entscheide dich fuer eine Plattform/Technologie und nutz die komplett (bei JEE wahrs. JSF oder so - aber in diesem Umfeld kenn ich mich nicht besonders gut aus). Das Mischen verschiedener Frameworks, auch noch in verschiedenen Sprachen entwickelt, wuerd ich nicht empfehlen. Sowas kann man evtl. machen, wenn man alle Technologien ordentlich beherrscht und entsprechende Erfahrungen gesammelt hat - um sich aus allen die jeweiligen Vorteile rauszupicken. Das ist aber alles andre als trivial.


Generell bin ich aktuell nur am recherchieren, was für Techniken möglich sind. Was habe ich (in nah-ferner) Zukunft vor: Wahrscheinlich eine öffentliche Website/Portal erstellen, welche für die Masse zur Verfügung stehen soll. Dabei wird es nicht nur um stupide Speichern von erstellten Artikeln oder so gehen. Dafür könnte man auch einfach ein CMS nehmen...  Da ich ich mich im JavaEE  Umfeld heimisch fühle, ist das ganz klar mein gesetztes Framework für's Backend. Ja, du hast recht, es ist im EE Umfeld aktuell JSF2.0. Ich sehe dieses Framework nicht ganz für diese Aufgabe (setzen es im Unternehmen für firmeninterne Applikationen ein, wofür es ok ist). Ich denke, da gibt es bessere Technologien, bzw. versuche es herauszufinden (event. irre ich mich auch). Gestern bin ich zufällig auf ein Video aufmerksam gemacht worden, indem James Gosling selbst nicht wirklich positiv über JSF redet. Quelle: James Gosling on Apple, Apache, Google, Oracle and the Future of Java - YouTube
Nun gut, die Techniken sollen ja nicht ineinander verzahnt sein/werden, sondern die eine Frontend-Technik soll die bereitgestellten Funktionen der anderen Backend-Technik nutzen. Wenn dies sauber umgesetzt ist, sehe ich erst einmal nicht so gravierende Probleme, bzw. es würde sich bei einem Prototypen zeigen. 

Bevor ich RoR mir näher anschaue, werde ich erstmal mir Grails anschauen. Gehen ja ca. den gleichen Weg, setzen aber Groovy ein, welche ja eh für die JVM vorgesehen ist.

Es wird sich zeigen...


----------



## JanHH (29. Feb 2012)

So rein aus Neugierde, was unterscheidet Deine Anwendung denn von einer "ganz normalen" JEE-Webanwendung, wo man eine solche Seite samt Inhalt problemlos mit JSF realisieren kann? Für mich klingt das alles ganz normal..

Hab ansonsten grad selber was implementiert wo per jsf/ajax ein Servlet einen Request bekommt und daraufhin ein Objekt in JSON-Form zurückliefert, welches der Client dann auswertet (und in unserem Fall in google api-Charts verwandelt). Sowas vielleicht?


----------



## DerFeivel (1. Mrz 2012)

Wenn ich deinen Eingangpost richtig verstehe, hast du 2-3 'Probleme':


Problem 1:

         Du suchst ein Templating-Framework, um häufig verwendete HTML-Konstrukte möglichst nur an einer Stelle pflegen zu müssen.

Problem 2:

         Du benötigst ein Framework/Technologien, um Daten aus deinen EJB dynamisch in deine HTML-Seiten einzubauen.

Problem 3:

         Du benötigst ein Framework/Technologien, um Daten dynamisch nachzuladen.



Die Probleme 1 & 2 lassen sich relativ elegant überApache Velocity lösen. Hierbei handelt es sich um eine Template-Engine, mit der Java-Objekte über Platzhalter in beliebigen Textdateien (also auch HTML) bekannt gemacht werden können.


Problem 3 klingt dann nach einem klassischen Fall für Ajax+Rest


----------



## Chris81T (2. Mrz 2012)

Sorry,

habe gerade erst jetzt eure Antworten gelesen. Apache Velocity kannte ich auch noch nicht. Laut den News-Einträgen tut sich da aber auch nicht mehr viel. Letzter News Eintrag ist von 2010.

Vielen Dank euch allen!


----------



## JanHH (4. Mrz 2012)

Was ist denn jetzt eigentlich das, was Deine anwendung von einer "ganz normalen" JSF-Webanwendung unterscheidet?


----------



## krazun (8. Mrz 2012)

Chris81T hat gesagt.:


> Sorry,
> 
> habe gerade erst jetzt eure Antworten gelesen. Apache Velocity kannte ich auch noch nicht. Laut den News-Einträgen tut sich da aber auch nicht mehr viel. Letzter News Eintrag ist von 2010.
> 
> Vielen Dank euch allen!



Ich würde die FreeMarker template engine empfehlen. Ziemlich aktuell: 29 Feb 2012: FreeMarker 2.3.19 was released

und eine kleine Übersicht warum FreeMarker besser ist als Velocity: FreeMarker: Java Template Engine Library - FreeMarker vs. Velocity

Oder mach es einfach mit ganz normalen JavaEE 6 Techniken und migriere später auf JavaEE 7. Dort soll HTML5 nämlich eine große Rolle spielen.

grüße,
krazun


----------

