JBoss Seam
Transcrição
JBoss Seam
JBoss Seam Seam – oder wie Nähe ich ein Java EE Patchwork Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim JAX Reloaded www.oio.de [email protected] Papick Garcia Taboada Software Architekt Technologie-Scout Beratung Projekte Training JBoss Seam © 2007 Orientation in Objects GmbH 2 1 Serge Ndong Entwickler Berater Trainer JBoss Seam © 2007 Orientation in Objects GmbH 3 © 2007 Orientation in Objects GmbH 4 Gliederung • Was ist Seam? • Wie funktioniert Seam? • Fazit? JBoss Seam 2 Webapp in 15 min? Keynote W-JAX 2006 Tim Bray, Director of Web Technologies (Sun) JBoss Seam © 2007 Orientation in Objects GmbH 5 Endlich ein Webapp Framework • Framework zur Erstellung von Enterprise Java Webapplikationen • ein mächtiges Framework, um moderne Web 2.0 Anwendungen [sehr einfach] zu bauen JBoss Seam © 2007 Orientation in Objects GmbH 6 3 JBoss™ ??? • Ist JBoss Seam eine proprietäre Lösung? – JBoss Seam ist Open Source – JBoss Seam ist mit anderen JBoss Produkten verzahnt – Aus Seam ist das JSR 299 entstanden: “WebBeans” – erster JSR unter der Leitung von JBoss JBoss Seam © 2007 Orientation in Objects GmbH 7 Lückenfüller? • schließt eine wichtige Lücke in der Architektur von Java EE 5 – vereint EJB 3.0 und Java Server Faces (JSF) in einem einzigen Programmiermodell – kein „Schichten Glue Code“ mehr nötig, Programmierzeit wird gespart JBoss Seam © 2007 Orientation in Objects GmbH 8 4 Wie leichtgewichtig ist es? • dank Java EE 5 leichtgewichtigeren Ansatz JBoss Seam © 2007 Orientation in Objects GmbH 9 Wie leichtgewichtig ist es? • EJB 3 Applikationen können in Web-Container laufen – EJB 3 Applikationen können in TestNG laufen – Seam auch mit JavaBeans und Hibernate einsetzbar • JBoss Seam mit JBoss Embeddable Container © 2007 Orientation in Objects GmbH 10 5 Geschichte • Versionen – – – – – – – – – – 1.2.1 Produktion seit 1.2.0 Produktion 1.1.6 Produktion 1.1.5 Produktion 1.1.1 Produktion 1.1.0 Produktion 1.1.0 BETA 1 1.0.1 Produktion 1.0.0 Produktion 1. Beta JBoss Seam 27.03.2007 27.02.2007 08.02.2007 01.02.2007 18.01.2007 13.12.2006 24.10.2006 18.06.2006 11.06.2006 18.09.2005 Lead durch Gavin King (Hibernate) © 2007 Orientation in Objects GmbH 11 EJB-zentrische Entwicklung • EJBs auch im Frontend • EJB Komponenten sind annotierte POJOs • Aufhebung der Schichtentrennung – Keine Facade, Business Delegate und Transfer Objects mehr • Schichten lediglich im Objektmodell abgebildet JBoss Seam © 2007 Orientation in Objects GmbH 12 6 AJAX-basiertes Remoting • Webclient hat direkten Zugriff auf EJB Session Beans • Bereitstellung von EJB-Komponenten als JavaScript Proxy-Objekte • Webclients können JMS Nachrichten empfangen – Nach wie vor experimental JBoss Seam © 2007 Orientation in Objects GmbH 13 Prozessgetriebene Applikationen • eigene Business Processing Management Engine (jBPM) für die Implementierung von Workflows und Pageflows JBoss Seam © 2007 Orientation in Objects GmbH 14 7 Testbarkeit++ • POJOs sind einfach zu testen • Umfangreiche Testmöglichkeiten (mit TestNG) – z.B : Nachbilden einer Interaktion mit einem Benutzer des Systems JBoss Seam © 2007 Orientation in Objects GmbH 15 Zustandsbehaftete Applikationen • Seam definiert zwei weitere Kontexte – Conversation Scope: entspricht einem kurzfristigen Dialog – Business Process Scope: entspricht einem langlebigen Dialog über mehrere Sitzungen. JBoss Seam © 2007 Orientation in Objects GmbH 16 8 Bijection • steht für „bidirectional injection“ oder injection und outjection • Erweiterung des Grundgedankens „Dependency Injection“ JBoss Seam © 2007 Orientation in Objects GmbH 17 „Nähkästchen“ JSP EJB3 Facelets Portlet Presentation Tier JSF Request Controller Seam Context Manager JBoss jBPM Hibernate State Management Java EE 5 JBoss Seam © 2007 Orientation in Objects GmbH 18 9 EJB3 und mehr… • JSF als Frontend-Technologie – + einige Erweiterungen – Facelets – aktuell Myfaces, • ICEFaces und Ajax4JSF • Richfaces? • JBoss jBPM (Java Business Process Management) • JBoss Rules (Rules Engine) JBoss Seam © 2007 Orientation in Objects GmbH 19 Facelets? • Aus der JBoss Seam FAQ, leider nicht mehr online: – What view templating technologies can I use? – You can use any templating technology that support JSF. In practice, this probably means Facelets (if you take our advice) or JSP (for masochists). JBoss Seam © 2007 Orientation in Objects GmbH 20 10 Gliederung • Was ist Seam? • Wie funktioniert Seam? • Fazit? JBoss Seam © 2007 Orientation in Objects GmbH 21 Neues Komponentenmodell? • wichtig: Seam hat kein eigenes Komponentenmodell – Seam stimmt die Java EE Komponenten aufeinander ab! – sobald Seam die Komponenten kennt, werden die Brücken geschlagen JBoss Seam © 2007 Orientation in Objects GmbH 22 11 Seam Komponentenmodell? • Seam Komponenten werden mit Kontext Variablen mittels @Name bzw. @Role definiert • mittels der Annotation @Scope kann man Seam Komponenten einem Scope zuweisen JBoss Seam © 2007 Orientation in Objects GmbH 23 Bijection • Dependency Injection im Kontext • Komponenten in grösseren Scopes können auf Komponenten in kleineren Scopes verweisen/ verlinken • Bijection ist – dynamisch, – kontextbezogen und – biderektional JBoss Seam © 2007 Orientation in Objects GmbH 24 12 Magic? user SomeInstance JBoss Seam © 2007 Orientation in Objects GmbH 25 Magic? SomeInstance SomeOtherInstance Some scope Seam magic JBoss Seam The user instance © 2007 Orientation in Objects GmbH 26 13 Magic? SomeInstance SomeOtherInstance Some scope Seam magic JBoss Seam The user instance © 2007 Orientation in Objects GmbH 27 @In … • Bijection durch annotation – an Attribut oder Getter- und Setter-Methoden • @In wird eine "dependency injection" vermerkt JBoss Seam © 2007 Orientation in Objects GmbH 28 14 … and @Out • @Out wird die Instanzvariable in die Seam Laufzeitumgebung angemeldet – Outjected… JBoss Seam © 2007 Orientation in Objects GmbH 29 © 2007 Orientation in Objects GmbH 30 Bijection @Stateful @Name(“changeUserPassWord") public class ChangeUserPassWord{ @PersistenceContext private EntityManager em; @In @Out private User user; ... } JBoss Seam 15 Bijection • Möglichkeit Expression Language-Syntax in den Annotations zu verwenden @Name("loginAction") public class LoginAction implements Login { @In("#{user.username}") String username; ... } JBoss Seam © 2007 Orientation in Objects GmbH 31 Servlet API Scopes • Die Servlet API stellt lediglich den – Request, – Session und – Applikation Scope zur Verfügung. JBoss Seam © 2007 Orientation in Objects GmbH 32 16 Nicht akzeptabler Zustand… • Request und Session Scopes nicht ausreichend für die Entwicklung von Anwendungen – kleinere Sitzungen müssen durch den Entwickler verwaltet werden – Dialoge fehlen in der JSF Spezifikation • Struts Shale bietet Implementierungen an… JBoss Seam © 2007 Orientation in Objects GmbH 33 © 2007 Orientation in Objects GmbH 34 Seam Kontexte • bisher bekannte Kontexte – Stateless Context – Event Context – Page Context – Session Context – Application Context JBoss Seam 17 Neu: Conversation Context • ein Dialog ist ein „Unit of Work“ • Anfang und Ende eines Dialoges werden durch annotierte Methoden definiert • Speicherort für Dialogspezifische Informationen • Konversationen können verschachtelt sein JBoss Seam © 2007 Orientation in Objects GmbH 35 Da guck! • Mit Seam-Beispielen Kopfschmerzenfrei loslegen und staunen… • Das Seam Hotelreservierungsbeispiel… – http://localhost:8080/seam-booking/ JBoss Seam © 2007 Orientation in Objects GmbH 36 18 Neu: Business Process Context • beschreibt ein Dialog das über die Lebenszeit einer Sitzung hinaus dauern kann • jBPM Engine ist für das Management und das Speichern der Sitzungsdaten verantwortlich JBoss Seam © 2007 Orientation in Objects GmbH 37 Anfang und Ende • Dialog Beginn und Ende werden durch Annotationen gekennzeichnet – Bei einer Conversation: • @Begin • @End – Bei einem Business Process: • @BeginTask • @EndTask JBoss Seam © 2007 Orientation in Objects GmbH 38 19 Übliche Seam Kontexte JBoss Seam Servlet/JSP Stateless Context J EE 5 Page Context JBoss jBPM Conversation Context Session Context Application Process Context Business Process Context JBoss Seam © 2007 Orientation in Objects GmbH 39 Komponententypen und die Scopes • Stateful Session Bean – default ist Conversation scope • Stateless Session Bean – default ist Stateless scope • Entity Bean – default ist Conversation scope • Java Bean EJB3: Configuration by exception! – default ist Event scope JBoss Seam © 2007 Orientation in Objects GmbH 40 20 Navigation • JSF Navigation nicht ausreichend… • Wunschliste – Navigation grafisch gestalten – Seitenfluss verbindlich vorgeben – Navigation wie bisher deskriptiv, Engine soll die Arbeit übernehmen JBoss Seam © 2007 Orientation in Objects GmbH 41 © 2007 Orientation in Objects GmbH 42 Grafische Pageflow Definition JBoss Seam 21 XML Pageflow Definition <pageflow-definition name="numberGuess"> <start-page name="displayGuess" view-id="/numberGuess.jsp"> <redirect/> <transition name="guess" to="evaluateGuess"> <action expression="#{numberGuess.guess}" /> </transition> </start-page> <decision name="evaluateGuess" expression="#{numberGuess.correctGuess}"> <transition name="true" to="win"/> <transition name="false" to="evaluateRemainingGuesses"/> </decision> <decision name="evaluateRemainingGuesses" expression="#{numberGuess.lastGuess}"> <transition name="true" to="lose"/> <transition name="false" to="displayGuess"/> </decision> <page name="win" view-id="/win.jsp"> <redirect/> <end-conversation /> </page> <page name="lose" view-id="/lose.jsp"> <redirect/> <end-conversation /> </page> </pageflow-definition> JBoss Seam © 2007 Orientation in Objects GmbH 43 Pageflow Einbindung @Name("numberGuess") @Scope(ScopeType.CONVERSATION) public class NumberGuess { (…) @Begin(pageflow="numberGuess") public void begin() { randomNumber = new Random().nextInt(100); guessCount = 0; biggest = 100; smallest = 1; } JBoss Seam © 2007 Orientation in Objects GmbH 44 22 Grafische Business Prozess Definition JBoss Seam © 2007 Orientation in Objects GmbH 45 XML jBPM Process Definition <process-definition name="todo"> <start-state name="start"> <transition to="todo"/> </start-state> <task-node name="todo"> <task name="todo"description="#{todoList.description}"> <assignment actor-id="#{actor.id}"/> </task> <transition to="done"/> </task-node> <end-state name="done"/> </process-definition> JBoss Seam © 2007 Orientation in Objects GmbH 46 23 Business Process Einbindung @Name("todoList") public class TodoList { private String description; public String getDescription(){ return description; } public void setDescription(String description) { this.description = description; } @CreateProcess(definition="todo“) public void createTodo() {} @StartTask @EndTask public void done() {} } JBoss Seam © 2007 Orientation in Objects GmbH 47 Architekturschichten Goodbye? @Stateless @Name("register") public class RegisterAction implements Register { @In(create=true) private EntityManager em; public String register(String username) { List existing = em.createQuery("select username from User where username=:username") .setParameter("username", username).getResultList(); if (existing.size()==0){ em.persist(user); return "/registered.jsp"; } } } JBoss Seam © 2007 Orientation in Objects GmbH 48 24 Stateless Session Bean im Frontend <h:commandButton type="submit" value="Register" action="#{register.register}"/> @Stateless @Name("register") public class RegisterAction implements Register { public String register(String username) { (…) } } JBoss Seam © 2007 Orientation in Objects GmbH 49 © 2007 Orientation in Objects GmbH 50 Validierung auf Entitäten definieren @Entity public class User { @Id @GeneratedValue private Long id; @NotNull private String firstname; @Length(max=25) @NotNull private String lastname; @Length(max=200) private String description; (...) JBoss Seam 25 Validierung im Frontend einschalten <f:form> <table> <s:validateAll> <tr><td>Vorname</td> <td><h:inputText value=“#{user.firstname}”/></td> </tr> <tr><td>Nachname</td> <td><h:inputText value=“#{user.lastname}”/></td> </tr> <tr><td>Beschreibung</td> <td><h:inputText value=“#{user.description}”/></td> </tr> </s:validateAll> </table> <h:messages/> <h:commandButton type="submit" value=“Save„ action="#{user.save}"/> </f:form> JBoss Seam © 2007 Orientation in Objects GmbH 51 Seam Remoting • JavaScript Proxies werden dynamisch zur Laufzeit generiert und dem Client mittels ein Servlet zu Verfügung gestellt • JavaScript- Entwickler können ohne technische Klimmzüge direkt auf die Proxy Objekte zugreifen • Webclients können JMS Nachrichten empfangen JBoss Seam © 2007 Orientation in Objects GmbH 52 26 Seam Remoting: Stateless Seam Komponente @Stateless @Name(“userFinder”) public class UserFinderBean implements UserFinder { @In PersistenceContext em; public List<User> find(String searchString) { return em.createQuery(“from User where firstname like :search”) .setParameter(“search”, searchString) .getResultList(); } } JBoss Seam © 2007 Orientation in Objects GmbH 53 Seam Remoting: Local Interface @Local public interface UserFinder { @WebRemote List<User> find(String searchString); } JBoss Seam © 2007 Orientation in Objects GmbH 54 27 Seam Remoting: Frontend <div> <input type=“text” id=“searchString”/> <input type=“submit” value=“Search” onclick=“doSearch(); return false;”/> </div> <div> <table id=“results”> <!– Suchergebnis anzeigen --> </table> </div> JBoss Seam © 2007 Orientation in Objects GmbH 55 Zugriff auf Session Bean function doSearch() { var searchString = document.getElementById(“searchString”).value; var userFinder = Seam.Component.getInstance(“userFinder”); userFinder.find(searchString, displayResults); } function displayResults(docs) { (...) } JBoss Seam © 2007 Orientation in Objects GmbH 56 28 Wie? <servlet> <servlet-name>Seam Remoting</servlet-name> <servlet-class> org.jboss.seam.remoting.SeamRemotingServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>Seam Remoting</servlet-name> <url-pattern>/seam/remoting/*</url-pattern> </servlet-mapping> JBoss Seam © 2007 Orientation in Objects GmbH 57 Transaktionen und Cache • Seam verschiebt die Transaktionsgrenzen vom EJB Programmiermodell auf die Seam Komponenten – bessere Reaktion auf die Besonderheiten einer Webanwendung JBoss Seam © 2007 Orientation in Objects GmbH 58 29 Transaktionen und Cache • Seam verwendet einen erweiterten Persistenzkontext, der einen ganzen Dialog-Kontext umfasst – Dadurch sind die Komponenten auch nach einem RequestResponse-Zyklus ansprechbar – kein LazyInitializationException mehr JBoss Seam © 2007 Orientation in Objects GmbH 59 Transaktionen und Cache • Seam verwendet zwei Transaktionskontexte in einem ResponseRequest-Zyklus – Der erste umfasst das Update des Models und die Applikationslogik – der zweite umfasst das Rendern der Ausgabe. JBoss Seam © 2007 Orientation in Objects GmbH 60 30 Seam Dialoge und der Cache • Seam nutzt den Dialog-Kontext als intelligente Cache Lösung – der Anwendungsentwickler muss nicht mehr stets sein SessionKontext aufräumen – alle benötigten Daten sind im richtigen Kontext gespeichert und werden nach Beenden des Dialoges aus dem Speicher entfernt – keine kontextlosen Second-Level-Caches – Höhere Hitrate! JBoss Seam © 2007 Orientation in Objects GmbH 61 © 2007 Orientation in Objects GmbH 62 Gliederung • Was ist Seam? • Wie funktioniert Seam? • Fazit? JBoss Seam 31 Respekt.. Keynote W-JAX 2006 Tim Bray, Director of Web Technologies (Sun) JBoss Seam © 2007 Orientation in Objects GmbH 63 © 2007 Orientation in Objects GmbH 64 Finden wir es gut? • Klares „Jain“ ;-) JBoss Seam 32 Genauer? • ☺ Vereinheitlichung des Programmiermodells • ☺ JSF mit Dialoge (Struts Shale?) • ☺ Remoting (nicht wirklich neu?) • ☺ Weniger Konfigurationsaufwand JBoss Seam © 2007 Orientation in Objects GmbH 65 Genauer? • „One size fit all“ Architektur – Vereinfachungen umstritten • „All in one package, take it or leave it“ – JBPM – JBoss Rules • Wenig Erweiterungsmöglichkeiten JBoss Seam © 2007 Orientation in Objects GmbH 66 33 Noch Zeit für Bonusmaterial? • Die Spring Integration! JBoss Seam © 2007 Orientation in Objects GmbH 67 Spring Framework Integration • Direkt from Seam! • Ermöglicht eine einfache Migration von Spring basierte Projekten in Seam • JSF Erweiterungen wie Dialogkontexte für Spring-Anwendungen JBoss Seam © 2007 Orientation in Objects GmbH 68 34 Was geht? • Spring beans können Abhängigkeiten zu Seam Komponenten definieren • Seam Komponenten können Abhängigkeiten zu Spring Komponenten definieren • Spring Komponenten in Seam Komponenten umwandeln • Spring Komponenten können Seam Kontexte zugeordnet werden JBoss Seam © 2007 Orientation in Objects GmbH 69 Wie geht’s? <beans xmlns="http://www.springframework.org/schema/beans" xmlns:seam="http://jboss.com/products/seam/spring" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/be ans http://www.springframework.org/schema/beans/spring-beans2.0.xsd http://jboss.com/products/seam/spring http://jboss.com/products/seam/spring-1.2.xsd"> JBoss Seam © 2007 Orientation in Objects GmbH 70 35 Spring mag Seam… <bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype"> <property name="someProperty"> <seam:instance name="someComponent"/> </property> </bean> JBoss Seam © 2007 Orientation in Objects GmbH 71 Und Seam mag immer noch EL… <bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype"> <property name="someProperty"> <seam:instance name="#{someExpression}"/> </property> </bean> JBoss Seam © 2007 Orientation in Objects GmbH 72 36 Oder gleich richtig in den Spring Kontext? <seam:instance name="someComponent" id="someSeamComponentInstance"/> <bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype"> <property name="someProperty„ ref="someSeamComponentInstance"> </bean> JBoss Seam © 2007 Orientation in Objects GmbH 73 Scope Inkompatibilität Mit einem Proxy die unterschiedlichen Scopes zurechtbiegen. <seam:instance id="seamManagedEM" name="someManagedEMComponent" proxy="true"/> JBoss Seam © 2007 Orientation in Objects GmbH 74 37 Mag Seam auch Spring??? Die Spring-JSF Integration hat schon immer für JSF Integration gesorgt. Seam erkennt die in JSF Integrierten Komponenten jetzt auch. <application> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> </application> @In("#{bookingService}") private BookingService bookingService; JBoss Seam © 2007 Orientation in Objects GmbH 75 Metamorphose Wandelt eine Spring Bean in eine Seam bean (singletons) <bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype" > <seam:component/> </bean> JBoss Seam © 2007 Orientation in Objects GmbH 76 38 Metamorphose mit Pepp Seam Scopes können auch unter Spring verwendet werden. <seam:configure-scopes/> <bean id="someSpringBean" class="SomeSpringBeanClass" scope="seam.CONVERSATION" /> JBoss Seam ? ? ? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim JAX Reloaded 77 © 2007 Orientation in Objects GmbH ? Fragen ? ? www.oio.de [email protected] 39 „Orientierung“ in Objekten ) Akademie ) ) Beratung ) • Schulungen, Coaching, Weiterbildungsberatung, Train & Solve-Programme • Methoden, Standards und Tools für die Entwicklung von offenen, unternehmensweiten Systemen JBoss Seam ) Projekte ) • Schlüsselfertige Realisierung von Software • Unterstützung laufender Projekte • Pilot- und Migrationsprojekte © 2007 Orientation in Objects GmbH 79 Vielen Dank für Ihre Aufmerksamkeit ! Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim JAX Reloaded www.oio.de [email protected] 40