Wstecz | Dalej
W pierwszej kolejności zajmiemy się przygotowaniem projektu do dalszych prac. Musimy zadbać o to, aby w naszym projekcie:
- pojawiły się wszystkie zależności,
- pojawiły się wszystkie wymagane konfiguracje.
Korzystając ze Spring Boot możemy spróbować ręcznie stworzyć projekt, od zera, ale nie jest to potrzebne. Do automatycznego utworzenia projektu wykorzystamy stronę start.spring.io.
Założenia:
-
tworzymy projekt Maven'a dla Java'y,
-
wybieramy najnowszą wersją Spring Boot,
-
określamy grupę
pl.honestit.spring, -
określamy artefakt
demo, -
dodajemy zależności do:
WebSecurityJPAMySQL(lubPostgreslubH2)
Możemy również dodać zależności do
Lombok, jeżeli biblioteka ta jest nam znana.
Generujemy projekt i powstałe archiwum rozpakowujemy. Na podstawie tego archiwum za chwilę utworzymy nowy projekt w IntelliJ.
🐹 A tutaj znajdziesz startową wersję projektu
W IntelliJ tworzymy nowy projekt na podstawie istniejących źródeł, a więc rozpakowanego archiwum wcześniej wygenerowanego projektu.
Należy pamiętać, aby w projekcie były ustawione następujące elementy:
- wersja SDK na Java
1.8lub1.11, - katalog
src/main/javaoznaczony jako katalog ze źródłami (Sources Root), - katalog
src/main/resourcesoznaczony jako katalog z zasobami (Resources Root), - utworzony katalog
src/main/webapp, w którym będziemy tworzyć widoki JSP.
🐹 Mam dla Ciebie skonfigurowany projekt z tymi wszystkimi pitu-pitu!
Ze względu na to, że w projekcie będziemy wykorzystywać strony JSP, to musimy rozszerzyć zestaw wykorzystywanych zależności o bibliotekę JSTL oraz wsparcie dla przetwarzania stron JSP. Strona start.spring.io nie umożliwia nam dodania takich zależności.
-
Do pliku
pom.xmldodajemy poniższe zależności:Biblioteka JSTL:
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Wsparcie dla stron JSP:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
🐹 Tutaj jest cały projekt, który udało nam się do tej pory ogarnąć
🐹 ... a tutaj sam plik pom.xml
W celu zweryfikowania czy projekt został poprawnie skonfigurowany przygotujemy sobie testową stronę powitalną. Będzie to zwykła strona HTML. Można wykorzystać poniższy kod strony lub napisać własną:
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Testowa strona główna</title>
</head>
<body>
<h1>Witaj w Spring'u</h1>
</body>
</html>Stronę zapiszmy jako plik index.html w katalogu webapp. Ważna jest dokładnie taka nazwa pliku oraz jego położenia, ponieważ w ten sposób będzie on funkcjonował w roli domyślnej strony głównej.
Później plik ten usuniemy i przygotujemy prawdziwą stronę główną.
Możemy teraz przystąpić do uruchomienia projektu. W tym celu musimy znaleźć w katalogu java (a więc katalogu z naszymi źródłami) klasę pl.honestit.spring.demo.DemoApplication. Nazwa tej klasy jest połączeniem nazwy artefaktu, który wybraliśmy oraz słowa Application. Zobaczymy, że w klasie mamy pojedynczą metodę main, spełniającą wymogi głównej metody uruchomieniowej. Nie pozostaje nic innego jak odpalić tą metodę.
Kilka uwaga:
- nasza klasa posiada adnotację
@SpringBootApplication- jest to adnotacja, która czyni całą magię Spring Boot'a, a magią tą jest dostarczenie ogromu konfiguracji domyślnych, których sami nie musimy przygotowywać. - naszą klasę uruchamia metoda statyczna
runz klasySpringApplication, - wszystko w naszym projekcie będzie działać tak długo, aż będziemy tworzyć nowe klasy w podpakietach pakietu
demo, a więc poniżej klasyDemoApplication
Startujemy i ... czy uruchomienie aplikacji powiodło się?
🐹 ... i taką stronę dorzuciłem!
W poprzednim kroku nasza aplikacja nie uruchomiła się z powodu błędu braku skonfigurowanego źródła danych. Tworząc projekt wybraliśmy zależności do JPA a te, aby poprawnie się skonfigurować, potrzebują definicji źródła danych, tzw datasource. Przystąpimy teraz do konfiguracji bazy danych w aplikacji.
Aplikacja oparta na Spring Boot wprowadza nam pojedynczy plik konfiguracyjny do ustawienia wszystkich możliwych właściwości. Znajdziemy go w katalogu resources pod nazwą application.properties.
Zwróć uwagę, że środowisko IntelliJ posiada wsparcie dla tego pliku, a więc udostępnia bardzo bogate podpowiedzi kontekstowe. Można w ten sposób zapoznać się z wieloma dostępnymi opcjami konfiguracyjnymi.
Za konfigurację źródeł danych odpowiadają następujące parametry:
spring.datasource.url: określający ścieżkę do bazy danych,spring.datasource.username: określający nazwę użytkownika do bazy danych,spring.datasource.password: określający hasło użytkownika do bazy danych,spring.datasource.driver-class-name: określający klasę sterownika bazy danych,spring.jpa.database-platform: określający dialekt, którego ma użyć Hibernate w komunikacji z bazą danych,
W zależności od tego jak mamy skonfigurowaną bazę danych (jaki host, port, nazwa bazy danych, użytkownik i hasło), to pierwsze trzy parametry będą się zmieniać. Pozostałe będą zależne od wersji serwera bazy danych. Poniżej jest zaprezentowana konfiguracja dla serwera MySQL 8.0.11, bazy o nazwie spring_intro, użytkownika root i hasła pass:
# Konfiguracja bazy danych MySQL
spring.datasource.url=jdbc:mysql://localhost:5432/spring_intro?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8DialectJeżeli dodatkowo chcemy, aby Hibernate pokazywał w logach aplikacji używane zapytania SQL oraz automatycznie tworzył/aktualizował tabele na bazie danych, to możemy dorzucić poniższe konfiguracje:
# Konfiguracja JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=trueNa samym końcu możemy uzupełnić zestaw konfiguracji związanych z kodowaniem znaków:
# Kodowanie znaków w połączeniu do bazy danych
spring.jpa.properties.useUnicode=true
spring.jpa.properties.characterEncoding=utf8
spring.jpa.properties.CharSet=utf8Po uzupełnienie tych konfiguracji możemy ponownie wystartować projekt i zobaczyć czy tym razem uruchomi się bez problemu. W logach powinna pojawić się linia Started demoApplication in ..., co będzie dla nas sygnałem, że aplikacja wystartowała!
Spróbujmy teraz wejść na stronę localhost:8080/index.html
Co stało się tym razem?
🐹 Na tą chwilę projekt wygląda tak
🐹 ... a sam plik application.properties tak
🐹 ... chociaż potem potrzebował małej poprawki tutaj
Zdecydowaliśmy się na etapie generowania projektu na zależności do Security, więc nasza aplikacja została automatycznie zabezpieczona w pewnym podstawowym zakresie. Między innymi: wejście na każdą stronę wymaga wcześniejszego zalogowania. Pozostaje tylko pytanie na jakiego użytkownika skoro jeszcze żaden nie istnieje?
W kolejnych krokach zmodyfikujemy podstawową konfigurację bezpieczeństwa o własne ustawienia, ale na razie potrzebujemy prostego użytkownika testowego, na którego będziemy mogli się zalogować.
Skoro mowa o konfiguracji, to ponownie sięgamy do pliku application.properties. Potrzebujemy parametrów:
spring.security.user.namedo określenia nazwy domyślnego użytkownika warstwy bezpieczeństwa (testowego),spring.security.user.passworddo określenia hasła domyślnego użytkownika warstwy bezpieczeństwa (testowego),spring.security.user.rolesdo określenia ról domyślnego użytkownika warstwy bezpieczeństwa (testowego).
Wspomniane parametry możemy uzupełnić w następujący sposób:
spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=USERKolejny raz odpalmy aplikację i spróbujmy wejść na stronę localhost:8080/index.html.
Tym razem już wszystko powinno zadziałać!
🐹 Przynoszę aktualną wersję projektu!
🐹 ... a sam plik application.properties tak się zmienił
Mamy już poprawnie skonfigurowany projekt wykorzystujący wszystkie wymienione technologie. Możemy go uruchomić, ale jeszcze nie wiele co widocznego się w nim dzieje. W kolejnym zadaniu przejdziemy przez dalsze kroki, które przeprowadzą nas przez nasz własny proces rejestracji i logowania użytkowników. Jednocześnie zaczniemy wykorzystywać Spring MVC i jego najważniejsze elementy: kontrolery.
Wstecz | Dalej