Your SlideShare is downloading. ×
0
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Von Struts zu JSF
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Von Struts zu JSF

13,950

Published on

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,950
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Transcript

    • 1. Migration von Struts zu JSF (oder JSF für Struts Devs) Matthias Weßendorf Email: matzew@apache.org
    • 2. Matthias Weßendorf <ul><li>Oracle Corp. </li></ul><ul><ul><li>ADF Faces Entwicklung </li></ul></ul><ul><li>Apache Software Foundation </li></ul><ul><ul><li>Committer and PMC @ MyFaces &amp; Shale </li></ul></ul><ul><li>Autor </li></ul><ul><ul><li>Struts-Buch, WS-Buch, JavaMag. &amp; Eclipse Mag </li></ul></ul><ul><li>Redner </li></ul><ul><ul><li>JAX, WJAX, ApacheCon, Oracle Open World </li></ul></ul>
    • 3. Die Session ... <ul><li>Struts-Entwickler </li></ul><ul><ul><li>Ja </li></ul></ul><ul><li>Von Struts zu ?!? </li></ul><ul><ul><li>JA! </li></ul></ul><ul><li>JavaServer Faces-Entwickler </li></ul><ul><ul><li>Eher, nein  </li></ul></ul><ul><ul><ul><li>Kann trotzdem unterhaltsam sein... </li></ul></ul></ul>
    • 4. Agenda <ul><li>Hintergrund – MVC / Model 2 </li></ul><ul><li>Struts 1.x – ein Mini-Überblick </li></ul><ul><li>JavaSever Faces 1.x – ein Kurz-Überblick </li></ul><ul><li>Struts vs. JSF </li></ul><ul><ul><li>Überschneidungen / Unterschiede </li></ul></ul><ul><li>Migration </li></ul><ul><ul><li>Strategien </li></ul></ul><ul><ul><ul><li>Struts-Faces Bridge </li></ul></ul></ul><ul><ul><ul><li>Direkte Migration </li></ul></ul></ul><ul><li>Was ist Apache Shale ? </li></ul>
    • 5. Model – View - Controller <ul><li>Smalltalk-80 </li></ul><ul><li>Zusammenspiel von Entwurfsmustern </li></ul><ul><li>Bestandteile </li></ul><ul><ul><li>Model: persistente Daten  Fachkonzept </li></ul></ul><ul><ul><li>View: Benutzerschnittstelle  GUI-Schicht </li></ul></ul><ul><ul><li>Controller: Management der Anwendung </li></ul></ul><ul><li>Adaption für das Web  Model 2 (aka MVC2...) </li></ul>
    • 6. Model – View - Controller
    • 7. Model 2 Ansatz
    • 8. Apache Struts <ul><li>Open Source Produkt, Apache 2.0 </li></ul><ul><li>Implementiert Model 2 Ansatz </li></ul><ul><li>Aktuelle Version </li></ul><ul><ul><li>1.3.5  Bestandteil der Session </li></ul></ul><ul><ul><li>2.0 neuer Entwicklungszweig, Zusammenschluss mit WebWork </li></ul></ul><ul><ul><ul><li>auch JSF Support ... </li></ul></ul></ul><ul><li>De-facto Standard der Industrie! (Noch ...) </li></ul><ul><ul><li>137 „struts“ Jobs </li></ul></ul><ul><ul><li>41 „jsf“ jobs </li></ul></ul><ul><ul><li>Jobpilot 08.11.2006 (heute) </li></ul></ul>
    • 9. Apache Struts – Model 2 <ul><li>Model: </li></ul><ul><ul><li>Nicht definierter Teil von Struts! </li></ul></ul><ul><li>View: </li></ul><ul><ul><li>FormBeans/Validation </li></ul></ul><ul><ul><li>Taglib für JSP </li></ul></ul><ul><ul><li>Tiles für Templating </li></ul></ul><ul><ul><li>Support für Velocity, FreeMarker, ... </li></ul></ul><ul><li>Controller: </li></ul><ul><ul><li>ActionServlet / RequestProcessor (Framework) </li></ul></ul><ul><ul><li>Action / Command (1.3)  User / Entwickler </li></ul></ul>
    • 10. JavaServer Faces <ul><li>JCP basierter Standard für Web-Anwendungen </li></ul><ul><ul><li>Leichtgewichtiges Framework </li></ul></ul><ul><ul><li>API für Web-Komponenten </li></ul></ul><ul><li>Spezifizierung unter </li></ul><ul><ul><li>JSR 127  JavaServer Faces 1.0/1.1 (Mai 2004) </li></ul></ul><ul><ul><li>JSR 252  JavaServer Faces 1.2.x (Mai 2006) </li></ul></ul><ul><ul><ul><li>Java EE 5 Bestandteil </li></ul></ul></ul><ul><li>Ziel: </li></ul><ul><ul><li>Einfache Entwicklung von Java-Web-Anwendungen </li></ul></ul><ul><ul><li>Toolintegration / RAD </li></ul></ul><ul><ul><ul><li>Oracle JDeveloper, Sun Studio Creator, Eclipse WTP </li></ul></ul></ul><ul><li>Implementierungen </li></ul><ul><ul><li>Sun RI (CDDL  java.net) </li></ul></ul><ul><ul><li>Apache MyFaces (JSF 1.1  MyFaces 1.1.4) </li></ul></ul><ul><ul><li>IBM </li></ul></ul>
    • 11. MVC statt nur Model 2 <ul><li>Model: </li></ul><ul><ul><li>ManagedBeans / BackingBeans (POJOs) </li></ul></ul><ul><ul><ul><li>Dependency Injection (setter injection) </li></ul></ul></ul><ul><ul><li>javax.faces.model API </li></ul></ul><ul><li>View: </li></ul><ul><ul><li>UI-Komponenten </li></ul></ul><ul><ul><li>RenderKit </li></ul></ul><ul><ul><li>Konvertierung / Validierung </li></ul></ul><ul><ul><li>„ Templating“ mit f:subview und jsp:include ... </li></ul></ul><ul><li>Controller: </li></ul><ul><ul><li>Front-Controller: FacesServlet... (Framework) </li></ul></ul><ul><ul><li>ValueChangeListener, ActionListener, ActionMethod (User) </li></ul></ul>
    • 12. UI-Komponenten... <ul><li>Basisklassen </li></ul><ul><ul><li>UIComponent / UIComponentBase </li></ul></ul><ul><li>Generische Implementierungen </li></ul><ul><ul><li>UIOutput, UIInput, UICommand, ... </li></ul></ul><ul><li>HTML-spezifische Implementierungen </li></ul><ul><ul><li>HtmlForm, HtmlInputText, HtmlInputSecret, ... </li></ul></ul><ul><li>Renderer (RenderKit für HTML 4.0.1) </li></ul><ul><li>View-Technology </li></ul><ul><ul><li>JSP Taglib (default)  </li></ul></ul><ul><ul><li>Alternative: Facelets (später mehr!) </li></ul></ul><ul><ul><ul><li>XML oder Java ebenfalls möglich </li></ul></ul></ul>&lt;h:inputText id=&amp;quot;x&amp;quot; /&gt; &lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;form:x&amp;quot;/&gt;
    • 13. ...und Ereignisse! <ul><li>Events und Listener </li></ul><ul><ul><li>Standard JavaBean Namenskonventionen </li></ul></ul><ul><ul><ul><li>Foo: FooEvent  FooListener </li></ul></ul></ul><ul><li>FacesEvent </li></ul><ul><ul><li>ActionEvent, ValueChangeEvent </li></ul></ul>
    • 14. Konvertierung ... <ul><li>Datentyp in HTTP/HTML ist String </li></ul><ul><li>ManagedBeans: alles Datentypen möglich </li></ul><ul><ul><li>auch „Custom Objects“ </li></ul></ul><ul><li>Eingabewert =&gt; Objekt (getAsObject) </li></ul><ul><li>Ausgabewert &lt;= Objekt (getAsString) </li></ul><ul><li>i18n und l10n </li></ul><ul><li>Standard hat versch. Konverter: </li></ul><ul><ul><li>DateTimeConverter, NumberConverter, ... </li></ul></ul><ul><li>Eigene Konverter möglich ! </li></ul>
    • 15. ... und Validierung <ul><li>Validierung erfordert Konvertierung </li></ul><ul><li>Überprüft ob (konvertierter) Wert gültig ist (DateTimeRangeValidator (Trinidad)) </li></ul><ul><li>Validierung pro Komponente! </li></ul><ul><ul><li>Keine (default) per Bean Validierung </li></ul></ul><ul><li>JSF Standard ist begrenzt, aber </li></ul><ul><ul><li>eigene Validierungskomponenten möglich... </li></ul></ul><ul><ul><li>Apache MyFaces </li></ul></ul><ul><ul><ul><li>Tomahawk / Sandbox </li></ul></ul></ul><ul><ul><ul><li>Trinidad </li></ul></ul></ul>
    • 16. Ein einfaches Beispiel Hallo JSF-Welt
    • 17. JSF – Hello World (JSP Datei) <ul><li>&lt;%@ taglib uri=“http://java.sun.com/jsf/core“ prefix=“f“%&gt; </li></ul><ul><li>&lt;%@ taglib uri=“http://java.sun.com/jsf/html“ prefix=“h“%&gt; </li></ul><ul><li>&lt;f:view&gt; </li></ul><ul><li>&lt;h:form id=&amp;quot;form&amp;quot;&gt; </li></ul><ul><li>&lt;h:panelGrid columns=&amp;quot;2&amp;quot;&gt; </li></ul><ul><li>&lt;h:outputLabel for=&amp;quot;input1&amp;quot;&gt; </li></ul><ul><li>&lt;h:outputText id=&amp;quot;input1Label&amp;quot; value=&amp;quot;first name&amp;quot;/&gt; </li></ul><ul><li>&lt;/h:outputLabel&gt; </li></ul><ul><li>&lt;h:inputText id=&amp;quot; input1 &amp;quot; required=&amp;quot;true&amp;quot; </li></ul><ul><li>value=&amp;quot;#{ customer.firstname }&amp;quot;/&gt; </li></ul><ul><li> &lt;h:commandButton value=&amp;quot;send it!&amp;quot; </li></ul><ul><li>action=&amp;quot;#{ customer.send }&amp;quot;/&gt; </li></ul><ul><li>&lt;h:messages style=&amp;quot;color:red&amp;quot; layout=&amp;quot;table&amp;quot;/&gt; </li></ul><ul><li>&lt;/h:panelGrid&gt; </li></ul><ul><li>&lt;/h:form&gt; </li></ul><ul><li>&lt;/f:view&gt; </li></ul>
    • 18. JSF – Hello World (JavaBean) <ul><li>public class Customer { </li></ul><ul><li>private String firstname = null; </li></ul><ul><li>//getter and setter </li></ul><ul><li>public String send(){ </li></ul><ul><li>//back-end access (e.g. BusinessDelegate) </li></ul><ul><li>//diBusinessDelegate.doStuff(...); </li></ul><ul><li>return (“ ok &amp;quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    • 19. JSF – XML Config (1) <ul><li>&lt;managed-bean&gt; </li></ul><ul><li>&lt;managed-bean-name&gt;customer&lt;/managed-bean-name&gt; </li></ul><ul><li>&lt;managed-bean-class&gt; de.jax.session.faces.Customer &lt;/managed-bean-class&gt; </li></ul><ul><li>&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; &lt;managed-property&gt; </li></ul><ul><li>&lt;property-name&gt;firstname&lt;/property-name&gt; </li></ul><ul><li>&lt;value&gt;Matthias&lt;/value&gt; </li></ul><ul><li>&lt;!-- value&gt;#{bean.prop}&lt;/value--&gt; </li></ul><ul><li>&lt;/managed-property&gt; </li></ul><ul><li>&lt;/managed-bean&gt; </li></ul>
    • 20. JSF – XML Config (2) <ul><li>&lt;navigation-rule&gt; </li></ul><ul><li>&lt;from-view-id&gt;/form.jsp&lt;/from-view-id &gt; </li></ul><ul><li>&lt;navigation-case&gt; </li></ul><ul><li>&lt;from-action&gt; #{customer.send} &lt;/from-action&gt; </li></ul><ul><li>&lt;from-outcome&gt; ok &lt;/from-outcome&gt; </li></ul><ul><li>&lt;to-view-id&gt;/output.jsp&lt;/to-view-id&gt; </li></ul><ul><li>&lt;/navigation-case&gt; </li></ul><ul><li>&lt;/navigation-rule&gt; </li></ul>
    • 21. Ein einfaches Beispiel… Hallo JSF-Welt, einmal anders!
    • 22. JSF – Hello World (JSP Datei) <ul><li>&lt;%@ taglib uri=“http://java.sun.com/jsf/core“ prefix=“f“%&gt; </li></ul><ul><li>&lt;%@ taglib uri=“http://java.sun.com/jsf/html“ prefix=“h“%&gt; </li></ul><ul><li>&lt;f:view&gt; </li></ul><ul><li>&lt;h:form id=&amp;quot;form&amp;quot;&gt; </li></ul><ul><li>&lt;h:panelGrid binding=“#{customer2.panelGrid}” /&gt; </li></ul><ul><li>&lt;/h:form&gt; </li></ul><ul><li>&lt;/f:view&gt; </li></ul>
    • 23. JSF – Hello World (JavaBean) private HtmlPanelGrid panelGrid = new HtmlPanelGrid(); //getter/setter ... input = new HtmlInputText(); input.setId(&amp;quot;inputComp&amp;quot;); input.setRequired(true); panelGrid.getChildren().add(input); button = new HtmlCommandButton(); button.setValue(&amp;quot;Submit it!&amp;quot;); MethodBinding mb = FacesContext.getCurrentInstance().getApplication() .createMethodBinding(&amp;quot;#{customer2.send}&amp;quot;, new Class[0]); button.setAction( mb ); panelGrid.getChildren().add(button);
    • 24. JSF – Hello World (JavaBean) public String send() { HtmlInputText h = (HtmlInputText) panelGrid.findComponent(&amp;quot;inputComp&amp;quot;); HtmlOutputText hot = new HtmlOutputText(); hot.setValue(&amp;quot;Wurde geschickt: &amp;quot; + h.getValue()); panelGrid.getChildren().add(hot); return null; }
    • 25. JSF Component Tree UIViewRoot (f:view) HtmlForm (h:form) HtmlPanelGrid (h:panelGrid) HtmlCommandButton (h:commandButton) HtmlInputText (h:inputText) HtmlOutputText (h:outputText)
    • 26. JSF Component Tree UIViewRoot (f:view) HtmlForm (h:form) HtmlPanelGrid (h:panelGrid) HtmlCommandButton (h:commandButton) HtmlInputText (h:inputText) HtmlOutputText (h:outputText) HtmlOutputText (h:outputText) Panel.getChildren().add(hot)
    • 27. Uff! Zusammenfassung JSF <ul><li>JSP Datei </li></ul><ul><ul><li>Komponenten mit JSP Taglib einbinden </li></ul></ul><ul><ul><li>EL um Variablen und Methoden zu referenzieren </li></ul></ul><ul><li>BackingBean (Managed Bean) </li></ul><ul><ul><li>POJO </li></ul></ul><ul><ul><li>„ Konglomerat“ aus Action und ActionForm (Struts) </li></ul></ul><ul><ul><ul><li>Properties: Java-Types (value-binding) oder UIComponent (component-binding) </li></ul></ul></ul><ul><ul><ul><li>MethodBinding für „Action“ Methode </li></ul></ul></ul><ul><li>XML Konfiguration </li></ul><ul><ul><li>Bean Definition (Name, Klasse, Scope) </li></ul></ul><ul><ul><ul><li>Dependency Injection: optional mittles EL </li></ul></ul></ul><ul><ul><li>Navigationsregeln </li></ul></ul>
    • 28. Wie arbeitet JSF ? Was läuft ab ? Was macht Struts stattdessen ?
    • 29. JSF Request Lifecyle Process Events Restore View Apply Request Values Process Events Conversion and Validation Process events Update Model Invoke Application Process Events Render Response C L I E N T Response complete Response complete Response complete Faces request Faces response Render Response Conversion Errors Render Response Validation / Conversion Errors Render Response Response complete
    • 30. Struts RequestProcessor
    • 31. Struts vs. JSF (Konzepte) <ul><li>JSP Tags UI Components </li></ul><ul><li>Renderer </li></ul><ul><li>ActionServlet FacesServlet </li></ul><ul><li>RequestProcessor Lifecyle </li></ul><ul><li>Action action (String) </li></ul><ul><li>MethodExpression </li></ul><ul><li>ActionMessage FacesMessage </li></ul><ul><li>„ FormBean“ ManagedBean </li></ul><ul><li>- BackingBean </li></ul><ul><li>- ValueExpression </li></ul>
    • 32. Struts vs. JSF (Code) <ul><li>Action </li></ul><ul><ul><li>Arbeitet (oft) mit HttpRequest-Objekt </li></ul></ul><ul><ul><li>Benötigt Framework-API </li></ul></ul><ul><ul><ul><li>Action </li></ul></ul></ul><ul><ul><ul><ul><li>Hilfsklassen „DispatcherAction“ </li></ul></ul></ul></ul><ul><ul><ul><li>ActionForm </li></ul></ul></ul><ul><ul><li>Overhead (oft Superklasse(n)) </li></ul></ul><ul><ul><ul><li>Schaffung eines Frameworks innerhalb eines Frameworks </li></ul></ul></ul><ul><li>BackingBeans </li></ul><ul><ul><li>Einfache/Custom Properties </li></ul></ul><ul><ul><li>DAO per DI injezierbar </li></ul></ul><ul><ul><li>Simple Method für den Aufruf von Business-Logik </li></ul></ul>
    • 33. Eine Anwendung vor dem Wechsel... <ul><li>Szenario </li></ul><ul><ul><li>Anwendung muss erweitert werden </li></ul></ul><ul><ul><li>Anwendung soll gewartet werden </li></ul></ul><ul><ul><ul><li>Kleinere Änderungen </li></ul></ul></ul><ul><ul><ul><li>Größere Änderungen </li></ul></ul></ul><ul><ul><li>Anwendung soll in neuer Umgebung lauffähig gemacht werden </li></ul></ul><ul><ul><ul><li>Mobiles Internet (WML / WAP oder XHTMLmp) </li></ul></ul></ul><ul><ul><ul><ul><li>Apache Trinidad hat PDA Support! </li></ul></ul></ul></ul><ul><ul><ul><li>Telnet (Oracle ADF Faces) </li></ul></ul></ul>
    • 34. „ Migrations“-Strategien <ul><li>Strategien für eine von Struts zu Faces Migration </li></ul><ul><ul><li>1) Integration von JSF </li></ul></ul><ul><ul><ul><li>JSF für neue Entwicklung </li></ul></ul></ul><ul><ul><ul><li>Struts für altes </li></ul></ul></ul><ul><ul><ul><li> eine Anwendung, zwei Frameworks </li></ul></ul></ul><ul><ul><li>2) Step-by-Step (Struts-Faces) </li></ul></ul><ul><ul><ul><li>1) Web-Oberflächen / User Interfaces mit JSF </li></ul></ul></ul><ul><ul><ul><li>2) Java-Code der Struts-Anwendung überarbeiten </li></ul></ul></ul><ul><ul><li>3) Sanfte, aber vollständige Migration </li></ul></ul><ul><ul><ul><li>Zusammenhängende Teile überarbeiten </li></ul></ul></ul><ul><ul><li>4) Vollständiges überarbeiten der Web-Anwendung </li></ul></ul><ul><ul><ul><li>“ Aus Struts mach JSF“ </li></ul></ul></ul>
    • 35. Ein Beispiel Einfaches User-Portal mit Apache Struts
    • 36. Layout mit Tiles und Yahoo UI
    • 37. Struts-Formular
    • 38. Struts-Taglibs + Action
    • 39. Was nun ? <ul><li>Struts-Faces Integration Bridge </li></ul><ul><ul><li>User Interfaces mit JSF aufpeppen </li></ul></ul><ul><ul><li>Java Code bleibt Struts </li></ul></ul><ul><ul><li>Well... </li></ul></ul><ul><li>Faces/Struts Variante </li></ul><ul><ul><li>Faces für neue Feature </li></ul></ul><ul><ul><li>Zusammenhängende Struts-Teile nach Faces migrieren </li></ul></ul><ul><li>Vollständige Überarbeitung (Faces Variante) </li></ul><ul><ul><li>Vorgehen ähnlich wie bei Faces/Struts Variante </li></ul></ul><ul><ul><li>Benötigt Zeit... </li></ul></ul><ul><ul><li>(tiefes) Know-How an JSF notwending </li></ul></ul>
    • 40. Struts-Faces <ul><li>Von der Homepages des Struts-Faces-Projekts: </li></ul><ul><li>„ Note that the Struts Faces component is intended as a &amp;quot;bridge&amp;quot; between Struts 1 and JavaServer Faces. The typical use case is a team that would like to experiment with JSF components but does not want to completely rework an existing application.“ </li></ul>
    • 41. Struts-Faces <ul><li>Integration von Struts und Faces ! </li></ul><ul><ul><li>Ermöglicht Faces-JSPs mit Struts-Java ... </li></ul></ul><ul><li>Enthält </li></ul><ul><ul><li>UIForm-Komponente </li></ul></ul><ul><ul><ul><li>CommandLink (da seit 2004 Bug in der RI ...) </li></ul></ul></ul><ul><ul><li>RequestProcessor (FacesRP, FacesTilesRP) </li></ul></ul><ul><ul><li>ActionListenerImpl </li></ul></ul><ul><ul><li>ViewHandlerImpl </li></ul></ul><ul><li>Modifikation: </li></ul><ul><ul><li>JavaServer Pages </li></ul></ul><ul><ul><ul><li>Struts-Tags raus </li></ul></ul></ul><ul><ul><ul><li>Faces-Tags rein </li></ul></ul></ul>
    • 42. Migration mit Struts-Faces <ul><li>Vorbedingungen I: </li></ul><ul><ul><li>web.xml </li></ul></ul><ul><ul><ul><li>FacesServlet registrieren </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;load-on-startup&gt; 1 &lt;/load-on-startup&gt; </li></ul></ul></ul></ul><ul><ul><ul><li>ActionServlet </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;load-on-startup&gt; 2 &lt;/load-on-startup&gt; </li></ul></ul></ul></ul><ul><ul><li>struts-config.xml </li></ul></ul><ul><ul><ul><li>RequestProcessor austauschen </li></ul></ul></ul><ul><ul><li>tiles.xml </li></ul></ul><ul><ul><ul><li>&lt;definiton name=“.basis“ path=“/master .faces “&gt; </li></ul></ul></ul>
    • 43. Migration mit Struts-Faces <ul><li>Vorbedingungen II </li></ul><ul><ul><li>Tiles Layout (master.jsp) auf JSF umstellen </li></ul></ul><ul><ul><ul><li>JSF Taglibs in die Seite einbinden </li></ul></ul></ul><ul><ul><ul><li>JSF UIViewRoot: </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;f:view&gt; &lt;!-- Content der Layoutseite! --&gt; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&lt;/f:view&gt; </li></ul></ul></ul></ul><ul><ul><ul><li>Tiles: </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;f:subview id=“header“&gt; &lt;tiles:insert attribute=“header“ flush=“false“ /&gt; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&lt;/f:subview&gt; </li></ul></ul></ul></ul>
    • 44. Migration mit Struts-Faces <ul><li>Code </li></ul><ul><ul><li>Struts JSP mit Formular </li></ul></ul><ul><ul><li>Struts/Faces. Formular- und Eingabe-Komponenten mit JSF. Rest unverändert- </li></ul></ul><ul><ul><li>Ausführen  Oh wunder! </li></ul></ul><ul><ul><ul><li> Layout ebenfalls mit JSF </li></ul></ul></ul><ul><ul><li>Vollständige JSF Page. Kein HTML, alles JSF-Komponenten! </li></ul></ul><ul><ul><ul><li>Lauffähig! </li></ul></ul></ul>
    • 45. Migration mit Struts-Faces <ul><li>Code </li></ul><ul><ul><li>Struts JSP Taglibs (für Tabelle) und (Action)Link </li></ul></ul><ul><ul><li>Nicht mit Struts-Faces Lib lösbar! </li></ul></ul><ul><ul><ul><li>JSF Form renders: action=“/foo/bar.do“ </li></ul></ul></ul><ul><li>Struts durch JSF ersetzen (Step-by-Step) </li></ul><ul><ul><li>Neue JSF-basierte Seite für die Tabelle </li></ul></ul><ul><ul><ul><li>Ebenfalls neues Layout ... </li></ul></ul></ul><ul><ul><li>BackingBean für die neue Seite </li></ul></ul><ul><ul><ul><li>zum Laden der Daten </li></ul></ul></ul><ul><ul><ul><li>Zum Löschen der User </li></ul></ul></ul><ul><ul><li>JSF Seite nach Struts–Action anzeigen ? </li></ul></ul><ul><ul><ul><li>&lt;forward name=“success“ path=“ /jsfAlleUser.faces “ /&gt; </li></ul></ul></ul>
    • 46. Fazit Struts-Faces <ul><li>Einfache Teile der Anwendung portierbar </li></ul><ul><ul><li>Formular </li></ul></ul><ul><ul><ul><li>JSP mit JSF-Tags </li></ul></ul></ul><ul><ul><ul><li>Java mit Struts (ActionForm und Action) </li></ul></ul></ul><ul><ul><li>Komplexere Teile der Anwendung bereiten Probleme </li></ul></ul><ul><ul><ul><li>Tabelle mit Links, die eine Action ausführen. </li></ul></ul></ul><ul><ul><ul><li>Neu mit JSF ... Integration mit Struts möglich (&lt;forward /&gt;) </li></ul></ul></ul><ul><ul><ul><ul><li>Inkl. Layout für JavaServer Faces </li></ul></ul></ul></ul><ul><li>Wiederverwendung der gesamten Tiles Schicht </li></ul><ul><ul><li>Kleine Änderung an tiles.xml </li></ul></ul><ul><ul><li>Kleine Änderung an der Layout-Datei </li></ul></ul><ul><li>Fehler nur in Konsole ... Rendering wird abgebrochen </li></ul><ul><li>Interessant um mit JSF zu spielen ... ! </li></ul>
    • 47. Migration Struts/Faces <ul><li>Altbestandteil der Struts Anwendung </li></ul><ul><ul><li>Struts </li></ul></ul><ul><li>Neues der Anwendung </li></ul><ul><ul><li>JSF </li></ul></ul><ul><li>Migration von Struts zu JSF </li></ul><ul><ul><li>Zusammenhängendes „step-by-step“ mit Faces ersetzen </li></ul></ul><ul><li>Layout für JSF neu gestalten! </li></ul><ul><ul><li>Aber wie ? </li></ul></ul>
    • 48. JSF View Techniken <ul><li>JavaServer Pages (JSP) </li></ul><ul><ul><li>old school </li></ul></ul><ul><li>JSPX </li></ul><ul><ul><li>ok, aber kein Template Support </li></ul></ul><ul><li>JSP(X) + MyFaces Tiles Support </li></ul><ul><ul><li>Templates, works – but it can be better </li></ul></ul><ul><li>Facelets </li></ul><ul><ul><li>State of the art for JSF </li></ul></ul><ul><ul><li>Komponentenbaum in XHTML Files </li></ul></ul>
    • 49. Exkurs: Facelets <ul><li>Facelets = View Technologie für JSF </li></ul><ul><ul><li>https://facelets.dev.java.net/ </li></ul></ul><ul><ul><li>OpenSource CDDL 1.0 </li></ul></ul><ul><li>Vorteile gegen über JSP </li></ul><ul><ul><li>Performance, ca. 20 % schneller </li></ul></ul><ul><ul><li>Keine JSP Tags notwendig (weniger Code) </li></ul></ul><ul><ul><li>Template Support </li></ul></ul><ul><ul><li>UIComposition Support </li></ul></ul><ul><ul><li>Compile time EL Validation </li></ul></ul><ul><ul><li>Mix HTML und JSF, kein f:verbatim notwendig </li></ul></ul>
    • 50. Exkurs: Facelets (Konfiguration) <ul><li>ViewHandler in der faces-config.xml </li></ul><ul><li>&lt;faces-config&gt; </li></ul><ul><li>&lt;application&gt; </li></ul><ul><li>&lt;view-handler&gt; </li></ul><ul><li>com.sun.facelets.FaceletViewHandler </li></ul><ul><li>&lt;/view-handler&gt; </li></ul><ul><li>&lt;/application&gt; </li></ul><ul><li>&lt;/faces-config&gt; </li></ul>
    • 51. Exkurs: Facelets (Template) <ul><li>Template </li></ul><ul><ul><li>ui:insert ... Platzhalter der beim Rendern durch konkreten Inhalt ersetzt wird </li></ul></ul><ul><li>/template.xhtml </li></ul><ul><li>... </li></ul><ul><li>&lt;body&gt; </li></ul><ul><li>&lt;div id=“header“&gt; </li></ul><ul><li>&lt; ui:insert name=“ header “&gt;Header&lt;/ui:insert&gt; </li></ul><ul><li>&lt;/div&gt; </li></ul><ul><li>.... </li></ul>
    • 52. Exkurs: Facelets (Template) <ul><li>UIComposition </li></ul><ul><ul><li>ui:composition ... Definition einer konkreten Seite </li></ul></ul><ul><li>/welcome.xhtml </li></ul><ul><li>&lt; ui:composition template=&amp;quot;/template.xhtml&amp;quot;&gt; </li></ul><ul><li>&lt; ui:define name=„header&amp;quot;&gt; </li></ul><ul><li> &lt;h:outputText value=&amp;quot;Willkommen auf der WJAX!&amp;quot; /&gt; &lt;!-- ui:include src=“header.xhtml“ / --&gt; </li></ul><ul><li>&lt;/ui:define&gt; </li></ul><ul><li>&lt;/ui:composition&gt; </li></ul>
    • 53. Exkurs: Facelets (Template) <ul><li>Alles ausserhalb der Tree Komposition wird nicht gerendert </li></ul><ul><li>&lt;!DOCTYPE ...&gt; </li></ul><ul><li>&lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; ...&gt; </li></ul><ul><li>... </li></ul><ul><li>&lt;ui:composition template=&amp;quot;/template.xhtml&amp;quot;&gt; </li></ul><ul><li>Roter Text wird nicht gerendert </li></ul><ul><li>&lt;ui:define&gt; ...&lt;/ui:define&gt; </li></ul><ul><li>Roter Text wird nicht gerendert </li></ul><ul><li>&lt;/ui:composition&gt; </li></ul>
    • 54. Migration Struts/Faces <ul><li>Vorbedingungen I: </li></ul><ul><ul><li>web.xml </li></ul></ul><ul><ul><ul><li>FacesServlet registrieren </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;load-on-startup&gt; 1 &lt;/load-on-startup&gt; </li></ul></ul></ul></ul><ul><ul><ul><li>ActionServlet </li></ul></ul></ul><ul><ul><ul><ul><li>&lt;load-on-startup&gt; 2 &lt;/load-on-startup&gt; </li></ul></ul></ul></ul><ul><ul><ul><li>Facelets Konfiguration </li></ul></ul></ul><ul><ul><ul><ul><li>javax.faces.DEFAULT_SUFFIX .xhtml </li></ul></ul></ul></ul><ul><ul><ul><ul><li>„ Taglib“ für Tomahawk </li></ul></ul></ul></ul><ul><ul><li>faces-config.xml (web.xml für Trinidad / Ajax4JSF) </li></ul></ul><ul><ul><ul><li>ViewHandler austauschen </li></ul></ul></ul>
    • 55. Migration Struts/Faces <ul><li>Code </li></ul><ul><ul><li>Erstellen eine Facelets Layouts </li></ul></ul><ul><ul><ul><li>„ Migration von Tiles zu Facelets“ </li></ul></ul></ul><ul><ul><li>Struts durch JSF/Facelets ersetzen </li></ul></ul><ul><ul><ul><li>JSF-Tags, HTML-Mix </li></ul></ul></ul><ul><ul><ul><li>BackingBean für die neue Seite </li></ul></ul></ul><ul><ul><ul><ul><li>zum Laden der Daten </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Zum Löschen der User </li></ul></ul></ul></ul><ul><ul><ul><li>Weniger Code als mit Struts </li></ul></ul></ul><ul><ul><ul><ul><li>Kein direkter Zugriff auf HTTP-Objekte </li></ul></ul></ul></ul><ul><ul><li>JSF Seite nach Struts–Action anzeigen ? </li></ul></ul><ul><ul><ul><li>&lt;forward name=“success“ path=“ /jsfAlleUser.faces “ /&gt; </li></ul></ul></ul>
    • 56. Migration Struts/Faces <ul><li>Code </li></ul><ul><ul><li>Vergleich von JSF und Struts </li></ul></ul><ul><ul><ul><li>BackingBean </li></ul></ul></ul><ul><ul><ul><li>ActionForm </li></ul></ul></ul><ul><ul><ul><li>Action </li></ul></ul></ul><ul><ul><li>Struts oft “work arounds“ für JSF Feature </li></ul></ul><ul><ul><ul><li>Siehe ActionForm des Beispiels </li></ul></ul></ul>
    • 57. Fazit Migration Struts/Faces <ul><li>Saubere, getrennte Lösungen </li></ul><ul><ul><li>Struts </li></ul></ul><ul><ul><li>JSF mit Facelets </li></ul></ul><ul><li>Beide Frameworks integrierbar </li></ul><ul><ul><li>FacesServlet </li></ul></ul><ul><ul><li>ActionServlet </li></ul></ul><ul><li>Getrennte Verantwortung </li></ul><ul><ul><li>Struts linkt auf JSF weiter (&lt;forward /&gt;) </li></ul></ul><ul><ul><li>Faces linkt auf Struts Actions (&lt;a href=“ foo.do “&gt;) </li></ul></ul><ul><li>Langsames Herantasten möglich </li></ul><ul><ul><li>Kein Zwang alles zu migrieren (wie Spring) </li></ul></ul>
    • 58. JSF is DRY! <ul><li>Naja, </li></ul><ul><ul><li>&lt;h:column&gt; </li></ul></ul><ul><ul><li>&lt;f:facet name=„header&gt; </li></ul></ul><ul><ul><li> &lt;h:outputText value=„Strasse“ /&gt; </li></ul></ul><ul><ul><li>&lt;/f:facet&gt; </li></ul></ul><ul><ul><li>&lt;h:outputText value=„#{bean.porp}“ /&gt; </li></ul></ul><ul><ul><li>&lt;/h:column&gt; </li></ul></ul><ul><li>Oder mit Facelets: </li></ul><ul><ul><li>&lt;wjax:column header=„Strasse“ value=„#{bean.prop}“ </li></ul></ul>
    • 59. Was ist Apache Shale ? <ul><li>Ehemals Subproject von Struts </li></ul><ul><li>TLP der ASF </li></ul><ul><li>Keine! Beziehung zu Struts </li></ul><ul><li>Extensions für JavaServer Faces: </li></ul><ul><ul><li>ViewController </li></ul></ul><ul><ul><li>Dialog Framework (braucht XML) </li></ul></ul><ul><ul><li>Test-Framework (Mock + JMock) </li></ul></ul><ul><ul><li>Remote für Ajax Support </li></ul></ul><ul><ul><li>Clay Plugin (Alternative zu Facelets) </li></ul></ul>
    • 60. Ausblick: Was geht mit JSF ? <ul><li>Wachsende Begeisterung seitens der Java-Web-Community </li></ul><ul><ul><li>Apache (MyFaces, Shale, Beehive, ...) </li></ul></ul><ul><ul><li>java.net (RI, jMaki, Facelets, Ajax4JSF) </li></ul></ul><ul><li>Komponenten Bibliotheken </li></ul><ul><ul><li>MyFaces (Tomahawk, Sandbox, Trinidad, Tobago) </li></ul></ul><ul><ul><li>IceFaces (kommerziell / Community Edition) </li></ul></ul><ul><li>Tools vorhanden </li></ul><ul><ul><li>Eclipse </li></ul></ul><ul><ul><li>Oracle JDeveloper </li></ul></ul>
    • 61. Gestern Struts, heute JSF, morgen ? <ul><li>Ist JSF ein „sicheres“ Investment ? </li></ul><ul><ul><li>JCP Standard, Support durch Tools und die Open Source Community (Eclipse, Apache) </li></ul></ul><ul><li>Kann JSF auch Ajax? </li></ul><ul><ul><li>Ja! </li></ul></ul><ul><li>Was kommt nach Ajax ? </li></ul><ul><ul><li>Keine Ahnung!  </li></ul></ul><ul><ul><ul><li>Dank RenderKits egal... </li></ul></ul></ul><ul><li>Wie sieht die nächste Version von JSF aus? </li></ul><ul><ul><li>JSF 6 wird grundlegend neu... </li></ul></ul><ul><ul><li>Mai 2008 ? Java EE 6 Bestandteil ... </li></ul></ul>
    • 62. Fazit der Session <ul><li>Kleinere Wartung mit Struts 1.x </li></ul><ul><ul><li>Know-How, stabil </li></ul></ul><ul><li>Überarbeitung von Funktionalität </li></ul><ul><ul><li>Nach Faces migrieren </li></ul></ul><ul><li>Neues auf JSF </li></ul><ul><ul><li>State of the art Framework / Component-API </li></ul></ul><ul><ul><ul><li>Facelets </li></ul></ul></ul><ul><ul><ul><li>Shale </li></ul></ul></ul><ul><ul><ul><li>Spring Support </li></ul></ul></ul><ul><li>Tools/Komponenten für JSF erhältlich </li></ul>
    • 63. Support für MyFaces/JSF <ul><li>Apache MyFaces </li></ul><ul><ul><li>Homepage: http://myfaces.apache.org </li></ul></ul><ul><ul><li>Wiki: http://wiki.apache.org/myfaces </li></ul></ul><ul><li>JSF Central </li></ul><ul><ul><li>Artikel und Resourcen rund um JSF </li></ul></ul><ul><ul><li>http://www.jsfcentral. com </li></ul></ul><ul><li>Firma Irian </li></ul><ul><ul><li>Kommerziellen Support für JavaServer Faces und Apache MyFaces </li></ul></ul><ul><ul><li>http://www.irian.at (Demos zu MyFaces/Trinidad online) </li></ul></ul>
    • 64. Q&amp;A ? Danke! Email: [email_address] Slides / Demos ?

    ×