Zaawansowane Aplikacje Internetowe



Podobne dokumenty
SPRING FRAMEWORK. dr inż. Jakub Chłapioski

Wprowadzenie do projektu QualitySpy

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Modele danych walidacja widoki zorientowane na model

Zaawansowane Aplikacje Internetowe

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Web frameworks do budowy aplikacji zgodnych z J2EE

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Obiektowy model dokumentu. Katedra Mikroelektroniki i Technik Informatycznych

SPRING FRAMEWORK. dr inż. Jakub Chłapioski

Spring Web MVC, Spring DI

Szkolenie wycofane z oferty

Zaawansowane Aplikacje Internetowe

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Aplikacje RMI

Programowanie obiektowe

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Informatyzacja Przedsiębiorstw

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Informatyzacja Przedsiębiorstw

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Backend Administratora

Serwery aplikacji. dr Radosław Matusik. radmat

Przykłady pytań do zaliczenia programu wykonywanego w ramach zajęć laboratoryjnych 6-8 z Programowania komponentowego w Javie. Zofia Kruczkiewicz

Smarty PHP. Leksykon kieszonkowy

Klasy cd. Struktury Interfejsy Wyjątki

Rozdział 4 KLASY, OBIEKTY, METODY

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Analiza i projektowanie aplikacji Java

Pakiety i interfejsy. Tomasz Borzyszkowski

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Wprowadzenie do programowania aplikacji mobilnych

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Kurs walut. Specyfikacja projektu. Marek Zając

Wywoływanie metod zdalnych

Programowanie w Sieci Internet filtry oraz web.xml. Kraków, 11 stycznia 2013 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie obiektowe

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Zdarzenia Klasa Application Powiadomienia Toast AlertDialog

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie MorphX Ax

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1

Laboratorium 7 Blog: dodawanie i edycja wpisów

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Podstawy JavaScript ćwiczenia

Załącznik techniczny przedmiotu zamówienia komponentu

Programowanie w Javie

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Programowanie w Javie 2. Płock, 26 luty 2014 r.

Przewodnik użytkownika (instrukcja) AutoMagicTest

WOJEWÓDZTWO PODKARPACKIE

Poznań Java User Group Java Server Faces. Wprowadzenie (Fakty i Mity)

Język Java część 2 (przykładowa aplikacja)

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Współpraca z platformą Emp@tia. dokumentacja techniczna

Java Server Faces narzędzie do implementacji w wy prezentacji

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

EXSO-CORE - specyfikacja

Web frameworks do budowy aplikacji zgodnych z J2EE. Jacek Panachida

Dlaczego GML? Gdańsk r. Karol Stachura

Programowanie obiektowe

Testowanie elementów programowalnych w systemie informatycznym

Wypożyczalnia VIDEO. Technologie obiektowe

Dokumentacja końcowa projektu z ZPR

REFERAT O PRACY DYPLOMOWEJ

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

Generated by Foxit PDF Creator Foxit Software For evaluation only. System Szablonów

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Wybrane zmiany wprowadzone w pakiecie Oprogramowanie: WUP-Viator

DOKUMENTY Z RECEPT RAPORT XML

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

MVVM Light Toolkit. Julita Borkowska

Instrukcja generowania certyfikatu PFRON i podpisywania dokumentów aplikacji SODiR w technologii JS/PKCS 12

BAZY DANYCH MAKRA I PRZYCISKI. Microsoft Access. Adrian Horzyk. Akademia Górniczo-Hutnicza

Wykład 7: Pakiety i Interfejsy

Wywoływanie metod zdalnych

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Współpraca z platformą dokumentacja techniczna

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Instrukcja integratora - obsługa dużych plików w epuap2

Wykład 8: Obsługa Wyjątków

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wykład 8: klasy cz. 4

Instrukcja użytkowania

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie Komponentowe WebAPI

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Transkrypt:

Zaawansowane Aplikacje Internetowe Katedra Mikroelektroniki i Technik Informatycznych Politechniki Łódzkiej ul. Wólczanska 221/223 budynek B18, 90-924 Łódź mgr inż. Robert Ritter

4. Spring Framework Internacjonalizacja Zdarzenia Walidacja Konwersja

Internacjonalizacja 3 mgr inż. Robert Ritter, ritter@dmcs.pl Interfejs ApplicationContext rozszerza interfejs MessageSource MessageSource zawiera metody: o String getmessage(string code, Object[] args, String default, Locale locale) o String getmessage(string code, Object[] args, Locale locale) throws NoSuchMessageException o String getmessage(messagesourceresolvable resolvable, Locale locale) Po załadowaniu ApplicationContext w konfiguracji wyszukiwany jest automatycznie bean o nazwie "messagesource" W przypadku znalezienia odpowiedniego beanu wywołania w/w metod w ApplicationContext przekierowane zostaną do metod w beanie W przypadku gdy nie zostanie znaleziony odpowiedni bean metody przekierowywane są do pustego DelegatingMessageSource

Internacjonalizacja (2) 4 mgr inż. Robert Ritter, ritter@dmcs.pl Spring dostarcza zasadniczo dwu różnych implementacji interfejsu MessageSource: ResourceBundleMessageSource i StaticMessageSource Obydwie implementacje oparte są o interfejs HierarchicalMessageSource, co pozwala na stosowanie hierarchicznej struktury obiektów MessageSource StaticMessageSource rzadko używana implementacja pozwalająca na modyfikację wielojęzycznych komunikatów z poziomu programu ResourceBundleMessageSource najczęściej stosowana implementacja wykorzystująca komunikaty wielojęzyczne zapisane w plikach.properties

Internacjonalizacja (3) 5 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład konfiguracji ResourceBundleMessageSource

Internacjonalizacja (4) 6 mgr inż. Robert Ritter, ritter@dmcs.pl Przykładowe pliki.properties z komunikatami

Internacjonalizacja (5) 7 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład użycia w kodzie

Internacjonalizacja (6) 8 mgr inż. Robert Ritter, ritter@dmcs.pl Dla każdej obsługiwanej wersji językowej należy przygotować osobne pliki.properties, dodając do ich nazwy identyfikator lokalizacji, np.:

Internacjonalizacja (7) 9 mgr inż. Robert Ritter, ritter@dmcs.pl Lokalizacja (wersja językowa) może zostać ustawiona w środowisku w taki sam sposób jak w typowych aplikacjach Java np. programowo poprzez Locale.setDefault() lub poprzez przełączniki dla maszyny wirtualnej W metodach MessageSource można też jawnie wskazać lokalizację, podając obiekt Locale jako parametr W aplikacjach internetowych Spring MVC lub Spring WebFlow wersja językowa jest domyślnie pobierana z żądania od klienta i odpowiada zazwyczaj lokalizacji ustawionej w jego przeglądarce

Internacjonalizacja (8) 10 mgr inż. Robert Ritter, ritter@dmcs.pl Jako alternatywę dla ResourceBundleMessageSource można zastosować też klasę ReloadableResourceBundleMessageSource, którą wzbogacono o: o możliwość wczytywania plików.properties z dowolnego miejsca w systemie plików, a nie tylko z classpath o możliwość wielokrotnego ładowania plików z komunikatami w trakcie działania aplikacji

Zdarzenia 11 mgr inż. Robert Ritter, ritter@dmcs.pl Obsługa zdarzeń w Spring oparta jest o implementację interfejsu ApplicationListener oraz klasę ApplicationEvent zgodnie z typowym wzorcem projektowym Observer Wszystkie beany w kontenerze, które implementują interfejs ApplicationListener, są automatycznie powiadamiane o zdarzeniach w Spring

Zdarzenia (2) 12 mgr inż. Robert Ritter, ritter@dmcs.pl Zdarzenia wbudowane: o ContextRefreshedEvent zdarzenie zachodzi po wczytaniu konfiguracji do ApplicationContext, przy uruchamianiu lub po użyciu metody refresh() z ConfigurableApplicationContext o ContextStartedEvent zdarzenie zachodzi po wykonaniu metody start() z ConfigurableApplicationContext(Lifecycle) o ContextStoppedEvent zdarzenie zachodzi po wykonaniu metody stop() z ConfigurableApplicationContext o ContextClosedEvent zdarzenie zachodzi po wykonaniu metody close() z ConfigurableApplicationContext o RequestHandledEvent zdarzenie ma miejsce po obsłużeniu żądania HTTP, dotyczy tylko aplikacji używających DispatcherServlet

Zdarzenia (3) 13 mgr inż. Robert Ritter, ritter@dmcs.pl Aby zdefiniować własny rodzaj zdarzenia należy rozszerzyć klasę ApplicationEvent, np.:

Zdarzenia (4) 14 mgr inż. Robert Ritter, ritter@dmcs.pl Aby wywołać wystąpienie zdarzenia należy wywołać metodę publishevent() z interfejsu ApplicationEventPublisher Aby pobrać implementację tego interfejsu w beanie można posłużyć się interfejsem ApplicationEventPublisherAware

Zdarzenia (5) 15 mgr inż. Robert Ritter, ritter@dmcs.pl Aby przechwycić wystąpienie zdarzenia należy zaimplementować w klasie beanu obsługującego zdarzenie interfejs ApplicationListener, np.:

Zdarzenia - podsumowanie 16 mgr inż. Robert Ritter, ritter@dmcs.pl Mechanizm propagacji zdarzeń w Spring jest prosty i skuteczny w wielu zastosowaniach, ale posiada też ograniczenia: o zgłaszanie zdarzeń następuje synchronicznie, metoda publishevent blokuje do czasu obsłużenia zdarzenia przez wszystkie beany nasłuchujące (można to w razie konieczności usprawnić poprzez ApplicationEventMulticaster) o zdarzenia są propagowane w obrębie jednego ApplicationContext Jeżeli aplikacja wymaga lepszego mechanizmu komunikacji (np. pomiędzy procesami) istnieje oddzielnie rozwijany projekt Spring Integration o dużo bogatszych możliwościach

Dostęp do zasobów 17 mgr inż. Robert Ritter, ritter@dmcs.pl Aby pokonać ograniczenia standardowej klasy java.util.url w Spring zaprojektowano alternatywny sposób dostępu do zasobu, poprzez zunifikowany interfejs Resource

Dostęp do zasobów (2) 18 mgr inż. Robert Ritter, ritter@dmcs.pl Uniwersalny interfejs Resource posiada szereg implementacji które wiążą go z określonym typem zasobu: o UrlResource klasa opakowuje java.net.url i umożliwia dostęp do zasobów które mogą być zaprezentowane przez URL (pliki, zasoby http, zasoby ftp itd.). Jest to domyślnie używana implementacja o ClassPathResource klasa umożliwia dostęp do plików względem tzw. classpath. Aby wskazać poprzez ścieżkę do zasobu tą implementację można posłużyć się prefiksem "classpath:", np.: "classpath:/pl/dmcs/plik.txt" o FileSystemResource klasa opakowuje java.io.file, umożliwia dostęp do plików o ServletContextResource klasa umożliwia dostęp do plików względem katalogu głównego aplikacji internetowej

Dostęp do zasobów (3) 19 mgr inż. Robert Ritter, ritter@dmcs.pl o InputStreamResource klasa pozwala na opakowanie otwartego już strumienia InputStream o ByteArrayResource implementacja umożliwia wygodne opakowanie bufora danych w funkcjonalność Resource

Dostęp do zasobów (4) 20 mgr inż. Robert Ritter, ritter@dmcs.pl Obiekty które wczytują zasoby mogą implementować interfejs ResourceLoader

Dostęp do zasobów (5) 21 mgr inż. Robert Ritter, ritter@dmcs.pl Wszystkie implementacje ApplicationContext implementują również ResourceLoader, zatem w zależności od rodzaju implementacji ApplicationContext, metoda getresource() będzie generowad określony typ zasobów, np.: o Dla ClassPathXmlApplicationContext getresource() będzie zwracać obiekty klasy ClassPathResource o Dla FileSystemXmlApplicationContext getresource() będzie zwracać obiekty klasy FileSystemResource o Dla WebXmlApplicationContex tgetresource() będzie zwracać obiekty klasy ServletContextResource Oczywiście można również wymusić określony typ zasobu identyfikując go przez specyficzny prefiks w nazwie, np.: "file:/sciezka/plik.txt" (UrlResource) lub "classpath:/sciezka/plik.txt" (ClassPathResource)

Walidacja 22 mgr inż. Robert Ritter, ritter@dmcs.pl Mechanizm walidacji w Spring Framework został zaprojektowany w sposób umożliwiający oddzielenie tej funkcjonalności od warstwy interfejsu użytkownika i traktowanie jej jako części logiki biznesowej Walidacja obiektów domenowych odbywa się poprzez implementacje interfejsu Validator Błędy walidacji zapisywane są w obiekcie implementującym interfejs Errors

Walidacja (2) 23 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład walidacji obiektu domenowego:

Walidacja (3) 24 mgr inż. Robert Ritter, ritter@dmcs.pl Przy walidacji bardzo użyteczna jest klasa ValidationUtils wyposażona w metody statyczne upraszczające sprawdzanie braków w danych: o invokevalidator(validatorvalidator, Object obj, Errors errors) wywołanie innego walidatora o rejectifempty(errors errors, String field, String errorcode) zarejestrowanie błędu gdy pole "field" jest puste (null lub "" dla String) o rejectifemptyorwhitespace(errors errors, String field, String errorcode) j.w. przy czym pole nie może też zawierać samych białych znaków Metody ValidationUtils.reject nie wymagają podania jawnie walidowanego obiektu, ponieważ jest on również dostępny przez metodę gettarget() w Errors

Walidacja (4) 25 mgr inż. Robert Ritter, ritter@dmcs.pl Interfejs Errors posiada również metody przydatne przy walidacji obiektów zagnieżdżonych, np.:

BeanWrapper 26 mgr inż. Robert Ritter, ritter@dmcs.pl Podstawą funkcjonalności bindowania (mapowania pól np. z interfejsu użytkownika do pól w obiektach domenowych) jest implementacja interfejsu BeanWrapper Interfejs BeanWrapper posiada metody oparte o semantykę ścieżki do pola, umożliwiające: o sprawdzanie jakie pola zawiera dany obiekt lub obiekty w nim zagnieżdżone o weryfikację czy dane pole jest do odczytu/zapisu o pobranie/ustawienie wartości pola lub wielu na raz w danym obiekcie lub w obiektach w nim zagnieżdżonych

BeanWrapper (2) 27 mgr inż. Robert Ritter, ritter@dmcs.pl Składniowo ścieżka do pól może mieć postać: o "nazwa" odpowiada pojedynczemu polu w klasie z metodami getnazwa() lub isnazwa() oraz setnazwa() o "adres.ulica" odpowiada polu "ulica" w zagnieżdżonym obiekcie "adres", czyli metodami getadres().getulica() i getadres().setulica() o "miesiac[2]" odpowiada 3 elementowi tablicy lub kolekcji "miesiąc" o "miesiac[sty]" odpowiada elementowi mapy o nazwie "miesiąc" i kluczu "Sty"

BeanWrapper (3) 28 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład użycia:

Konwersja 29 mgr inż. Robert Ritter, ritter@dmcs.pl W Spring Framework do konwersji obiektów do reprezentacji w formie łańcucha znaków i odwrotnej używa się mechanizmu JavaBeans opartego o interfejs java.beans.propertyeditor Spring zawiera implementację wielu konwerterów opartych o PropertyEditor, które służą do konwersji popularnych typów Aby zmienić sposób konwersji określonego typu na String można zaimplementować własny konwerter

Konwersja (2) 30 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład konwertera:

Konwersja (3) 31 mgr inż. Robert Ritter, ritter@dmcs.pl Istnieje kilka możliwości zarejestrowania klasy PropertyEditor w aplikacji: o Automatyczna rejestracja klas PropertyEditor dla klas znajdujących się w tym samym pakiecie (np. app.domena.osoba i app.domena.osobaeditor) o Poprzez implementację metody getpropertydescriptors() z interfejsu BeanInfo zgodnie ze specyfikacją JavaBeans o Poprzez wykorzystanie post-procesora CustomEditorConfigurer

Konwersja (4) 32 mgr inż. Robert Ritter, ritter@dmcs.pl Poprzez implementację interfejsu PropertyEditorRegistrar

Konwersja (5) 33 mgr inż. Robert Ritter, ritter@dmcs.pl Nowocześniejszą alternatywą dla mechanizmu opartego o PropertyEditor jest funkcjonalność konwersji dostępna w Spring Framework od wersji 3, opartą o interfejs Converter Konwertery implementujące Converter muszą być thread-safe Metoda convert nigdy nie będzie wywołana z pustym argumentem (null), nie jest konieczne zabezpieczanie kodu pod tym względem Dla niewłaściwej wartości source należy wyrzucić wyjątek IllegalArgumentException Metoda convert może rzucać dowolne wyjątki

Konwersja (6) 34 mgr inż. Robert Ritter, ritter@dmcs.pl Przykładowy konwerter:

Konwersja (7) 35 mgr inż. Robert Ritter, ritter@dmcs.pl W przypadku gdy konieczna jest kontrola konwersji dla całej hierarchii klas można zaimplementować interfejs ConverterFactory

Konwersja (8) 36 mgr inż. Robert Ritter, ritter@dmcs.pl Typowy przykład użycia ConverterFactory to implementacja StringToEnumConverterFactory do konwersji obiektów typów wyliczeniowych java.lang.enum do String

Konwersja (9) 37 mgr inż. Robert Ritter, ritter@dmcs.pl Dla bardziej skomplikowanych przypadków konwersji można wykorzystać funkcjonalność interfejsu GenericConverter lub ConditionalGenericConverter (dla konwersji warunkowej)

Konwersja (10) 38 mgr inż. Robert Ritter, ritter@dmcs.pl Konwersja dokonywana jest za pośrednictwem interfejsu ConversionService

Konwersja (11) 39 mgr inż. Robert Ritter, ritter@dmcs.pl Najczęściej klasy implementujące ConversionService implementują również ConverterRegistry

Konwersja (12) 40 mgr inż. Robert Ritter, ritter@dmcs.pl Spring Framework dostarcza kilka gotowych implementacji ConversionService Aby zastosować domyślną implementację można wykorzystać bean ConversionServiceFactoryBean lub FormattingConversionServiceFactoryBean Jeżeli w konfiguracji kontenera nie zostanie zarejestrowany bean implementujący ConversionService, w aplikacji wykorzystywany będzie starszy mechanizm konwersji przez obiekty PropertyEditor

Konwersja (13) 41 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład wykorzystania ConversionService w kodzie:

Formatowanie 42 mgr inż. Robert Ritter, ritter@dmcs.pl Nowy mechanizm konwersji jest ogólnego przeznaczenia i posiada znacznie bardziej uniwersalny charakter niż konwersja przy pomocy obiektów PropertyEditor W wielu aplikacjach podstawowym zastosowaniem konwersji jest formatowanie wartości pól obiektów domenowych (daty, kwoty, itd.) na widokach interfejsu użytkownika (np. strony HTML, raporty PDF itd.) oraz przetwarzanie wartości wprowadzonych przez użytkownika (np. poprzez formularz HTML) Formatowanie pól jest możliwe do zrealizowania przy pomocy nowego mechanizmu konwersji, jednak nie bezpośrednio, np. nie ma prostej możliwości określenia w konwerterze lokalizacji Dlatego też do tego problemu przygotowano osobne rozwiązanie

Formatowanie (2) 43 mgr inż. Robert Ritter, ritter@dmcs.pl Do formatowania wykorzystuje się obiekty implementujące interfejs Formatter

Formatowanie (3) 44 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład formatera dla java.util.date:

Formatowanie (4) 45 mgr inż. Robert Ritter, ritter@dmcs.pl Największą innowacją związaną z nowym mechanizmem formatowania jest możliwość konfiguracji formaterów w oparciu o adnotacje w klasach domenowych

Formatowanie (5) 46 mgr inż. Robert Ritter, ritter@dmcs.pl Definiowanie własnych adnotacji dla formaterów jest możliwe poprzez implementację AnnotationFormatterFactory

Formatowanie (6) 47 mgr inż. Robert Ritter, ritter@dmcs.pl Aby zarejestrować klasy Formatter oraz AnnotationFormatterFactory należy odwołać się do implementacji interfejsu FormatterRegistry Najczęściej interfejs FormatterRegistry jest implementowany przez klasę implementującą ConversionService Przykład gotowej implementacji to FormattingConversionService

Formatowanie (7) 48 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład przypisania adnotacji do formatera

Formatowanie (8) 49 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład przypisania adnotacji do formatera (c.d.)

Formatowanie (9) 50 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład przypisania adnotacji do formatera (c.d.)

Formatowanie (10) 51 mgr inż. Robert Ritter, ritter@dmcs.pl Przykładowa konfiguracja formatowania z ustawieniami domyślnymi dla SpringMVC (domyślne formatery i wsparcie dla @NumberFormat oraz @DateTimeFormat)

Formatowanie (11) 52 mgr inż. Robert Ritter, ritter@dmcs.pl Aby stosować niestandardowe formatery i adnotacje należy wskazać w konfiguracji SpringMVC bean ConversionService, w którym je zarejestrowano, np.:

Formatowanie (12) 53 mgr inż. Robert Ritter, ritter@dmcs.pl Aby stosować niestandardowe formatery i adnotacje należy wskazać w konfiguracji SpringMVC bean ConversionService, w którym je zarejestrowano, np.:

Walidacja deklaratywna 54 mgr inż. Robert Ritter, ritter@dmcs.pl W Spring 3 wprowadzono również możliwość definiowania reguł walidacji poprzez adnotacje w kodzie domenowym (wg JSR-303) Specyfikacja JSR-303 pozwala w bardzo elastyczny sposób definiować i implementować własne reguły walidacji, ale jej złożoność wykracza znacznie poza ramy tego wykładu Implementacją referencyjną specyfikacji JSR-303 jest projekt HibernateValidator posiadający bogatą dokumentację

Walidacja deklaratywna (2) 55 mgr inż. Robert Ritter, ritter@dmcs.pl Aby korzystać z mechanizmu walidacji deklaratywnej wystarczy dodad w konfiguracji definicję beanu implementującego javax.validation.validatorfactory (np. LocalValidatorFactoryBean) Do działania wymagany jest HibernateValidator jako implementacja tej technologii

Walidacja deklaratywna (3) 56 mgr inż. Robert Ritter, ritter@dmcs.pl Do zdefiniowania własnej reguły walidacji (tzw. constraint) należy zdefiniować odpowiednią adnotację, np.:

Walidacja deklaratywna (4) 57 mgr inż. Robert Ritter, ritter@dmcs.pl Następnie należy zaimplementować ConstaintValidator

Walidacja deklaratywna (5) 58 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład użycia w kodzie:

Walidacja deklaratywna (6) 59 mgr inż. Robert Ritter, ritter@dmcs.pl W Spring MVC możliwe jest uruchomienie walidacji przy pomocy adnotacji @javax.validation.valid (zarówno dla walidacji w oparciu o org.springframework.validation.validator jak i JSR-303) o Błędy walidacji wg JSR-303 (ContraintViolation) są automatycznie opakowywane i dodawane jako błędy w BindingResult W pozostałych przypadkach użycia (np. w logice biznesowej) walidację uruchamia się jawnie o Dla walidacji Spring poprzez Validator.validate() o Dla JSR-303 poprzez ValidatorFactory.getValidator().validate()

Bindowanie 60 mgr inż. Robert Ritter, ritter@dmcs.pl Bindowanie w Spring dokonuje się przy użyciu klasy DataBinder W SpringMVC bindowanie dokonuje się najczęściej z użyciem odpowiednich adnotacji i zestawu tagów dla formularzy na stronach JSP, i nie ma potrzeby jawnie używać DataBinder Można również w szczególnych okolicznościach zastosować bindowanie z poziomu kodu

Spring Expression Language 61 mgr inż. Robert Ritter, ritter@dmcs.pl Język wyrażeń zaimplementowany w Spring jest podobny do JSP EL oraz innych implementacji o Umożliwia pobranie wartości pola obiektu (również zagnieżdżonego w innym obiekcie) poprzez getter o Wspiera indeksowanie pól kolekcji i map o Pozwala na wykonywanie operacji arytmetycznych o Umożliwia wywołanie metod obiektu oraz ustawianie wartości pól w obiektach o Wspiera automatyczne wyszukiwanie zmiennych w kontenerze IoC

Spring Expression Language (2) 62 mgr inż. Robert Ritter, ritter@dmcs.pl SpEL oferuje bardzo bogate możliwości i integruje się z nowym mechanizmem konwersji typów Spring Najczęściej używany jest do wyrażenia prostej logiki np. w konfiguracji XML Bardzo intensywnie jest też wykorzystywany w Spring Web Flow w definicjach przepływów w plikach *.flow.xml

Spring Expression Language (3) 63 mgr inż. Robert Ritter, ritter@dmcs.pl Możliwe jest również jego wykonanie z poziomu kodu Java

Spring Expression Language (4) 64 mgr inż. Robert Ritter, ritter@dmcs.pl W widokach JSP do wykonania wyrażeń w SpEL można użyć tagu <spring:eval> (od wersji Spring 3.0.1) Aby korzystać w JSP z nowego mechanizmu konwersji i formatowania Spring należy korzystać ze <spring:eval> zamiast standardowych wyrażeń EL