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

Documentos relacionados