Zaawansowane Aplikacje Internetowe Katedra Mikroelektroniki i Technik Informatycznych Politechniki Łódzkiej ul. Wólczanska 221/223 budynek B18, 90-924 Łódź mgr inż. Robert Ritter
10. Spring WebFlow Konfiguracja Definicja przepływów Integracja z SpringMVC Bezpieczeństwo
Spring WebFlow 3 mgr inż. Robert Ritter, ritter@dmcs.pl rozszerzenie, które pozwala zdefiniować przepływy w aplikacji przepływ zawiera w sobie kroki prowadzące użytkownika przez zadanie biznesowe przepływ spina wiele zapytań HTTP, posiada swój własny stan, obsługuje dane transakcyjne, jest reużywalny, może być dynamiczny oraz długo działający Spring WebFlow używany jest do tworzenia stanowych aplikacji z kontrolowaną nawigacją Spring WebFlow można zintegrować z szeroką gamą aplikacji włączając w to Spring MVC, JSF oraz Portlety
Spring WebFlow (2) 4 mgr inż. Robert Ritter, ritter@dmcs.pl cechą wspólną scenariuszy jest przynajmniej jedno z poniższych o jasno określony początek i koniec o użytkownik musi przejść przez ciąg ekranów w określonej kolejności o zmiany nie są zapisywane przed osiągnięciem ostatniego kroku o po zakończeniu nie powinno być możliwe przypadkowe powtórzenie transakcji scenariusze można opisać deklaratywnym językiem opisu przepływów
Dlaczego Spring WebFlow? 5 mgr inż. Robert Ritter, ritter@dmcs.pl wizualizacja przepływu jest skomplikowana aplikacja aktywnie korzysta z sesji HTTP wymuszenie kontrolowanej nawigacji jest istotne ale niemożliwe porządna obsługa przycisku wstecz w przeglądarce wydaje się niemożliwa przeglądarka traci synchronizację z serwerem po użyciu przycisku wstecz wiele otwartych kart powodują problemy wielowątkowego dostępu do danych zapisanych w sesji HTTP
Konfiguracja 6 mgr inż. Robert Ritter, ritter@dmcs.pl flowexecutor zarządza wykonaniem przepływem informacji <flow:flow-executor id="flowexecutor" flowregistry="flowregistry" /> flowregistry zarządza definicjami przepływów oraz udostępnia je do flowexecutor <flow:flow-registry id="flowregistry" basepath="/web-inf/flows"> <flow:flow-location-pattern value="*-flow.xml" /> </flow:flow-registry> o flow-location-pattern definiuje szablon nazw plików definicji przepływów o flow-location z atrybutem path jest alternatywą do powyższego <flow:flow-registry id="flowregistry"> <flow:flowlocation path="/web-inf/flows/springpizza.xml" /> </flow:flow-registry>
Konfiguracja (2) 7 mgr inż. Robert Ritter, ritter@dmcs.pl FlowHandlerMapping podpowiada DispatcherServlet, że powinien wysyłać żądania do SpringWebFlow FlowHandlerAdapter jest pomostem między DispatcherServlet a SpringWebFlow, obsługuje zapytania skierowane do WebFlow <bean class="org.springframework.webflow.mvc.servlet.flowhandlermapping"> <property name="flowregistry" ref="flowregistry" /> </bean> <bean class="org.springframework.webflow.mvc.servlet.flowhandleradapter"> <property name="flowexecutor" ref="flowexecutor" /> </bean>
Składowe każdego przepływu 8 mgr inż. Robert Ritter, ritter@dmcs.pl state punkt w przepływie, w którym wykonywana jest logika biznesowa transition droga użyta do połączenia stanów flow data dane przypisane do przepływu State type Action Decision End Subflow View What it s for Action states are where the logic of a flow takes place. Decision states branch the flow in two directions, routing the flow based on the outcome of evaluation flow data. The end state is the last stop for a flow. Once a flow has reached its end state, the flow is terminated. A subflow state starts a new flow within the context of a flow that is already underway. A view state pauses the flow and invites the user to participate in the flow.
Składowe każdego przepływu (2) 9 mgr inż. Robert Ritter, ritter@dmcs.pl <view-state id="takepayment" model="flowscope.paymentdetails"/> <action-state id="saveorder"> <evaluate expression="pizzaflowactions.saveorder(order)" /> <transition to="thankyou" /> </action-state> <decision-state id="checkdeliveryarea"> <if test="pizzaflowactions.checkdeliveryarea(customer.zipcode)" then="addcustomer" else="deliverywarning" /> </decision-state> <subflow-state id="order" subflow="pizza/order"> <input name="order" value="order"/> <transition on="ordercreated" to="payment" /> </subflow-state> <end-state id="customerready" />
Przejścia 10 mgr inż. Robert Ritter, ritter@dmcs.pl <transition to="customerready" /> <transition on="phoneentered" to="lookupcustomer"/> <transition on-exception= "org.pizza.service.customernotfoundexception" to="registrationform" /> <global-transitions> <transition on="cancel" to="endstate" /> </global-transitions>
Zmienne w przepływie 11 mgr inż. Robert Ritter, ritter@dmcs.pl <var name="customer" class="org.pizza.domain.customer" /> <evaluate result="viewscope.toppingslist" expression="t(org.pizza.domain.topping).aslist()" /> <set name="flowscope.pizza" value="new org.pizza.domain.pizza()" /> Scope Conversation Flow Request Flash View Lifespan and visibility Created when a top-level flow starts and destroyed when the top-level flow ends. Shared by a top-level flow and all of its subflows. Created when a flow starts and destroyed when the flow ends. Only visible within the flow it was created by. Created when a request is made into a flow and destroyed when the flow returns. Created when a flow starts and destroyed when the flow ends. It s also cleared out after a view state renders. Created when a view state is entered and destroyed when the state exits. Visible only within the view state.
Aplikacja 12 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład na SVN
Zabezpieczenia 13 mgr inż. Robert Ritter, ritter@dmcs.pl stany, przejścia i całe przepływy można zabezpieczyć dodając element secured <view-state id="restricted"> <secured attributes="role_admin" match="all"/> </view-state> atrybut match przyjmuje wartości any oraz all