Lekce 12
Repository použité při lekci
Tentokrát nepoužijeme předem vytvořené repository, ale vytvoříme si projekt úplně od začátku. Inspiraci však můžete hledat v repository FilipJirsak/j2w-lekce12. Není potřeba si dělat fork, protože toto repository nebudeme upravovat – stačí případně si soubory kopírovat z GitHubu nebo si naklonovat přímo moje repository.
Tahák
- Spring Initializr – start.spring.io
- Jedna z cloudových platforem umožňující nasazení Java aplikací: Heroku
- logování – knihovna Logback, konfigurační soubor
/src/main/resources/logback.xml - konfigurace Springu – konfigurační soubory
/src/main/resources/application.yamla/src/main/resources/application-*.yaml(případně.properties)
Spring Initializr
- Project: Gradle Project
- Language: Java
- Spring Boot: nejnovější verz (ne SNAPSHOT, ALPHA nebo BETA)
- Packaging: Jar
- Java: doporučuji 11 (8 a 11 jsou LTS verze – Long Term Support, další LTS bude 17, která vyjde v září 2021)
Dependencies
Developer Tools
- Spring Boot DevTools
- Spring Configuration Processor
Web
- Spring Web
Template Engines
- Thymeleaf
SQL
- Spring Data JPA
- Flyway Migration
- H2 Database (při použití databáze H2)
- MariaDB Driver (při použití databáze MariaDB)
- MariaDB Driver (při použití databáze MariaDB)
- MySQL Driver (při použití databáze MySQL)
- PostgreSQL Driver (při použití databáze PostgreSQL)
I/O
- Validation
Heroku
Aby bylo možné projekt nasadit na Heroku, je nutné upravit dvě věci.
Za prvé je potřeba do kořenového adresáře projektu (na stejné místo, kde je např. build.gradle) přidat soubor system.properties (vše malými písmeny).
V tomto souboru nakonfigurujeme, že používáme Javu 11 (Heroku standardně používá Javu 8). Do souboru přidej následující řádek:
java.runtime.version=11
Dále je potřeba upravit soubor build.gradle. Spring Boot od verze 2.5 generuje pi buildu dva různé soubory JAR, Heroku pak spustí náhodně jeden z nich –
spuštění ale funguje jenom s jedním z nich. Proto je potřeba do build.gradle (např. až na konec souboru) přidat následující konfiguraci, která způsobí, že se
bude při buildu vytvářet jen jeden soubor, jako tomu bylo v dřívějších verzích Spring Bootu.
jar {
enabled = false
}
Spring
- anotace
@Autowired,@Service,@Controller,@Repository - anotace
@Entity,@Id,@GeneratedValue(strategy = GenerationType.IDENTITY) - anotace
@Version– optimistické zamykání při přístupu k datům - anotace
@GetMapping,@PostMapping,@PutMapping,@DeleteMapping,@PatchMapping,@RequestMapping - rozhraní
CrudRepository<Entity, ID>aJpaRepository<Entity, ID> - rozhraní
PageaPageable @SpringBootApplication– označení výchozí třídy Spring Boot aplikace. Spring Boot následně prohledává package, ve kterém je umístěna tato třída, a všechny package pod ním (na libovolné úrovni zanoření) a zpracuje všechny třídy označené některou z anotací, které Spring zná – např.@Controller,@Service,@Repositoryapod.@GetMapping,@PostMappinga další,@RequestMapping– anotace označující celý kontroler nebo metodu a určující, jaké požadavky bude zpracovávat (např. cesta, metoda, typ dat požadavku nebo odpovědi)- parametry součástí cesty:
GetMapping("/clanek/{id}"),@PathVariable int id ModelAndView– přepravka, která obsahuje název view a data modelureturn "redirect:/cil";- anotace
@ModelAttribute,@Valid - anotace
@NotNull,@NotEmpty,@NotBlank,@Min,@Max,@Email, … - anotace
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) - třída
BindingResult
Thymeleaf šablony
<html lang="cs" xmlns:th="http://www.thymeleaf.org">– hlavička HTML souboru, který funguje jako Thymeleaf šablona;lang="cs"říká, že obsah stránky je v češtině (prohlížeč pak např. nebude nabízet přeložení stránky z angličtiny)${variable}– získání dat z modelu@{/odkaz}– vytvoření internetového odkazu@{/odkaz(param1=${value1}, param2=${value2}}– vytvoření internetového odkazu s parametry
<span th:text="${variable}">…</span>– vložení textu do obsahu HTML elementu<span th:utext="${variable}">…</span>– vložení HTML kódu do obsahu HTML elementu
<span th:if="${variable} == 'value'">…</span>– celý HTML element je vložen jenom v případě, kdy podmínka je splněna<span th:unless="${variable} == 'value'">…</span>– celý HTML element je vložen jenom v případě, kdy podmínka není splněna
<div th:each="item : ${list}">…</div>– celý HTML element je opakován pro každou položku seznamulist, v rámci opakování existuje proměnnáitems aktuální hodnotou ze seznamu<div th:each="item, iterStat : ${list}">…</div>– jako předchozí, ale v proměnnéiterStatjsou navíc informace o procházení seznamu, jsou to:index– pořadí aktuálního prvku, začíná 0count– pořadí aktuálního prvku, začíná 1size– počet prvků v seznamucurrent– aktuální prvek seznamu (item == iterStar.current)- logické proměnné
even,odd,firstalast
${#temporals.format(dateOrTime)}– formátování data, času nebo časové značky (datum+čas) dle výchozího nastavení${#temporals.format(dateOrTime, 'd. M. yyyy H:mm')}– formátování data, času nebo časové značky (datum+čas) dle určeného formátu
- th-atribut
th:field– nastavujename,value,id, případněchecked
HTML formuláře
<form action="" method="">…</form><input id="" name="" type="" />- povolené hodnoty atributu type
idslouží pro elementlabelnamemusí být shodné s pojmenováním property v Javě
<label for="">…</label><button></button>- další formulářové prvky:
<input id="" name="" type="radio" /><input id="" name="" type="checkbox" /><select name=""><option value=""></option></select>
Java
enum– speciální třída obsahující výčet konstant (např. seznam světových strany nebo ročních období)
Odkazy
- Java SE 11 Javadoc – dokumentace všech tříd, které jsou součástí základní Javy ve verzi 11.
- Dokumentace Spring Boot – odsud je anotace
@SpringBootApplicationa třídaSpringApplication. - Dokumentace Spring Framework – odsud jsou anotace
@Controller,@GetRequesta třídaModelAndView. - Dokumentace Spring Data JPA
- Hibernate ORM – nejpoužívanější implementace JPA
- Dokumentace Thymeleaf – šablonovací systém pro HTML použitý v projektu.
- Dokumentace Thymeleaf + Spring – rozšíření Thymeleaf pro práci se Springem.
- Dokumentace HTML formulářů
- Dokumentace Hibernate Validator
- Databáze H2
- JUnit 5
- SLF4J – API pro logování
- Logback – implementace logování
- frontend frameworky – React, Vue, Svelte, Angular a další, případně čistý JavaScript
- Java (Spring, Micronaut, Helidon a další) – backend, JavaScript – frontend
Úkol
Z lekce 11 a 12 úkoly nebudou. Čas věnujte dokončení případně opravě úkolů z předchozích lekcí.