Wielowarstwowe aplikacje internetowe Plan wykładu • Projektowanie warstwy prezentacji – sesja, kontrola dostępu, duplikacja, walidacja Projektowanie aplikacji Java EE • Złe praktyki w warstwie prezentacji • Projektowanie warstwy biznesowej – komponenty sesyjne, komponenty encyjne • • • • Złe praktyki w warstwie biznesowej Refaktoryzacja warstwy prezentacji Refaktoryzacja warstwy biznesowej Wzorce projektowe JavaServer Faces (JSF) Zarządzanie sesją • Sesja: konwersacja łącząca wiele żądań i odpowiedzi przesyłanych między klientem i serwerem • Stan sesji po stronie klienta HTTP – ukryte pola formularza HTML – cookies Kontrola dostępu klienta • Ochrona widoku – – – – Mechanizm ochrony "wszystko albo nic" Dołączanie ochrony do fragmentów widoku Ochrona widoku na podstawie ról Ochrona przez konfigurację • Stan sesji w warstwie prezentacji – demarkacja sesji • Stan sesji w warstwie biznesowej i warstwie zasobów • Standardowe zasady bezpieczeństwa • Wykorzystanie katalogu /WEB-INF Duplikacja formularzy HTML • Walidacja po stronie klienta • Dwukrotne wysłanie formularza • Token synchronizujący (Déjà vu) – Język skryptowy umieszczony w widoku – Prosta walidacja: formaty, pola wymagane • Walidacja po stronie serwera formularz HTML TOKEN klient klient HTTP HTTP Walidacja TOKEN – Walidacja oparta na formularzu – Walidacja oparta na typach abstrakcyjnych serwer HTTP serwer HTTP TOKEN TOKEN klient klient HTTP HTTP serwer HTTP serwer HTTP Złe praktyki w warstwie prezentacji • Kod sterujący w wielu widokach • Udostępnianie struktur danych warstwy prezentacji warstwie biznesowej • Duplikacja formularzy • Użycie skryptletów w widoku • Znacznik <jsp:setProperty> Korzystanie z komponentów sesyjnych • • • • Komponenty sesyjne stanowe i bezstanowe Skalowalność i wydajność Wybór w zależności od procesu biznesowego Przechowywanie stanu sesji Korzystanie z komponentów encyjnych • Komponenty encyjne – – – – Obiektowy widok danych Transakcyjność Współdzielenie Odporność na awarie kontenera • Logika biznesowa w komponentach encyjnych – Brak logiki, metody dostępu do danych – Logika samowystarczalna obsługi własnych danych Refaktoryzacja • Cele refaktoryzacji – – – – – – Uproszczenie pielęgnacji aplikacji Poprawienie modułowości aplikacji Rozdzielenie ról członków zespołu projektowego Wielokrotne wykorzystanie komponentów Zwiększenie bezpieczeństwa Redukcja komunikacji sieciowej Złe praktyki w warstwie biznesowej • Mapowanie modelu obiektowego na model komponentów encyjnych • Mapowanie modelu relacyjnego na model komponentów encyjncyh • Korzystanie z komponentów encyjnych tylko do odczytu • Osadzanie usług wyszukiwania po stronie klienta • Rozdrabnianie komponentów encyjnych Wprowadzenie kontrolera Logika sterująca w jednej klasie sterującej która stanowi początkowe miejsce obsługi żądań klienta Wprowadzenie tokenu synchronizującego Współdzielony token monitoruje i steruje przepływem żądań i dostępem klientów do zasobów, wymuszając określoną kolejność żądań Ukrycie szczegółów warstwy prezentacji przed warstwą biznesową Wszystkie odwołania do struktur danych, klas i protokołów komunikacyjnych w warstwie biznesowej muszą być usunięte, dane między warstwami przesyła się za pomocą struktur ogólnych Podział logiki na niezależne fragmenty Logika biznesowa z widoków przeniesiona do jednej lub kilku klas pomocniczych, które są wykorzystywane przez widoki JSP lub serwlety Usunięcie konwersji z widoku Cały kod konwersji musi być przeniesiony z widoku do klasy pomocniczej Ukrywanie zasobów przed klientem (1) Najbardziej istotne zasoby powinny być ukryte i chronione przed użytkownikiem poprzez konfigurację kontenera Ukrywanie zasobów przed klientem (2) Zasoby mogą być chronione przez kontroler i klasę pomocniczą zawierającą definicje ograniczeń konfiguracja web.xml JSP kontroler klient HTTP kontroler klient HTTP warstwa prezentacji warstwa prezentacji Ukrycie komponentów encyjnych Jeżeli komponenty encyjne w warstwie biznesowej są udostępniane klientom w innych warstwach, to należy je ukryć za komponentami sesyjnymi logika biznesowa komponent encyjny Session Façade logika transakcyjna klient HTTP warstwa prezentacji lub klienta komponent encyjny warstwa biznesowa logika biznesowa klient HTTP warstwa prezentacji lub klienta logika transakcyjna warstwa biznesowa komponent encyjny komponent encyjny Wprowadzenie obiektów Business Delegate Komponenty sesyjne warstwy biznesowej powinny być dostępne w innych warstwach poprzez obiekty Business Delegate Łączenie komponentów sesyjnych Komponenty sesyjne reprezentują usługi biznesowe i nie odwzorowują komponentów encyjnych 1:1 Wydzielenie kodu dostępu do danych Cały kod dostępu do danych znajduje się w wydzielonej klasie pomocniczej zlokalizowanej logicznie i fizycznie blisko źródła danych Logika biznesowa w komponentach sesyjnych Logika biznesowa wyrażająca relacje między komponentami encyjnymi jest przeniesiona do komponentu sesyjnego Stosowanie puli połączeń Pula połączeń zawiera wcześniej zainicjalizowane połączenia z bazą danych Wzorzec • Każdy wzorzec składa się z trzech części, które wyrażają związek między konkretnym kontekstem, problemem i rozwiązaniem. Christopher Alexander • Wzorzec to pomysł, który okazał się użyteczny w jednym rzeczywistym kontekście i prawdopodobnie będzie także użyteczny w innym. Martin Fowler Cechy wzorca • • • • • • • Odkrywane dzięki doświadczeniu Zapisywane w formacie strukturalnym Zapobiegają wyważaniu otwartych drzwi Wykorzystywane wielokrotnie Obrazują najlepsze sprawdzone rozwiązania Nieustannie ewoluują Mogą być łączone by rozwiązywać bardziej złożone problemy • Wzorzec a strategia Podejście warstwowe źródło: "Core J2EE wzorce projektowe", D.Alur, J.Crupi, D.Malks Mapa wzorców projektowych źródło: www.corej2eepatterns.com Intercepting Filter Intercepting Filter • Problem: przechwycenie i modyfikowanie żądania, odpowiedź przed i po przetwarzaniu • Siły – Scentralizowane przetwarzanie żądań – Niezależne komponenty do przetwarzania wstępnego • Rozwiązanie – Standardowy filtr javax.servlet.Filter • Konsekwencje – Poprawa wielokrotnego użycia – Elastyczność konfiguracji – Koszt wymiany danych między filtrami źródło: java.sun.com Front Controller Front Controller • Problem: scentralizowany punkt obsługi wszystkich żądań w warstwie prezentacji • Siły – Wspólna logika sterująca dla wielu żądań – Oddzielenie logiki od widoku – Centralizacja i kontrola punktów dostępu • Rozwiązanie – Serwlet, JSP, ActionServlet, DispatcherServlet • Konsekwencje – Poprawa zarządzania i oddzielenie ról źródło: java.sun.com Service Locator Service Locator • Problem: proste wyszukiwanie usług i komponentów biznesowych • Siły – Centralizacja wyszukiwania usług i komponentów – Wykorzystanie interfejsu JNDI • Rozwiązanie – Klasa Java • Konsekwencje – Prosty i jednolity dostęp do komponentów i usług – Poprawa wydajności komunikacji sieciowej źródło: www.corej2eepatterns.com Session Façade Session Façade • Problem: udostępnienie komponentów i usług biznesowych zdalnym klientom • Siły – Brak zależności między klientem i warstwą biznesową – Centralizacja logiki biznesowej – Ukrycie zależności w warstwie biznesowej • Rozwiązanie – Sesyjny komponent EJB • Konsekwencje – Poprawa wszystkich aspektów aplikacji źródło: www.corej2eepatterns.com Data Access Object Data Access Object • Problem: ukrycie logiki dostępu do danych • Siły – Oddzielenie warstwy danych od reszty aplikacji – Jednolity interfejs do różnych źródeł danych • Rozwiązanie – Klasa Java • Konsekwencje – Ukrycie schematów danych – Hermetyzacja dostępu do danych w postaci osobnej warstwy źródło: www.corej2eepatterns.com Materiały dodatkowe • "Core J2EE Wzorce projektowe", D.Alur, J.Crupi, D.Malks, ISBN 83-7361-344-7, Helion 2004 • Sun Developer Network, http://sun.java.com/blueprints/patterns • Core J2EE Patterns, http://www.corej2eepatterns.com