SPRING FRAMEWORK. dr inż. Jakub Chłapioski



Podobne dokumenty
Zaawansowane Aplikacje Internetowe

prepared by: Programowanie WWW Model-View-Controller

Spring Web MVC, Spring DI

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

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

prepared by: Programowanie WWW Servlety

Wzorce prezentacji internetowych

SPRING FRAMEWORK. dr inż. Jakub Chłapioski

Architektury Usług Internetowych. Laboratorium 1. Servlety

Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Aplikacje internetowe i rozproszone - laboratorium

Architektury Usług Internetowych. Laboratorium 1 Servlety

1 Wprowadzenie do J2EE

Java Server Faces - wprowadzenie

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

MVC w praktyce tworzymy system artykułów. cz. 2

Modele danych walidacja widoki zorientowane na model

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

Elementy JEE. 1. Wprowadzenie. 2. Prerekwizyty. 3. Pierwszy servlet. obsługa parametrów żądań 4. JavaServer Pages.

Serwery aplikacji. dr Radosław Matusik. radmat

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

Zagadnienia Programowania Obiektowego Agata Hejmej

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

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

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Podstawowe wykorzystanie Hibernate

Szkolenie wycofane z oferty

Zaawansowane Aplikacje Internetowe

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

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

Architektury Usług Internetowych. Laboratorium 2 RESTful Web Services

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Zaawansowane aplikacje WWW - laboratorium

Warszawa JUG. Struts 2 rusztowanie dla Łebu

JAVA NA SERWERZE SPRING. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

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

Piotr Laskowski Krzysztof Stefański. Java Servlets

Java wybrane technologie spotkanie nr 3. Serwlety

Wywoływanie metod zdalnych

Obiektowy model dokumentu. Katedra Mikroelektroniki i Technik Informatycznych

Infrastruktura aplikacji WWW

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Aplikacje WWW - laboratorium

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

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Java Server Faces narzędzie do implementacji w wy prezentacji

Kurs WWW 1. Paweł Rajba

Testowanie aplikacji Java Servlets

Stripes & Stripernate. Zbigniew Skowron 13 kwietnia 2007

Technologie internetowe ASP.NET Core. Paweł Rajba

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin


Tworzenie i wykorzystanie usług

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

Katalog książek cz. 2

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Zaawansowane Aplikacje Internetowe

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Enterprise JavaBeans (EJB)

Aplikacje WWW - laboratorium

Quiz Aplikacja internetowa

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Tworzenie aplikacji internetowych z wykorzystaniem szkieletu Spring. Paweł Ociepa, Paweł Pierzchała

Walidacja danych w ASP.NET MVC

Forum Client - Spring in Swing

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Wywoływanie metod zdalnych

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

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Aplikacje RMI

Programowanie warstwy klienta w aplikacji JavaEE

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Aplikacje internetowe - laboratorium

Laboratorium 7 Blog: dodawanie i edycja wpisów

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

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

Aplikacje RMI Lab4

Wprowadzenie do technologii JavaServer Faces 2.2 na podstawie Wykład 2 Technologie internetowe

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

Przegląd technologii JSP

Zajęcia 4 - Wprowadzenie do Javascript

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

Tomasz Dobek.

Remote Method Invocation 17 listopada 2010

Serwery aplikacji. dr Radosław Matusik. radmat

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

Podstawowe informacje o technologii Java Persistence API - przykład

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

STRUTS 2. Krystyna Bury Katarzyna Sadowska Joanna Pyc Politechnika Wrocławska Wydział Informatyki i Zarządzania Informatyka, III rok

HttpRequest Aplikacja Czat

Widoki zagnieżdżone, layout. 1. Wprowadzenie Repozytoria danych

Transkrypt:

SPRING FRAMEWORK Katedra Mikroelektroniki i Technik Informatycznych Politechniki Łódzkiej ul. Wólczanska 221/223 budynek B18, 90-924 Łódź dr inż. Jakub Chłapioski

3. Spring Web MVC

DispatcherServlet 3 Centralnym elementem architektury Spring Web MVC jest klasa DispatcherServlet, implementująca mechanizm przekierowania obsługi żądania HTTP do odpowiedniego kontrolera Ponadto klasa DispatcherServlet uruchamia ApplicationContext dla aplikacji internetowej oraz wstrzykuje go do ServletContext, pozwalając na łatwe odwołanie się do ApplicationContext z poziomu całej aplikacji opartej o servlety

DispatcherServlet (2) 4 Konfiguracja DispatcherServlet /WEB-INF/web.xml <?xml version="1.0" encoding="utf-8"?> <web-app>... <servlet> <servlet-name>sklep</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value> /WEB-INF/sklep-dao.xml /WEB-INF/sklep-service.xml /WEB-INF/sklep-mvc.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sklep</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping>... </web-app>

5 DispatcherServlet (3)

6 DispatcherServlet (4) W ogólności można w obrębie jednej aplikacji zdefiniowad wiele obiektów DispatcherServlet, z których każdy może posiadad osobną konfigurację dla ApplicationContext, jest to jednak rzadko spotykane rozwiązanie

Rodzaje komponentów 7 Spring Web MVC posiada kilka rodzajów beanów, służących do obsługi poszczególnych mechanizmów obsługi żadao HTTP Controllers - implementacja w aplikacji przepływu sterowania w aplikacji Handler mappings - nadzór i wykonanie pre- i post-procesingu oraz wywoływanie kontrolerów w obsłudze żadao w oparciu o zdefiniowane kryteria View resolvers - dostarczenie konkretnej implementacji widoku na podstawie jego logicznej nazwy Locale resolvers - dostarczenie danych o lokalizacji klienta Theme resolvers - dostarczenie informacji o stylu w jakim należy prezentowad klientowi widoki Multipart file resolver - wsparcie dla uploadu plików binarnych na serwer Handler exception resolvers - wsparcie dla mapowania widoków dla błędów (wyjątków) lub inne mechanizmy obsługi i raportowania błędów

Obsługa żądania HTTP 8 1. Do obiektu HttpServletRequest dołączany jest ApplicationContext w atrybucie o kluczu zdefinowanym w DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE 2. Do żądania przypisywany jest obiekt locale resolver jeśli jest używany 3. Do żadania przypisywany jest obiekt theme resolver (jeśli jest używany) 4. Jeśli jest obecny, żądanie jest analizowane przez multipart file resolver, jeżeli żądanie zawiera fragmenty pliku, obiekt żądania opakowywany jest w MultipartHttpServletRequest i przekazywany do dalszego przetwarzania 5. Poszukiwany jest odpowiedni handler dla żądania, jeżeli znaleziony to uruchamia on łaocuch przetwarzania w nim zdefiniowany (preprocesory, postprocesory, kontrolery) 6. Jeśli łaocuch przetwarzania zwróci model renderowany jest widok, w innym wypadku przetwarzanie jest zakooczone

Kontrolery 9 Spring w wersji od 2.5 pozwala na wygodne implementowanie kontrolerów jedynie przy pomocy adnotacji dla klas POJO Aby kontroler został dołączony do konfiguracji wystarczy zdefiniowad go jako zwykły bean @Controller public class WelcomeController { @RequestMapping("/welcome1") public ModelAndView welcome1 () { ModelAndView mav = new ModelAndView(); mav.setviewname("welcome"); //nazwa logiczna widoku mav.addobject("message", "Welcome!"); return mav; @RequestMapping("/welcome2") public String welcome2(modelmap model) { model.addattribute ("message", "Welcome!"); return "welcome"; //nazwa logiczna widoku

@RequestMapping 10 Adnotacja @RequestMapping umożliwia automatyczne zarejestrowanie kontrolera w mechanizmie mapowania ścieżki żądania do łaocucha przetwarzania @RequestMapping nad klasą kontrolera określa ścieżkę w URI dla wszystkich metod kontrolera @Controller @RequestMapping("\powitanie") public class WelcomeController { @RequestMapping("pierwsze") public ModelAndView welcome1 () { ModelAndView mav = new ModelAndView(); mav.setviewname("welcome"); //nazwa logiczna widoku mav.addobject("message", "Welcome!"); return mav; @RequestMapping("drugie") public String welcome2(modelmap model) { model.addattribute ("message", "Welcome!"); return "welcome"; //nazwa logiczna widoku

11 @RequestMapping (2) Można również zawężad wykonanie danej metody dla typu żądania (GET lub POST) oraz przypadku gdy w URL znajdują się określone parametry // metoda wykona się tylko dla metody GET i jeżeli w URL jest parametr akcja=znajdz @RequestMapping(value="\do", method=requestmethod.get, params="akcja=znajdz") public String znajdz() {... // wykona się jeżeli w URL jest parametr akcja o dowolnej wartości @RequestMapping(value="\do", params="akcja") public String akcja() {... // wykona się dla metody POST i jeżeli w URL nie ma parametru akcja @RequestMapping(value="\do", method=requestmethod.post, params="!akcja") public String reakcja() {...

12 @PathVariable Adnotacja @PathVariable pozwala na korzystanie z możliwości definiowania ścieżek URI w oparciu o wzory @Controller public class UserController { @RequestMapping(value="/users/{userId", method=requestmethod.get) public String showuser(@pathvariable String userid, Model model) { User user = userservice.find(userid); model.addattribute("user", user); return "showuser";

@ModelAttribute 13 Adnotacja @ModelAttribute umożliwia automatyczne bindowanie danych z formularzy do obiektów domenowych Przy stosowaniu tej adnotacji trzeba zwrócid uwagę na kolejnośd argumentów w adnotowanych metodach jeśli potrzebny jest obiekt BindingResult lub Errors (musi byd bezpośrednio po obiekcie bindowanym) @RequestMapping(method = RequestMethod.POST) public String process(@modelattribute("osoba") Osoba osoba, BindingResult result, Model model) {... // OK. @RequestMapping(method = RequestMethod.POST) public String process(@modelattribute("osoba") Osoba osoba, Errors errors, Model model) {... // OK. @RequestMapping(method = RequestMethod.POST) public String process(@modelattribute("osoba") Osoba osoba, Model model, BindingResult result) {... // ZLE!!!

@ModelAttribute (2) 14 Adnotacja @ModelAttribute zastosowana nad metodą umożliwia też automatyczne umieszczenie danych zwracanych przez metodę w modelu przed wywolaniem metod z @RequestMapping @Controller @RequestMapping("/osoba") public class OsobaController { //... @ModelAttribute("tytuly") public Collection<Tytul> wstawtytuly () { return this.tytulservice.getall(); @RequestMapping(method = RequestMethod.POST) public String submit(@modelattribute("osoba") Osoba osoba, Model model) { //...

15 @RequestParam Adnotacja @RequestParam umożliwia automatyczne mapowanie parametrów z żądania do zmiennych w kodzie Java @RequestMapping(method = RequestMethod.GET) public String show(@requestparam("userid") int userid, ModelMap model) { User user = userservice.get(userid); model.addattribute("user", user); return "userform";

16 @RequestBody Adnotacja @RequestBody umożliwia dostęp do zawartości (body) żądania HTTP @RequestMapping(value = "/upload", method = RequestMethod.PUT) public void zapisz(@requestbody String body, Writer writer) throws IOException { writer.write(body);

17 @RequestHeader Zastosowanie adnotacji @RequestHeader umożliwia dostęp do wartości określonych w nagłówku żądania HTTP @RequestMapping("/sciezka") public void analizujnaglowek(@requestheader("accept-encoding") String encoding, @RequestHeader("Keep-Alive") long keepalive) { //...

18 @ResponseBody Adnotacja @ResponseBody umożliwia umieszczenie danych bezpośrednio w odpowiedzi na żądanie HTTP @RequestMapping(value = "/raport", method = RequestMethod.PUT) @ResponseBody public String raport() { return "Raport miesieczny";

19 HttpEntity<?> Zastosowanie HttpEntity<?> umożliwia łatwy dostęp do poszczególnych elementów składowych żądao i dopowiedzi HTTP (nagłówki, parametry, zawartości itd.) @RequestMapping("/raport") public ResponseEntity<String> handle(httpentity<byte[]> requestentity) { String requestheader = requestentity.getheaders().getfirst("etag")); byte[] requestbody = requestentity.getbody(); //... HttpHeaders responseheaders = new HttpHeaders(); responseheaders.set("etag", requestheader); return new ResponseEntity<String>("Tekst odpowiedzi", responseheaders, HttpStatus.CREATED);

20 @SessionAttribute Do przechowywania zmiennych w sesji można używad adnotacji @SessionAttribute @Controller @RequestMapping("/osoba") @SessionAttribute("osoba") public class OsobaController { //... @RequestMapping(method = RequestMethod.POST) public String submit(@modelattribute("osoba") Osoba osoba, SessionStatus status) { //... status.setcomplete(); // usuniecie zmiennych sesyjnych kontrolera

21 @CookieValue Adnotacja @CookieValue jest stosowana do pobrania wartości parametru cookie z żądania HTTP @RequestMapping("/sciezka") public void processsessioninfo(@cookievalue("jsessionid") String cookie) { //...

@InitBinder 22 Dzięki adnotacji @InitBinder można dokonad dodatkowej inicjalizacji obiektu WebDataBinder zanim uruchomiony zostanie proces bindowania danych z żądania do modelu Możliwe jest również zaimplementowanie w tym celu beanu WebBindingInitializer dla wszystkich kontrolerów Prawidłowa inicjalizacja bindera jest bardzo ważna ze względu na bezpieczeostwo danych @Controller public class OsobaController { @InitBinder public void initbinder(webdatabinder binder) { binder.setallowedfields({"imie", "nazwisko"); // bindownie tylko wybranych pol binder.setrequiredfields({"imie"); // blad w przypadku braku okreslonych pol //...

Mapowanie żądao 23 Przed wersją 2.5 w Spring MVC konieczne było jawne zdefiniowanie beanu(ów) implementujących interfejs HandlerMapping dokonujących mapowania żądao do kontrolerów Od wersji 2.5 w DispatcherServlet domyślnie używany jest bean klasy DefaultAnnotationHandlerMapping, który wyszukuje w kontenerze Spring beany o stereotypie @Controller z adnotacją @RequestMapping i na tej podstawie dokonuje mapowania żądao W większości przypadków nie jest konieczna ingerencja w domyślne ustawienia tego beanu, jest to jednak możliwe, np.: <bean id="handlermapping" class="org.springframework.web.servlet.mvc.annotation.defaultannotationhandlermapping"> <property name="interceptors"> <bean class="example.myinterceptor"/> </property> </bean>

Interceptory 24 W proces mapowania żądao do kontrolerów można również dołączad tzw. interceptory dokonując pre- lub postprocesingu żądao Interceptory musza implementowad interfejs HandlerInterceptor public interface HandlerInterceptor { boolean prehandle(httpservletrequest request, HttpServletResponse response, Object handler) throws Exception; void posthandle(httpservletrequest request, HttpServletResponse response, Object handler, ModelAndView modelandview) throws Exception; void aftercompletion(httpservletrequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

Dopasowywanie widoków 25 Nazwa widoku zwracana w ModelAndView przez kontroler obsługujący dane żądanie jest w istocie nazwą logiczną Aby dopasowad konkretną implementację widoku do jego nazwy logicznej w Spring MVC stosowane są beany implementujące interfejs ViewResolver public interface ViewResolver { View resolveviewname(string viewname, Locale locale) throws Exception;

Dopasowywanie widoków (2) 26 Spring MVC zawiera cały szereg implementacji interfejsu ViewResolver, pozwalających na integrację z widokami JSP, Velocity, XSLT, itd. Beany ViewResolver można również łączyd w łaocuchy, gdzie w przypadku gdy dany ViewResolver nie dopasuje widoku do nazwy, wywołany zostanie kolejny, itd. Większośd implementacji ViewResolver implementuje Ordered <!-- InternalResourceViewResolver jest automatycznie dodawany na koncu lancucha --> <bean id="jspviewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/> <property name="prefix" value="/web-inf/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="excelviewresolver" class="org.springframework.web.servlet.view.xmlviewresolver"> <property name="order" value="1"/> <!-- z interfejsu Ordered --> </bean>

Dopasowywanie widoków (3) 27 Spring MVC zawiera cały szereg implementacji interfejsu ViewResolver, pozwalających na integrację z widokami JSP, Velocity, XSLT, itd. XmlViewResolver - implementacja pozwalająca na konfigurację w oddzielnym pliku XML (domyślnie /WEB-INF/views.xml) ResourceBundleViewResolver - implementacja z konfiguracją w postaci plików.properties UrlBasedViewResolver - implementacja, w której dopasowanie widoku odbywa się na podstawie URL żądania InternalResourceViewResolver VelocityViewResolver FreeMarkerViewResolver ContentNegotiatingViewResolver - dopasowanie widoku na podstawie nazwy pliku lub nagłówków w żądaniu

28 Generowanie widoków W zależności od typu widoku przekierowanie sterowania do widoku zachodzi przy wykorzystaniu RequestDispatcher.forward() lub RequestDispatcher.include() z Servlet API (np. widoki JSP) lub poprzez bezpośrednie zapisanie widoku w HttpServletResponse (np. Velocity)

Przekierowanie HTTP 29 W razie potrzeby wykonania przekierowania HTTP można w kontrolerze utworzyd gotową implementację widoku z wykorzystaniem klasy RedirectView, co pozwoli na pominięcie standardowego mechanizmu i wykonanie przekierowania przez HttpServletResponse.sendRedirect() Podobny efekt można uzystad poprzez użycia prefiksu "redirect:" w nazwie logicznej widoku @Controller public class OsobaController { @RequestMapping("/osoba") public ModelAndView pokaz(@requestparam("id") Long id) { Osoba osoba = osobaservice.get(id); if (osoba!= null) { return new ModelAndView("osobaForm"); else { return new ModelAndView(new RedirectView("/blad.html"));

30 Przekierowanie HTTP (2) Przekierowanie można również uzyskad poprzez użycie prefiksu "redirect:" w nazwie logicznej widoku // przekierowanie względem kontekstu servletu return new ModelAndView("redirect:/blad.html"); // przekierowanie absolutne return new ModelAndView("redirect:http://www.domena.pl/blad.html");

Internacjonalizacja 31 W trakcie obsługi żądania DispatcherServlet wykorzystuje LocaleResolver (jeżeli zdefiniowano) do ustalenia wersji językowej aplikacji AcceptHeaderLocaleResolver - wersja językowa ustalana na podstawie nagłówka "accept-language" w żądaniu CookieLocaleResolver - wersja językowa ustalana na podstawie wartości cookie SessionLocaleResolver - wersja językowa ustalana na podstawie zmiennej sesyjnej Bieżące ustawienie wersji językowej można odczytad poprzez RequestContext.getLocale()

Internacjonalizacja (2) 32 Aby zaimplementowad funkcjonalnośd wybierania wersji językowej w aplikacji przez użytkownika można wykorzystad LocaleChangeInterceptor Przykładowy URL: www.domena.pl/osoba?id=1&lang=en_us <bean id="localechangeinterceptor" class="org.springframework.web.servlet.i18n.localechangeinterceptor"> <property name="paramname" value="lang"/> </bean> <bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver"/> <bean id="urlmapping" class="org.springframework.web.servlet.mvc.annotation.defaultannotationhandlermapping"> <property name="interceptors"> <list> <ref bean="localechangeinterceptor"/> </list> </property> </bean>

Motywy 33 Aby dodad w aplikacji wsparcie dla motywów należy dodad do kontenera bean implementujący interfejs org.springframework.ui.context.themesource Domyślnie wykorzystywana klasa WebApplicationContext implementuje również ThemeSource, jednak deleguje tą funkcjonalnośd do konkretnej implementacji, domyślnie ResourceBundleThemeSource Aby wykorzystad inną implementację ThemeSource wystarczy dodad ją do kontenera, przy uruchomieniu WebApplicationContext zostanie ona wykorzystana zamiast domyślnej

Motywy (2) 34 Przykład użycia motywów zdefiniowanych w plikach.properties z wykorzystaniem ResourceBundleThemeSource /WEB-INF/classes/czarny.properties tlo=/resources/czarny/tlo.jpg glownystyl=/resources/czarny/glowny.css /WEB-INF/classes/ bialy.properties tlo=/resources/bialy/tlo.jpg glownystyl=/resources/bialy/glowny.css /WEB-INF/jsp/index.jsp <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <html> <head> <link rel="stylesheet" href="<spring:theme code='glownystyl'/>" type="text/css"/> </head> <body style="background=<spring:theme code='tlo'/>"> <center>witaj</center> </body> </html>

Motywy (3) 35 Implementacja ResourceBundleThemeSource umożliwia definiowanie osobnych motywów dla różnych wersji językowych analogicznie jak w przypadku MessageSource, poprzez dodanie nazwy wersji językowej do nazwy pliku, np.: /WEB-INF/classes/bialy_pl_PL.properties /WEB-INF/classes/bialy_en_US.properties

Motywy (4) 36 Do ustalenia bieżącego motywu wykorzystywane są implementacje interfejsu ThemeResolver (analogicznie jak w przypadku LocaleResolver) FixedThemeResolver - implementacja w której bieżący motyw zdefiniowany jest statycznie (przydatne do testowania) SessionThemeResolver - bieżący motyw zdefiniowany w zmiennej sesyjnej CookieThemeResolver - bieżący motyw zapisany w pliku cookie w przeglądarce klienta Ponadto można też wykorzystad ThemeChangeInterceptor do zmiany motywu przy pomocy parametru URL (analogicznie jak w przypadku LocaleChangeInterceptor)

Upload plików 37 Domyślnie DispatcherServlet nie dokonuje automatycznego łączenia wielu żądao zawierających fragmenty przesyłanego pliku, ponieważ może zachodzid koniecznośd zaimplementowania nietypowego przetwarzania w aplikacji użytkownika DispatcherServlet wykrywa żądania typu multipart i kieruje ich przetwarzanie do implementacji interfejsu MultipartResolver jeżeli taka została dodana do kontenera MultipartResolver opakowuje HttpServletRequest w obiekt MultipartHttpServletRequest, który umożliwia odczytanie przesyłanego pliku

38 Upload plików (2) W Spring MVC zaimplementowano MultipartResolver w klasie CommonsMultipartResolver, wykorzystującej bibliotekę Apache Commons FileUpload (commons-fileupload.jar) która musi zostad dołączona do aplikacji <bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolver"> <property name="maxuploadsize" value="100000"/> </bean>

39 Upload plików (3) Przykład strony formularza do uploadu plików <html> <head> <title>wysyłanie pliku</title> </head> <body> <form method="post" action="/plik" enctype="multipart/form-data"> <input type="text" name="name"/> <input type="file" name="file"/> <input type="submit"/> </form> </body> </html>

40 Upload plików (4) Przykładowy kod kontrolera do obsługi wysyłania pliku na serwer @Controller public class PlikController { @RequestMapping(value = "/plik", method = RequestMethod.POST) public String plik(@requestparam("name") String name, @RequestParam("file") MultipartFile file) { if (!file.isempty()) { byte[] bytes = file.getbytes(); // zapisanie pliku return "redirect:/plikwyslany.html"; else { return "redirect:/bladwysylania.html";

Obsługa wyjątków 41 Spring MVC posiada mechanizm przekierowywania sterowania w sytuacjach wystąpienia określonych wyjątków. Mechanizm ten jest dużo bardziej elastyczny niż ten dostępny w Servlet API Do przekierowania sterowania dla wyjątków służą implementacje interfejsu HandleExceptionResolver public interface HandlerExceptionResolver { ModelAndView resolveexception(httpservletrequest request, HttpServletResponse response, Object handler, Exception ex);

42 Obsługa wyjątków (2) Dostępna jest klasa SimpleMappingExceptionResolver pozwalająca na zdefinowanie prostego mapowania nazw widoków do klasy wyjątku <bean id="exceptionmapping" class="org.springframework.web.servlet.handler.simplemappingexceptionresolver"> <property name="exceptionmappings"> <props> <prop key="example.exampleexception">exampleerror</prop> <prop key="java.lang.exception">error</prop> </props> </property> </bean>

Obsługa wyjątków (3) 43 Domyślnie w DispatcherServlet zdefiniowany jest DefaultHandlerExceptionResolver, w którym w przypadku określonych wyjątków Spring MVC ustawiany jest określony kod statusu HTTP w HttpServletResponse: ConversionNotSupportedException - 500 (Internal Server Error) HttpMediaTypeNotAcceptableException - 406 (Not Acceptable) HttpMediaTypeNotSupportedException - 415 (Not Supported) itd.

44 Obsługa wyjątków (4) Aby zdefiniowad obsługę wyjątku w kodzie kontrolera można posłużyd się adnotacją @ExceptionMapping @Controller public class PlikController { //... @ExceptionHandler(IOException.class) public String wyjatek(ioexception ex, HttpServletRequest request) { return "blad";

Konfiguracja 45 Aby ułatwid konfigurację Spring MVC w Spring w wersji 3 wprowadzono przestrzeo nazw XML o nazwie "mvc", w której zdefiniowano tagi ułatwiające proces konfiguracji: mvc:annotation-driven - do kontenera dodany zostanie DefaultAnnotationHandlerMapping i AnnotationMethodHandlerAdapter <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <mvc:annotation-driven conversionservice="..." /> </beans>

46 Konfiguracja (2) mvc:interceptors - umożliwia zdefiniowanie listy interceptorów dodawanych do wszystkich beanów implementujących HandlerMapping <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.localechangeinterceptor" /> <mvc:interceptor> <mapping path="/secure/*"/> <bean class="org.example.securityinterceptor" /> </mvc:interceptor> </mvc:interceptors>

47 Konfiguracja (3) mvc:view-controller - dodaje do kontenera ParameterizableViewController wykonujący bezpośrednie przekierowanie do widoku. <mvc:view-controller path="/index" view-name="index"/>

48 Konfiguracja (4) mvc:resources - umożliwia wykorzystanie klasy ResourceHttpRequestHandler do zoptymalizowanej obsługi statycznych zasobów aplikacji <mvc:resources mapping="/resources/**" location="/public-resources/"/>

49 Biblioteka tagów "form" Aby ułatwid definiowanie formularzy na stronach JSP odwzorowujących obiekty domenowe, przygotowano szereg użytecznych tagów zebranych w bibliotekę o nazwie "form" <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

Biblioteka tagów "form" (2) 50 Tag <form:form> pozwala zdefiniowad formularz HTML reprezentujący wskazany obiekt w modelu Poszczególne rodzaje pól formularza HTML uzyskuje się poprzez użycie tagów: input, checkbox, radiobutton, hidden, textarea Odpowiadające pole w obiekcie domenowym określa się poprzez atrybut "path" <form:form commandname="osoba" method="post" action="/osoba"> <form:label path="imie">imię:</form:label> <form:input path="imie" /><br/> <form:label path="nazwisko">nazwisko:</form:label> <form:input path="nazwisko" /></br> <input type="submit" value="wyślij" /> </form:form>

51 Biblioteka tagów "form" (3) Lista wyboru definiowana jest przez tag <form:select>, natomiast poszczególne wartości do wyboru można określid poprzez <form:option> lub <form:options> <form:form commandname="osoba" method="post" action="/osoba"> <form:select path="tytul" items="${tytuly"/> </form:form> <form:form commandname="osoba" method="post" action="/osoba"> <form:select path="tytul"> <form:options items="${tytuly"> <form:option value="inny"> </form:select> </form:form>

52 Biblioteka tagów "form" (4) Błędy bindowania i walidacji można zamieścid na formularzu przy pomocy tagu <form:errors> <form:form commandname="osoba" method="post" action="/osoba"> <form:label path="imie">imię:</form:label> <form:input path="imie" /> <form:errors path="imie" /><br/> <form:label path="nazwisko">nazwisko:</form:label> <form:input path="nazwisko" /> <form:errors path="nazwisko" /></br> <input type="submit" value="wyślij" /> </form:form>