Tworzenie aplikacji internetowych z wykorzystaniem szkieletu Spring Paweł Ociepa, Paweł Pierzchała ociepa.pawel@gmail.com paw.pierzchala@gmail.com 20.05.2010
Cel prezentacji Przedstawić Spring Framework w kontekście webowym, w jak najbardziej praktycznym aspekcie, przy ograniczeniu teorii do koniecznego minimum.
Agenda 1. Od czego zacząć? 2. Czym jest Spring? 3. Moduły Spring Framework 4. Struktura aplikacji 5. Kontener IoC & DI 6. Kontener IoC? Jaka różnica? 7. Dependency Injection w praktyce 8. Zasada działania Spring MVC 9. Wspieranie pracy ze Spring Framework 10. Kontrolery 11. Część praktyczna
Od czego zacząć? (1/2)
Od czego zacząć? (2/2) http://madeyski.e-informatyka.pl/download/tutorials/springwebappin5steps.pdf
Czym jest Spring? Spring jest to open-sourcowy framework dla platformy Java oraz.net (Spring.NET) do tworzenia różnego rodzaju aplikacji.
Moduły Spring Framework Kontener IoC Szablon programowania aspektowego Szablon dostępu do danych Szablon obsługi transakcji Szablon Model-Widok-Kontroler Szablon zdalnego dostępu Szablon autoryzacji i autentykacji Szablon zdalnego zarządzania JMX Szablon komunikatów JMS Szablon obsługi testowania
Struktura aplikacji
Kontener IoC & DI Dwa kluczowe zagadnienia: Kontener Inverse of Control (Fabryka Beanów) rdzeń Springa umożliwia realizację zależności między obiektami zarządza komponentami i ich zależnościami możliwa integracja z własnym projektem bez konieczności korzystania z całego frameworka Dependency Injection mechanizm wstrzykiwania zależności zapewnienie luźnych zależności (loose coupling) między klasami
Kontener IoC? Jaka różnica?
Dependency Injection w praktyce (1/4) public class JdbcBookDao implements BookDao { private BasicDataSource datasource; public JdbcBookDao() { datasource = new BasicDataSource(); datasource.setdriverclassname("com.mysql.jdbc.driver"); datasource.seturl("jdbc:mysql://localhost/javaexpress?autoreconnect=true"); datasource.setusername("username"); datasource.setpassword("password"); } //...inne metody } Sposobem na wyeliminowanie zależności z klasy jest stworzenie zależności poza klasą i wstrzyknięcie jej do środka.
Dependency Injection w praktyce (2/4) public class JdbcBookDao implements BookDao { private DataSource datasource; } public void setdatasource(datasource datasource) { this.datasource = datasource; } //...inne metody
Dependency Injection w praktyce (3/4) public class BookService { private JdbcBookDao bookdao; public BookService() { try { Properties props = new Properties(); props.load(new FileInputStream("dataSource.properties")); BasicDataSource datasource = new BasicDataSource(); datasource.setdriverclassname(props.getproperty("driverclassname")); datasource.seturl(props.getproperty("url")); datasource.setusername(props.getproperty("username")); datasource.setpassword(props.getproperty("password")); } } bookdao = new JdbcBookDao(); bookdao.setdatasource(datasource); } catch (IOException e) { e.printstacktrace(); }
Dependency Injection w praktyce (4/4) public class BookService { private BookDao bookdao; public void setbookdao(bookdao bookdao) { this.bookdao = bookdao; } } <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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.xsd"> <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="com.mysql.jdbc.driver" /> <property name="url" value="jdbc:mysql://localhost/javaexpress?autoreconnect=true" /> <property name="username" value="username" /> <property name="password" value="password" /> </bean> <bean id="bookdao" class="dao.jdbcbookdao"> <! (1) --> <property name="datasource" ref="datasource" /> </bean> <bean id="bookservice" class="service.bookservice"> <!-- (2) --> <property name="bookdao" ref="bookdao" /> </bean> </beans>
Zasada działania Spring MVC
Wspieranie pracy ze Spring Framework Eclipse: Spring IDE NetBeans: od wersji 6.1 zintegrowany moduł Springa
Kontrolery (1/3) AbstractController CommandController AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController MultiActionController
Kontrolery (2/3) CommandControllers AbstractCommandController wiązanie parametrów zadania ze wskazanym obiektem walidacja brak obsługi formularzy AbstractFormController obsługa formularzy Command Object / walidacja pól obsługa błędnie wysyłanych formularzy (resubmission)
Kontrolery (3/3) CommandControllers SimpleFormController Command Object (formbackingobject()) nazwa widoku po przetworzeniu formularza (success). walidacja AbstractWizardFormController lista widoków wchodzących w skład wizarda status: finish, cancel, page_change przechodzenie pomiędzy widokami w wizardzie (nawet gdy walidacja się nie powiodła dirty back, dirty forward ) zmiana kolejności stron / omijanie wybranych stron bieżący widok zapisany w sesji
Część praktyczna 1. Konfiguracja aplikacji w Springu przedstawiona na slajdach 1. Budowa aplikacji webowej opartej na tutorialu Aplikacja webowa z wykorzystaniem Spring Framework w 5 etapach. 1. Implementacja konkretnej funkcjonalności w aktualnie tworzonej aplikacji w Spring Framework System wspomagający konkurs Polskiego Towarzystwa Informatycznego na najlepszą pracę magisterską.
Część praktyczna Konfiguracja aplikacji w Springu Wymagania wstępne: Kontener aplikacji Apache Tomcat Dystrybucja Spring Framework with dependencies 2.5 (http://www.springsource.org/) Hibernate 3.5 (https://www.hibernate.org) Spring Security (http://static.springsource.org/spring-security/site/) Baza danych (w przykładzie PostgreSQL)
Część praktyczna Konfiguracja aplikacji w Springu Docelowy szkielet aplikacji powinien przedstawiać się następująco:
Część praktyczna Konfiguracja aplikacji w Springu W folderze WEB-INF dodajemy plik konfiguracyjny web.xml:
Część praktyczna Konfiguracja aplikacji w Springu Dodanie pierwszej strony index.jsp w nowo utworzonym folderze WEB-INF/jsp:
Po uruchomieniu: Część praktyczna Konfiguracja aplikacji w Springu
Część praktyczna Konfiguracja aplikacji w Springu Dodanie do pliku konfiguracyjnego web.xml DispatcherServlet oraz mapowania. (Dodany kod zaznaczony na czerwono.)
Część praktyczna Konfiguracja aplikacji w Springu Bazując na nazwie servletu zdefiniowanej w web.xml: <servlet-name>tutorial</servlet-name> tworzymy plik konfiguracyjny w folderze WEB-INF/tutorial-servlet.xml:
Część praktyczna Część praktyczna w środowisku Eclipse
Dziękujemy za uwagę :)
Czy ktoś uważa? Brawo za spostrzegawczość! :) * * slajd wymaga dodatkowego wyjaśnienia