Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Martin Marinschek on Conversation Mangement wit...

Martin Marinschek on Conversation Mangement with JSF

More Decks by Enterprise Java User Group Austria

Other Decks in Technology

Transcript

  1. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 2 State

    of the art – Art of the state • Erste Frage: Stateful oder stateless? • Context-incomplete versus context- complete communication (Ted Neward)
  2. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 3 Context-incomplete

    • Hallo Jürgen • Hallo Martin • Gehen wir heute auf ein Bier? • Wohin denn? • In den Wissensturm • Ok, um 20:00
  3. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 4 Context-complete

    • Hallo Jürgen • Hallo Martin, hier ist Jürgen • Hallo Jürgen, hier ist Martin, gehen wir heute auf ein Bier • Hallo Martin, hier ist Jürgen, du fragtest, ob wir auf ein Bier gehen wollen, wohin denn? • Hallo Jürgen, hier ist Martin, ich habe dich gefragt ob wir auf ein Bier gehen wollen, du hast gefragt wohin denn, ich schlage vor, in den Wissensturm. • Hallo Martin, hier ist Jürgen, du fragtest, ob wir auf ein Bier gehen wollen, ich fragte, wohin du gehen wolltest, du hast vorgeschlagen, in den Wissensturm, ich sage ok, um 20:00.
  4. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 5 Context

    in/complete communication? • Kommt auf den Anwendungsfall an • in (komplexeren) Webanwendungen ist häufig der Transfer zu aufwändig • context-complete communication schwierig • –-> State ist notwendig
  5. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 6 Server-side

    state oder client- side state? • beides argumentierbar • client-seitiger State skaliert besser, stellt höhere Anforderungen an Client • server-seitiger State ist sicherer, stellt höhere Anforderungen an Server
  6. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 7 Dieser

    Vortrag... … behandelt server-seitigen State!
  7. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 8 State-Scoping

    im Web None Request View/Flash Conversation/Dialog Session Application
  8. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 9 Servlet/Web-Standard-Scopes

    • none (prototype) – bei jedem Zugriff neue Instanz • request – während einem Request dieselbe Instanz • session – während einer Session die selbe Instanz • application (singleton) – für die gesamte Anwendung dieselbe Instanz
  9. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 10 View-Scope

    • Scope startet, wenn eine Seite das erste mal angezeigt wird • Daten bleiben solange vorgehalten, wie mit der Seite interagiert wird • z.B. AJAX-Calls
  10. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 11 Flash

    Scope • Zwei Interpretationsvarianten: • Daten bleiben erhalten, wenn sie beim letzten Request/Response-Zyklus – gesetzt (etwas kurzlebiger als View-Scope, hilft z.B. für POST/REDIRECT Pattern) – noch verwendet wurden (etwas langlebiger als der View-Scope)
  11. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 12 Conversation-Scope

    • Startet meistens automatisch, wenn erstmals verwendet • Oder manuell über Interaktion Entwickler/Conversation-Scope System • Schliesst meistens manuell über Interaktion Entwickler/Conversation-Scope System
  12. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 13 Warum

    ist das nicht in der Servlet-Spec? • Es gibt keinen Window-Identifier in der HTTP-Spec • Für Window/Tab-Demarkation benötigt man eine ordentliche Ladung JavaScript • Eine Implementierung war nicht "standardisierungsreif"
  13. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 14 Back-Button

    und Conversation • Spring-Webflow: jeder Zyklus entspricht einem Snapshot der Conversation • vor/zurück: entspricht weiter/zurückgehen in der Snapshothistory
  14. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 15 Conversation

    und JPA • Häufig: Conversation = EntityManager • Dauer der Conversation → PersistenceContext bleibt offen
  15. 30.04.10 DI. Mag. Martin Marinschek / JSF Kurs 16 Zwei

    Beispiele: • MyFaces Orchestra • Spring Webflow • starten wir mit Orchestra...
  16. 30.04.10 Scopes konfigurieren  CustomScopeConfigurer ermöglicht das Registrieren von Scopes

    in der Konfiguration <bean class= "org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="conversation.manual"> <bean class="org.apache.myfaces.orchestra.conversation.spring. SpringConversationScope" /> </entry> <entry key="conversation.access"> <bean class="org.apache.myfaces.orchestra.conversation.spring. SpringConversationScope"> <property name="lifetime" value="access" /> </bean> </entry> </map> </property> </bean> Den gewählten Scope Namen verwendet man dann in der Bean Deklaration (z.B.: scope=“conversation.access“).
  17. 30.04.10 PersistenceContext Management  Ein Interceptor stellt den „Persistence Context

    bei Methodenaufrufen bereit – Derzeit unterstützt dieser Interceptor nur JPA
  18. 30.04.10 Conversation starten  Conversation startet beim Zugriff auf die

    Bean <bean name="conversationBean" class="example1.model.Bean" scope="conversation.manual"> </bean> <bean name=“accessBean" class="example1.model.Bean" scope=“conversation.access"> </bean>
  19. 30.04.10 Conversation Name  Conversation hat einen eindeutigen Namen 

    Gleicher Conversation Name bedeutet gleiche PersistenceContext <beans ... xmlns:orchestra="http://myfaces.apache.org/orchestra" xsi:schemaLocation="... http://myfaces.apache.org/orchestra http://myfaces.apache.org/orchestra/orchestra.xsd"> <bean id=“sampleConversation" class="e..m..SampleBean" scope="conversation.manual“ /> <bean id="anotherBean" class="e...m...ExampleBean" scope="conversation.manual" orchestra:conversationName=“sampleConversation“ /> </beans> Beide Beans befinden sich in der selben Conversation. Der Name der Bean wird auch für die Conversation verwendet, wenn nichts anderes angegeben wurde.
  20. 30.04.10 Beans in Conversations  Beans via Java API hinzufügen,

    sobald man Zugriff auf die Conversation hat – conversation.setAttribute(key, value)‏ – conversation.hasAttribute(key)‏ – conversation.getAttribute(key)‏ – conversation.removeAttribute(key)‏
  21. 30.04.10 Zugriff auf Conversation (1)‏  Aktuelle Conversation ermitteln Conversation.getCurrentInstance()

     Bestimmte Conversation ermitteln ConversationManager. getConversation( String conversationName)
  22. 30.04.10 Zugriff auf Conversation (2)‏  Beans können „ConversationAware“ sein

    – vgl. BeanFactoryAware oder BeanNameAware  Beans im Conversation Scope bekommen die Conversation, in der sie sich befinden, injiziert  Injection erfolgt nach dem Auflösen der Dependencies, aber vor weiterer Initialisierung (init-method oder afterPropertiesSet())‏
  23. 30.04.10 Zugriff auf Conversation (3)‏ import org.apache.myfaces.orchestra.conversation.ConversationAware; public class ConversationAwareBean

    implements ConversationAware { private Conversation conversation; /** * Setzt die Conversation, in der sich diese Bean befindet. */ public void setConversation(Conversation conversation) { this.conversation = conversation; } // ... }
  24. 30.04.10 ConversationBindingListener  Informiert ein Objekt, wenn es – zur

    Conversation hinzugefügt oder – von der Conversation entfernt wurde  Vergleichbar mit javax.servlet.http. HttpSessionBindingListener import o..ap..m..orchestra.conversation.ConversationBindingListener; public class SampleBean implements ConversationBindingListener { public void valueBound(ConversationBindingEvent event) { /* .. */ public void valueUnbound(ConversationBindingEvent event) { /* .. *
  25. 30.04.10 Conversation beenden  Endet automatisch – Conversation mit Lifetime

    „access“  Manuell beenden – via Java API – via JSF Komponente  Timeout  Session beenden
  26. 30.04.10 Beenden via Komponente  endConversation Komponente erlaubt es, Conversations

    zu beenden <%@ taglib uri="http://myfaces.apache.org/orchestra" prefix="o" %> ... <h:commandButton action="#{controller.process}" value=""> <o:endConversation name="conversation1" onOutcome="end,close,exit" /> <o:endConversation name="conversation2" /> </h:commandButton> Conversation wird auf jeden Fall beendet, egal welchen Outcome die Action liefert. Conversation wird beendet, wenn der Outcome der Action entweder „end“, „close“ oder „exit“ ist. Der Name der Conversation muss angegeben werden.
  27. 30.04.10 Beenden via Java API  Aktuelle Conversation beenden conversation.invalidate()

     Bestimmte Conversation beenden ConversationUtils.invalidateIfExists( String conversationName)‏
  28. 30.04.10 Conversation Timeout (1)‏  Überprüfung in regelmäßigem Abstand –

    standardmäßiger Intervall: 5 Minuten – konfigurierbar über Parameter in der web.xml  Letzter Zugriff auf Conversation entscheidend – standardmäßig gibt es kein Timeout – konfigurierbar in der Spring Konfiguration  Achtung: Conversation Timeout sollte nicht kleiner sein als der Überprüfungsintervall
  29. 30.04.10  Intervall setzen:  Timeout für einen Scope setzen:

    Conversation Timeout (2)‏ <context-param> <description> Gibt den Intervall für die Überprüfung der Conversation Timeouts an (in ms). </description> <param-name> org.apache.myfaces.orchestra.WIPER_THREAD_CHECK_TIME </param-name> <param-value>60000</param-value> </context-param> <bean class="o.a.m.orchestra.conversation.spring.SpringConversationScope"> <!-- Timeout in Minuten --> <property name="timeout" value="35" /> ... </bean>
  30. 30.04.10 Der “Flow” in Spring Web Flow  Ein „Flow“

    ist eine Anordnung von sog. States – State kann z.B. definieren, welche Informationen vom Benutzer benötigt werden oder – was mit diesen Informationen getan werden soll Quelle: http://springframework.org/webflow
  31. 30.04.10 „The Flow is King“  Definition und Ausführung eines

    Flows steht im Mittelpunkt von Spring Web Flow – Flow erstreckt sich meist über mehrere Requests – Flow gibt Abwicklung eines Geschäftsprozesses vor  z.B. das Kaufen eines Produkts: Suche, Warenkorb, etc.  Domain-Specifc Language für Flow Definition – Sowohl über XML als auch über eine Java API  → Flow Definition ist sozusagen der Bauplan für einen Dialog mit dem User
  32. 30.04.10 Flow Definition Template <?xml version="1.0" encoding="UTF-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation=" http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow- 1.0.xsd"> <!–- View-States des Flows angeben --> <view-state id="[stateId]" view="[viewId]"> <!-- Transitions zwischen einzelnen States --> <transition ... /> </view-state> ... <!-- Ende des Flows markieren --> <end-state id="[stateId]" /> <end-state id="[stateId]" /> </flow> Es kann aber mehrere definierte Endpunkte für einen Flow geben. Der erste State gilt als Startpunkt des Flows.
  33. 30.04.10 Views definieren  <view-state /> Elemente für Definition –

    Unterbricht die Ausführung des Flows und rendert den Response – Wartet auf ein Ereignis vom Benutzer <view-state id=" start" view=" /welcome.jsp" />
  34. 30.04.10 Flow fortsetzen  Änderungen betreffen lediglich Konfiguration – →

    Views und Backing Beans bleiben unverändert  Outcome einer Action entspricht einem “Event” <h:form> <h:commandButton action="submit" value="Click Me!" /> </h:form> <view-state ...> <transition on="submit" to="..." /> </view-state>
  35. 30.04.10 Ende eines Flows  <end-state /> terminiert den aktuellen

    Flow  Mehrere <end-state /> Elemente möglich  Redirect auf nächsten Flow möglich <end-state id="finish" view="/finish.jsp" /> <end-state id="finish" view="flowRedirect:searchProductFlow" />
  36. 30.04.10 Subflows  Aufruf eines anderen Flows als „Subflow“ 

    Ermöglicht stärkere Modularisierung von Flows <!–- MainFlow hat subflow-state --> <subflow-state id="searchProduct" subflow="search-product"> <!-- transition on = id des end-states im Subflow --> <transition on="finish" to="productFound" /> </subflow-state> <!–- Subflow --> <end-state id="finish" />
  37. 30.04.10 Scopes < f l o w . . .

    > < v i e w - s t a t e i d = " s t a r t " . . . > . . . < / v i e w - s t a t e > < / f l o w > < s u b f l o w - s t a t e . . . > < / s u b f l o w - s t a t e > < s u b f l o w - s t a t e . . . > . . . < / s u b f l o w - s t a t e > C o n v e rs a tio n S c o p e F lo w S c o p e F lo w S c o p e F lo w S c o p e
  38. 30.04.10 <flow> <!-– Flow Scope: --> <var name="person" class="at.irian.jsf.swf.example.Person" />

    <!–- View Scope: --> <view-state> <var name="viewPerson" class="at.irian.jsf.swf.example.Person" /> </view-state> </flow> Variables  Beans können auch in den Flow Konfigurationen definiert werden – → mit dem „<var />“-Tag Serialisierbare Klasse mit einem Default-Konstruktor