1
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
[email protected] Reloaded
JBoss Seam
Seam – oder wie Nähe ich ein Java EE Patchwork
© 2007 Orientation in Objects GmbHJBoss Seam 2
Papick Garcia Taboada
Software Architekt
Technologie-Scout
Beratung
Projekte
Training
2
© 2007 Orientation in Objects GmbHJBoss Seam 3
Serge Ndong
Entwickler
Berater
Trainer
© 2007 Orientation in Objects GmbHJBoss Seam 4
Gliederung
• Was ist Seam?
• Wie funktioniert Seam?
• Fazit?
3
© 2007 Orientation in Objects GmbHJBoss Seam 5
Webapp in 15 min?
Keynote W-JAX 2006Tim Bray, Director of Web Technologies (Sun)
© 2007 Orientation in Objects GmbHJBoss Seam 6
Endlich ein Webapp Framework
• Framework zur Erstellung vonEnterprise Java Webapplikationen
• ein mächtiges Framework,um moderne Web 2.0 Anwendungen[sehr einfach] zu bauen
4
© 2007 Orientation in Objects GmbHJBoss Seam 7
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
© 2007 Orientation in Objects GmbHJBoss Seam 8
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
5
© 2007 Orientation in Objects GmbHJBoss Seam 9
Wie leichtgewichtig ist es?
• dank Java EE 5 leichtgewichtigeren Ansatz
© 2007 Orientation in Objects GmbHJBoss Seam 10
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
• mit JBoss Embeddable Container
6
© 2007 Orientation in Objects GmbHJBoss Seam 11
Geschichte
• Versionen– 1.2.1 Produktion seit 27.03.2007– 1.2.0 Produktion 27.02.2007– 1.1.6 Produktion 08.02.2007– 1.1.5 Produktion 01.02.2007– 1.1.1 Produktion 18.01.2007– 1.1.0 Produktion 13.12.2006– 1.1.0 BETA 1 24.10.2006– 1.0.1 Produktion 18.06.2006– 1.0.0 Produktion 11.06.2006– 1. Beta 18.09.2005
Lead durch Gavin King (Hibernate)
© 2007 Orientation in Objects GmbHJBoss Seam 12
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
7
© 2007 Orientation in Objects GmbHJBoss Seam 13
AJAX-basiertes Remoting
• Webclient hat direkten Zugriff auf EJB Session Beans
• Bereitstellung von EJB-Komponenten alsJavaScript Proxy-Objekte
• Webclients können JMS Nachrichten empfangen– Nach wie vor experimental
© 2007 Orientation in Objects GmbHJBoss Seam 14
Prozessgetriebene Applikationen
• eigene Business Processing ManagementEngine (jBPM)für die Implementierung vonWorkflows und Pageflows
8
© 2007 Orientation in Objects GmbHJBoss Seam 15
Testbarkeit++
• POJOs sind einfach zu testen
• Umfangreiche Testmöglichkeiten (mit TestNG)
– z.B : Nachbilden einer Interaktionmit einem Benutzer des Systems
© 2007 Orientation in Objects GmbHJBoss Seam 16
Zustandsbehaftete Applikationen
• Seam definiert zwei weitere Kontexte
– Conversation Scope:entspricht einem kurzfristigen Dialog
– Business Process Scope:entspricht einem langlebigen Dialog über mehrere Sitzungen.
9
© 2007 Orientation in Objects GmbHJBoss Seam 17
Bijection
• steht für „bidirectional injection“oder injection und outjection
• Erweiterung des Grundgedankens„Dependency Injection“
© 2007 Orientation in Objects GmbHJBoss Seam 18
„Nähkästchen“
Java EE 5
JSP Facelets Portlet
JSF
Seam
EJB3 JBoss jBPM Hibernate
Presentation Tier
Request Controller
Context Manager
State Management
10
© 2007 Orientation in Objects GmbHJBoss Seam 19
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)
© 2007 Orientation in Objects GmbHJBoss Seam 20
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 (formasochists).
11
© 2007 Orientation in Objects GmbHJBoss Seam 21
Gliederung
• Was ist Seam?• Wie funktioniert Seam?• Fazit?
© 2007 Orientation in Objects GmbHJBoss Seam 22
Neues Komponentenmodell?
• wichtig: Seam hat kein eigenes Komponentenmodell
– Seam stimmt die Java EE Komponenten aufeinander ab!
– sobald Seam die Komponenten kennt, werden die Brückengeschlagen
12
© 2007 Orientation in Objects GmbHJBoss Seam 23
Seam Komponentenmodell?
• Seam Komponenten werden mit Kontext Variablen mittels
@Name bzw. @Role definiert
• mittels der Annotation @Scope kann man SeamKomponenten einem Scope zuweisen
© 2007 Orientation in Objects GmbHJBoss Seam 24
Bijection
• Dependency Injection im Kontext
• Komponenten in grösseren Scopes können auf Komponenten inkleineren Scopes verweisen/ verlinken
• Bijection ist
– dynamisch,– kontextbezogen und– biderektional
13
© 2007 Orientation in Objects GmbHJBoss Seam 25
Magic?
SomeInstance
user
© 2007 Orientation in Objects GmbHJBoss Seam 26
Magic?
SomeInstance
SomeOtherInstance
The user instance
Seam magic
Som
e sc
ope
14
© 2007 Orientation in Objects GmbHJBoss Seam 27
Magic?
SomeInstance
SomeOtherInstance
The user instance
Seam magic
Som
e sc
ope
© 2007 Orientation in Objects GmbHJBoss Seam 28
@In …
• Bijection durch annotation– an Attribut oder Getter- und Setter-Methoden
• @In wird eine "dependency injection" vermerkt
15
© 2007 Orientation in Objects GmbHJBoss Seam 29
… and @Out
• @Out wird die Instanzvariable in die Seam Laufzeitumgebungangemeldet– Outjected…
© 2007 Orientation in Objects GmbHJBoss Seam 30
Bijection
@Stateful
@Name(“changeUserPassWord")
public class ChangeUserPassWord{
@PersistenceContext
private EntityManager em;
@In @Out
private User user;
...
}
16
© 2007 Orientation in Objects GmbHJBoss Seam 31
Bijection
• Möglichkeit Expression Language-Syntax in den Annotations zuverwenden
@Name("loginAction")public class LoginAction implements Login {
@In("#{user.username}")String username;...
}
© 2007 Orientation in Objects GmbHJBoss Seam 32
Servlet API Scopes
• Die Servlet API stellt lediglich den
– Request,
– Session und
– Applikation Scope zur Verfügung.
17
© 2007 Orientation in Objects GmbHJBoss Seam 33
Nicht akzeptabler Zustand…
• Request und Session Scopes nicht ausreichend für dieEntwicklung von Anwendungen
– kleinere Sitzungen müssen durch den Entwickler verwaltet werden
– Dialoge fehlen in der JSF Spezifikation• Struts Shale bietet Implementierungen an…
© 2007 Orientation in Objects GmbHJBoss Seam 34
Seam Kontexte
• bisher bekannte Kontexte
– Stateless Context
– Event Context
– Page Context
– Session Context
– Application Context
18
© 2007 Orientation in Objects GmbHJBoss Seam 35
Neu: Conversation Context
• ein Dialog ist ein „Unit of Work“
• Anfang und Ende eines Dialoges werden durch annotierteMethoden definiert
• Speicherort für Dialogspezifische Informationen
• Konversationen können verschachtelt sein
© 2007 Orientation in Objects GmbHJBoss Seam 36
Da guck!
• Mit Seam-Beispielen Kopfschmerzenfrei loslegen und staunen…
• Das Seam Hotelreservierungsbeispiel…
– http://localhost:8080/seam-booking/
19
© 2007 Orientation in Objects GmbHJBoss Seam 37
Neu: Business Process Context
• beschreibt ein Dialog das über die Lebenszeit einer Sitzunghinaus dauern kann
• jBPM Engine ist für das Management und das Speichern derSitzungsdaten verantwortlich
© 2007 Orientation in Objects GmbHJBoss Seam 38
Anfang und Ende
• Dialog Beginn und Ende werden durch Annotationengekennzeichnet
– Bei einer Conversation:• @Begin• @End
– Bei einem Business Process:• @BeginTask• @EndTask
20
© 2007 Orientation in Objects GmbHJBoss Seam 39
Übliche Seam Kontexte
Page Context
Session Context
Application Process Context
Servlet/JSP JBoss Seam
Business Process Context
Conversation Context
JBoss jBPM
J EE 5Stateless Context
© 2007 Orientation in Objects GmbHJBoss Seam 40
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– default ist Event scope EJB3:
Configuration by exception!
21
© 2007 Orientation in Objects GmbHJBoss Seam 41
Navigation
• JSF Navigation nicht ausreichend…
• Wunschliste– Navigation grafisch gestalten
– Seitenfluss verbindlich vorgeben
– Navigation wie bisher deskriptiv, Engine soll die Arbeit übernehmen
© 2007 Orientation in Objects GmbHJBoss Seam 42
Grafische Pageflow Definition
22
© 2007 Orientation in Objects GmbHJBoss Seam 43
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>
© 2007 Orientation in Objects GmbHJBoss Seam 44
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;
}
23
© 2007 Orientation in Objects GmbHJBoss Seam 45
Grafische Business Prozess Definition
© 2007 Orientation in Objects GmbHJBoss Seam 46
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>
24
© 2007 Orientation in Objects GmbHJBoss Seam 47
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 @EndTaskpublic void done() {}
}
© 2007 Orientation in Objects GmbHJBoss Seam 48
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 Userwhere username=:username")
.setParameter("username",username).getResultList();
if (existing.size()==0){em.persist(user);return "/registered.jsp"; }
}}
25
© 2007 Orientation in Objects GmbHJBoss Seam 49
<h:commandButton type="submit" value="Register" action="#{register.register}"/>
Stateless Session Bean im Frontend
@Stateless@Name("register")public class RegisterAction implements Register{
public String register(String username) {
(…)
}}
© 2007 Orientation in Objects GmbHJBoss Seam 50
Validierung auf Entitäten definieren
@Entitypublic class User{
@Id @GeneratedValueprivate Long id;
@NotNullprivate String firstname;
@Length(max=25) @NotNullprivate String lastname;
@Length(max=200)private String description;
(...)
26
© 2007 Orientation in Objects GmbHJBoss Seam 51
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>
© 2007 Orientation in Objects GmbHJBoss Seam 52
Seam Remoting
• JavaScript Proxies werden dynamisch zur Laufzeit generiert unddem Client mittels ein Servlet zu Verfügung gestellt
• JavaScript- Entwickler können ohne technische Klimmzüge direktauf die Proxy Objekte zugreifen
• Webclients können JMS Nachrichten empfangen
27
© 2007 Orientation in Objects GmbHJBoss Seam 53
Seam Remoting: Stateless Seam Komponente
@Stateless@Name(“userFinder”)public class UserFinderBean implements UserFinder {
@InPersistenceContext em;
public List<User> find(String searchString) {return em.createQuery(“from User where firstname like:search”).setParameter(“search”, searchString).getResultList();}
}
© 2007 Orientation in Objects GmbHJBoss Seam 54
Seam Remoting: Local Interface
@Local
public interface UserFinder {
@WebRemote List<User> find(String searchString);
}
28
© 2007 Orientation in Objects GmbHJBoss Seam 55
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>
© 2007 Orientation in Objects GmbHJBoss Seam 56
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) {(...)
}
29
© 2007 Orientation in Objects GmbHJBoss Seam 57
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>
© 2007 Orientation in Objects GmbHJBoss Seam 58
Transaktionen und Cache
• Seam verschiebt die Transaktionsgrenzen vom EJBProgrammiermodell auf die Seam Komponenten
– bessere Reaktion auf die Besonderheiteneiner Webanwendung
30
© 2007 Orientation in Objects GmbHJBoss Seam 59
Transaktionen und Cache
• Seam verwendet einen erweiterten Persistenzkontext, der einenganzen Dialog-Kontext umfasst
– Dadurch sind die Komponenten auch nach einem Request-Response-Zyklus ansprechbar
– kein LazyInitializationException mehr
© 2007 Orientation in Objects GmbHJBoss Seam 60
Transaktionen und Cache
• Seam verwendet zwei Transaktionskontexte in einem Response-Request-Zyklus
– Der erste umfasst das Update des Models und die Applikationslogik
– der zweite umfasst das Rendern der Ausgabe.
31
© 2007 Orientation in Objects GmbHJBoss Seam 61
Seam Dialoge und der Cache
• Seam nutzt den Dialog-Kontext als intelligente Cache Lösung
– der Anwendungsentwickler muss nicht mehr stets sein Session-Kontext aufräumen
– alle benötigten Daten sind im richtigen Kontext gespeichert undwerden nach Beenden des Dialoges aus dem Speicher entfernt
– keine kontextlosen Second-Level-Caches
– Höhere Hitrate!
© 2007 Orientation in Objects GmbHJBoss Seam 62
Gliederung
• Was ist Seam?• Wie funktioniert Seam?• Fazit?
32
© 2007 Orientation in Objects GmbHJBoss Seam 63
Respekt..
Keynote W-JAX 2006Tim Bray, Director of Web Technologies (Sun)
© 2007 Orientation in Objects GmbHJBoss Seam 64
Finden wir es gut?
• Klares „Jain“
;-)
33
© 2007 Orientation in Objects GmbHJBoss Seam 65
Genauer?
• ☺ Vereinheitlichung des Programmiermodells
• ☺ JSF mit Dialoge (Struts Shale?)
• ☺ Remoting (nicht wirklich neu?)
• ☺ Weniger Konfigurationsaufwand
© 2007 Orientation in Objects GmbHJBoss Seam 66
Genauer?
• � „One size fit all“ Architektur– Vereinfachungen umstritten
• � „All in one package, take it or leave it“– JBPM– JBoss Rules
• � Wenig Erweiterungsmöglichkeiten
34
© 2007 Orientation in Objects GmbHJBoss Seam 67
Noch Zeit für Bonusmaterial?
• Die Spring Integration!
© 2007 Orientation in Objects GmbHJBoss Seam 68
Spring Framework Integration
• Direkt from Seam!
• Ermöglicht eine einfache Migration vonSpring basierte Projekten in Seam
• JSF Erweiterungen wie Dialogkontextefür Spring-Anwendungen
35
© 2007 Orientation in Objects GmbHJBoss Seam 69
Was geht?
• Spring beans können Abhängigkeiten zu Seam Komponentendefinieren
• Seam Komponenten können Abhängigkeiten zu SpringKomponenten definieren
• Spring Komponenten in Seam Komponenten umwandeln
• Spring Komponenten können Seam Kontexte zugeordnet werden
© 2007 Orientation in Objects GmbHJBoss Seam 70
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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://jboss.com/products/seam/springhttp://jboss.com/products/seam/spring-1.2.xsd">
36
© 2007 Orientation in Objects GmbHJBoss Seam 71
Spring mag Seam…
<bean id="someSpringBean" class="SomeSpringBeanClass"scope="prototype"><property name="someProperty">
<seam:instance name="someComponent"/></property>
</bean>
© 2007 Orientation in Objects GmbHJBoss Seam 72
Und Seam mag immer noch EL…
<bean id="someSpringBean" class="SomeSpringBeanClass"scope="prototype"><property name="someProperty">
<seam:instance name="#{someExpression}"/></property>
</bean>
37
© 2007 Orientation in Objects GmbHJBoss Seam 73
Oder gleich richtig in den Spring Kontext?
<seam:instancename="someComponent"id="someSeamComponentInstance"/>
<beanid="someSpringBean"class="SomeSpringBeanClass"scope="prototype">
<propertyname="someProperty„ref="someSeamComponentInstance">
</bean>
© 2007 Orientation in Objects GmbHJBoss Seam 74
Scope Inkompatibilität
Mit einem Proxy die unterschiedlichen Scopes zurechtbiegen.
<seam:instanceid="seamManagedEM"name="someManagedEMComponent"proxy="true"/>
38
© 2007 Orientation in Objects GmbHJBoss Seam 75
Mag Seam auch Spring???
Die Spring-JSF Integration hat schon immer für JSF Integration gesorgt. Seamerkennt die in JSF Integrierten Komponenten jetzt auch.
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>
@In("#{bookingService}")
private BookingService bookingService;
© 2007 Orientation in Objects GmbHJBoss Seam 76
Metamorphose
Wandelt eine Spring Bean in eine Seam bean (singletons)
<beanid="someSpringBean"class="SomeSpringBeanClass"scope="prototype" >
<seam:component/>
</bean>
39
© 2007 Orientation in Objects GmbHJBoss Seam 77
Metamorphose mit Pepp
Seam Scopes können auch unter Spring verwendet werden.
<seam:configure-scopes/>
<beanid="someSpringBean"class="SomeSpringBeanClass"scope="seam.CONVERSATION"/>
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
[email protected] Reloaded
? ?
???
Fragen ?
40
© 2007 Orientation in Objects GmbHJBoss Seam 79
) Akademie ) ) Beratung )
„Orientierung“ in Objekten
• Schulungen, Coaching, Weiterbildungsberatung, Train & Solve-Programme
• Methoden, Standards und Tools für die Entwicklung von offenen, unternehmens- weiten Systemen
• Schlüsselfertige Realisierung von Software• Unterstützung laufender Projekte• Pilot- und Migrationsprojekte
) Projekte )
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
[email protected] Reloaded
Vielen Dank für IhreAufmerksamkeit !