Przykładowa aplikacja typu CRUD w Springu

Przeglądając internet w poszukiwaniu jakichkolwiek wprowadzeń do Springa zawsze brakowało mi tutoriala, który w prosty i klarowny sposób pokazywał sposób działania prostej aplikacji Springowej z użyciem bazy danych i ORMa. Podstawowym kryterium miał być fakt, iż chciałem by dany projekt można było uruchomić jak najszybciej, jak najprościej, tak by osoba, która widzi Springa pierwszy raz na oczy szybko umiała zaadaptować się i stworzyć prostą aplikację bazodanową. W ten sposób powstał poniższy, jednoczęściowy kurs. Osoby, które chciałyby po prostu przejść do sedna, ściągnąć i odpalić działającą aplikację zapraszam na koniec kursu.

Spring jest jednym z najpopularniejszych frameworków języka Java. Jego komponenty obejmują szereg różnych zagadnień programowania w tym języku. W prezentowanym wpisie chciałbym przedstawić instrukcję stworzenia prostej aplikacji typu CRUD. W celu realizacji zadania wykorzystane zostaną technologie:

– MySQL

– Maven

– Java

– Spring

Nasze prace rozpoczniemy od instalacji/konfiguracji Mavena. Jest to niezwykle popularne narzędzie ułatwiające proces budowania aplikacji w Javie. Jako projekt Fundacji Apache można go ściągnąć bezpośrednio z strony:

http://maven.apache.org/download.cgi

Instalacja polega na rozpakowaniu archiwum i dodania do zmiennych środowiskowych katalogu “bin” Mavena:

1
Przykład ustawień zmiennych środowiskowych w systemie Windows 7

 

Poprawne skonfigurowanie zmiennej środowiskowej powinno skutkować wyświetleniem poniższego komunikatu po wcześniejszym wpisaniu komendy “mvn” oczywiście, w linii komend systemu operacyjnego.

1
Komunikat o nieudanej budowie projektu

Oprócz Mavena, w trakcie tworzenia projektu, potrzebować będziemy także bazy MySQL a także oczywiście samej Javy – zakładam, iż instalacja tych dwóch technologii nie wymaga większego komentarza.

Tworzenie samego projektu rozpoczniemy od stworzenia bazy danych. W tym celu tworzony nową bazę:

Jak widzimy jest to prosta tabela reprezentująca książkę, a składająca się z pięciu pól: identyfikatora, tytułu, ilości stron, ceny, a także wydawcy.

W celu stworzenia aplikacji tworzymy poniższą strukturę katalogów (możemy też użyć Mavena by ów strukturę stworzył za nas, lecz tym razem spróbujmy to zrobić ręcznie):

1
Struktura katalogów projektowanej aplikacji

Ręcznie stworzymy również same pliki źródłowe. Ich przeznaczenie zestawiono w poniższej tabeli:

 

 

Katalog Nazwa pliku Przeznaczenie
Tutorial/src/main/
java/com/tutorial/controller
BookController.java Kontroler do obsługi logiki funkcjonalności dotyczących ‘książki’
Tutorial/src/main/
java/com/tutorial/controller
LinkController.java Kontroler do obsługi strony głównej aplikacji
Tutorial/src/main/
java/com/tutorial/dao
BookDAO.java Interfejs do obsługi obiektu realizującego dostęp do danych
Tutorial/src/main/
java/com/tutorial/dao
BookDAOImpl.java Konkretna implementacja obiektu realizującego dostęp do danych
Tutorial/src/main/
java/com/tutorial/init
Initializer.java Klasa Initializer, czyli konfiguracja początkowych ustawień aplikacji springowej
Tutorial/src/main/
java/com/tutorial/init
WebAppConfig.java Ustawienia konfiguracyjne aplikacji, w tym ustawienia resolvera widoków
Tutorial/src/main/
java/com/tutorial/model
Book.java Klasa modelu, zawiera encję opisującą książkę
Tutorial/src/main/
java/com/tutorial/service
BookService.java Interfejs zarządzający obiektem książki
Tutorial/src/main/
java/com/tutorial/service
BookServiceImpl.java Konkretna implementacja interfejsu zarządzania książka
Tutorial/src/main/
java/Resources/
application.properties Ustawienia aplikacji, dostępu do bazy, hosta bazy itp
Tutorial/webapp/META-INF/maven/com.tutorial/spring pom.xml Plik ustawień Mavena dotyczących danego pakietu
Tutorial/ pom.xml Plik ustawień Mavena dotyczących całego projektu
Tutorial/webapp/WEB-INF/ web.xml Deskryptor aplikacji
Tutorial/webapp/WEB-INF/pages add-bok-form.jsp Widok formularza dodawania nowej książki do bazy
Tutorial/webapp/WEB-INF/pages edit-bok-form.jsp Widok edycji książki
Tutorial/webapp/WEB-INF/pages home.jsp Strona główna aplikacji
Tutorial/webapp/WEB-INF/pages list-of-books.jsp Widok listy książek dostępnych w systemie

 

Tworzenie systemu zaczniemy od klas konfiguracyjnych:

Application.properties

Plik application.properties posiada jak widzimy informacje na temat bazy danych, adres dostępowy, nazwę użytkownika i hasło. Druga część pliku konfiguracyjnego to ustawienia Hibernate’a, w tym wskazanie pakietu, gdzie przechowywać będziemy modele (entitymanager.packages. to.scan=com.tutorial.model).

Kolejny plik konfiguracyjny to initializer.java. Składa się on z klasy Initializer implementującej interfejs WebApplicationInitializer. Jak wiemy Spring swe działanie opiera na kontenerze Inversion of Control. W celu jego uruchomienia należy utworzyć obiekt implementujący interfejs ApplicationContext. Wybór mamy szeroki, w poniższym przykładzie użyty został AnnotationConfigWebApplicationContext. Moglibyśmy również użyć, ClassPathXmlApplicationContext, który to poszukiwałby pliku konfiguracyjnego w ścieżce systemowej classpath. Innym przykładem jest FileSystemXmlApplication, który poszukuje pliku w wybranym miejscu serwera.

Kontekst aplikacji zostaje stworzony, następnie dodany zostaje kontekst servletu , a także dispatcher.

Initializer.java
Warto zauważyć, iż te same efekty , co prezentowana klasa, uzyskać można
korzystając z XMLa.

WebAppConfig to ostatnia klasa konfiguracyjna, która wykorzystywana jest w Initializerze.

WebAppConfig.java

Ostatnie dwa pliki XML to pliki pom. Służą one do opisy struktury projektu. Przedstawiony poniżej pierwszy z nich dotyczy struktury i budowy pakietu com.tutorial.spring.

\META-INF\maven\com.tutorial\spring\pom.xml

Wśród wielu ustawien POMa wyróżnić można:

– wersję Springa

– konfigurację builda – nazwę, wykorzystane przy tym pluginy

– dołączenie Hibernate’a , MySQLa i jUnita

Drugi z plików projektu POM w swej budowie przypomina swój powyższy odpowiednik, jednakże dotyczy całego projektu. :

pom.xml

Jak widać zasada jego tworzenia jest dosyć standardowa, a dzięki XMLowi uzyskaliśmy przejrzystość ustawień, a także szybką możliwość zmiany.

Czas przejść do najciekawszego etapu tworzenia projektu – budowy samej aplikacji springowej. Tą część rozpoczniemy od stworzenia modelu opisującego tabelę “book”. W tym celu tworzymi plik book.java i wpisujemy poniższą zawartość:

book.java

Jak widzimy klasa Book to standardowa klasa opatrzona adnotacją @Entity, a także @Table(name=”book”). Pierwsza z nich definiuje samą encję, natomiast adnotacja Table przedstawia nazwę tabeli, na którą rzutuje projektowany model. Kolejne elementy klasy to oczywiście pola identyfikujące kolumny tabeli, a także standardowe gettery i settery umożliwiające ustawianie i pobieranie wartości pól tabeli.

 

Kolejny krok to stworzenie interfejsu do obiektu dostępowego do modelu. Zaimplementowana klasa pozwalająca na dostęp do danych powinna posiadać metody:

dodawania książki –                        public void addBook(Book book);

aktualizowania książki –                                public void updateBook(Book book);

pobierania książki –                         public Book getBook(int id);

usuwania książki –                          public void deleteBook(int id);

pobierania wszystkich książek –                public List<Book> getBooks();

BookDAO.java

W następnym kroku tworzymy klasie implementującą powyższy interfejs, a także po raz pierwszy użyjemy wstrzykiwania zależności do obiektu:

BookDAOImpl.java

Aby stworzyć springowego beana musimy użyć jednej z adnotacji podczas definiowania klasy:

@Repository – dla klas używanych jako klasy dostępowe do danych (DAO)

@Service – dla klas udostępniających specyficzne usługi

@Controller – dla klas będących kontrolerami w modelu MVC

@Component – ogólna klasa komponentu springowego

Zgodnie z powyższymi definicjami dodajemy adnotację @Respository. W ciele klasy od razu uwidacznia się adnotacja @Autowired. Powoduje ona, iż podczas tworzenia obiektu książki od razu wstrzyknięta zostanie bean sesji. W tym miejscu moglibyśmy użyć także adnotacji @Resource. Różnica jest taka, iż @Resource wyszukuje beany na podstawie nazwy, natomiast @Autowired na podstawie typu.

Kolejne metody pliku to oczywiście implementacja niezbędnych funkcjonalności. Metoda addBook(Book book) dodaje książkę do bazy, natomiast updateBook pobiera z bazy książkę o wskazanym identyfikatorze a następnie aktualizuje jej pola. Ostatnie trzy metody to kolejno funkcja pobierająca i usuwająca książkę, a także oczywiście funkcja zwracająca listę dostępnych pozycji w bazie.

BookService.java

Kolejny plik programu to interfejsu do obsługi serwisu książki. Nie ma tu nic ponadto zdefiniowanych metod addBook, updateBook, getBook, deleteBook i getBooks(). Oczywiście nazwy metod są adekwatne do wykonywanych czynności.

BookServiceImpl.java

Po zdefiniowaniu interfejsu przydałoby się go zaimplementować. W celu tym służyć ma klasa BookServiceImpl. Implementuje ona metody interfejsu przy pomocy wstrzykiwanego obiektu DAO.

Ostatnie opisywane pliki stanowią widoki strony.

home.jsp

Home.jsp zawiera odnośniki do poszczególnych podstron serwisu.

list-of-books.jsp

W przypadku widoku prezentującego spis książek dostępnych w systemie zastosowano prostą pętlę forEach iterującą po kolekcji, a także wyświetlającą pola obiektu w postaci tabeli.

add-book-form.jsp

Formularz dodawania książek składa się poszczególnych formatek. Warto odnotować fakt dodania atrybuty “commandName” w znaczniku <form>.

edit-book-form.jsp

Edycja wybranego egzemplarza książki odbywa się przy pomocy identycznego formularza, zmian jest niewiele, a główna z nich objawia się przymusem zwrócenia do serwera identyfikatora książki, która aktualnie jest edytowana.

W celu przetestowania aplikacji należy zbudowanego przez Mavena Jara wrzucić na wybrany serwer deweloperski, np. Tomcata. Aplikacja powinna uruchomić się bez problemów i pokazać spis dostępnych funkcjonalności.

git: https://gitlab.com/blog-pawelkaminski/spring-crud

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.