Commit f3072271 by Patryk Czarnik

Time controller - wersja z szablonami Thymeleaf

parent a6cd2156
......@@ -12,6 +12,10 @@ import java.time.LocalDateTime;
@Controller
public class RootController {
@GetMapping("/")
public String spisTresci() {
return "index.html";
}
@GetMapping("/hello")
// można też użyć starszej wersji: @RequestMapping("/hello")
......
package alx.aplikacja;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@Controller
......@@ -55,11 +59,37 @@ public class TimeController {
dt.toLocalTime(), dt.toLocalDate(), dt.format(FORMAT_DATY));
}
// 2. Tworzymy odpowiedź za pomocą "szablonu" z wykorzystaniem dodatkowej technologii,
// tutaj jest to Thymeleaf, ale może być coś innego: JSP, Velocity, FreeMarker, Mustache, ...
// https://www.thymeleaf.org/
// Gdy metoda w kontrolerze w wyniku zwraca String, a nie posiada adnotacji @ResponseBody,
// to Spring traktuje zwracaną wartość jak nazwę szablonu,
// w odp. miejscu szuka pliku z szablonem i generuje wynik za pomocą tego szablonu.
// Gdy do szablonu chcemy przekazać jakieś dane, to dodajemy je jako atrybuty do modelu.
// Najprościej zrobić to poprzez parametr model.
@GetMapping("/time5")
public String time5() {
public String time5(Model model) {
LocalDateTime dt = LocalDateTime.now();
System.out.println("tutaj jestem");
model.addAttribute("biezacy_czas", dt);
return "wyswietl_czas5.html";
}
@GetMapping("/time6")
public String time6(Model model) {
LocalDateTime dt = LocalDateTime.now();
model.addAttribute("dt", dt);
List<LocalDate> dates = new ArrayList<>();
LocalDate date = dt.toLocalDate();
for(int i = 0; i <= 5; i++) {
dates.add(date.plusWeeks(i));
}
model.addAttribute("futureWeeks", dates);
return "wyswietl_czas6.html";
}
}
body {
background-color: #FFFFCC;
font-family: 'Arial', sans-serif;
}
h1 {
color: green;
text-align: center;
}
form {
margin: 30px auto;
padding: 20px;
width: 800px;
border: 4px solid blue;
background-color: #AAEEFF;
}
.wynik {
background-color: #FFFFFF;
border: 3px solid green;
margin: 20px auto;
width: 800px;
padding: 10px;
color: green;
}
.error {
background-color: #FFFFFF;
border: 6px double red;
margin: 20px auto;
padding: 10px;
width: 800px;
color: red;
font-weight: bold;
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="pl">
<head>
<meta charset="UTF-8">
<title>Aplikacja springowa - spis treści</title>
<link rel="stylesheet" type="text/css" th:href="@{/styl.css}">
</head>
<body>
<h1>Aplikacja springowa - Spis treści</h1>
<h2>Przykłady pisane bezpośrednio w Controllerze</h2>
<ul>
<li><a th:href="@{/hello}">Hello</a></li>
<li><a th:href="@{/ping}">Ping</a></li>
<li><a th:href="@{/czas}">Czas - zadanie na lekcji</a></li>
<li><a th:href="@{/time1}">Czas obiektowo</a> (json)</li>
<li><a th:href="@{/time2}">Czas tekstowo</a></li>
<li><a th:href="@{/time3}">Czas tekstowo</a> (text/plain)</li>
<li><a th:href="@{/time4}">Czas HTML w Javie</a></li>
</ul>
<h2>Przykłady z szablonami</h2>
<ul>
<li><a th:href="@{/time5}">Czas szablon prosty</a></li>
<li><a th:href="@{/time6}">Czas szablon rozbudowany</a></li>
</ul>
<h2>Przykład Parametry</h2>
<ul>
<li><a th:href="@{/parametry/witaj}">witaj</a></li>
<li><a th:href="@{/parametry/witaj(imie='Ala')}">witaj?imie=Ala</a></li>
<li><a th:href="@{/parametry/powtorz}">powtorz</a></li>
<li><a th:href="@{/parametry/powtorz(tekst='Ola ma psa')}">powtorz</a> n = 1</li>
<li><a th:href="@{/parametry/powtorz(tekst='Ala ma kota',n=10)}">powtorz</a> n = 10</li>
<li><a th:href="@{/parametry/techniczne}">parametry techniczne</a></li>
</ul>
<h2>Formularze</h2>
<ul>
<li><a th:href="@{/rozmowa}">Rozmowa</a></li>
<li><a th:href="@{/kalkulator}">Kalkulator</a></li>
</ul>
<h2>Przykład Blog</h2>
<ul>
<li><a th:href="@{/blog}">Formularz</a> do wpisywania tekstów</li>
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="pl">
<html lang="pl" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Informacja o czasie</title>
</head>
<body>
<h1>Wyświetl czas 5</h1>
<p>Zaraz napiszę, która godzina.</p>
<p>Zaraz napiszę, która godzina. Jest to: [[${biezacy_czas}]].</p>
<p>Inny sposób: <strong th:text="${biezacy_czas}">2013-01-01 13:13:00</strong></p>
<h3>Wybrane pola:</h3>
<ul>
<li th:text="${biezacy_czas.year}"></li>
<li th:text="${biezacy_czas.month}"></li>
<li th:text="${biezacy_czas.monthValue}"></li>
<li th:text="${biezacy_czas.dayOfMonth}"></li>
<li th:text="${biezacy_czas.dayOfYear}"></li>
<li th:text="${biezacy_czas.dayOfWeek}"></li>
<li th:text="${biezacy_czas.hour}"></li>
<li th:text="${biezacy_czas.minute}"></li>
<li th:text="${biezacy_czas.second}"></li>
</ul>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="pl" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Show Time 6</title>
<link rel="stylesheet" type="text/css" th:href="@{/styl.css}" href="../static/styl.css">
</head>
<body>
<h1>Data i czas</h1>
<h3>Trzy sposoby wstawiania wartości atrybutu w Thymeleaf</h3>
<ul>
<!-- th:text oraz data-th-text to są przykłady podejścia "natural template",
czyli że plik jest poprawnym składniowo dokumentem HTML, a dodatkowe magiczne atrybuty powodują specjalne działanie"
gdy ten plik jest przetwarzany przez "silnik thymeleaf".
-->
<!-- Najbardziej zalecane podejście: dodatkowa przestrzeń nazw th
Aby to zadziałało, w HTMLu (najczęściej na samym początku) musi byś zadeklarowana przestrzeń nazw.
"Tekst, który znajduje się wewnątrz znacznika, zastąp wartością zmiennej dt"
-->
<li th:text="${dt}">jakaś godzina 1</li>
<!-- atrybuty "data" wprowadzone w HTML 5
Normalnie takich atrybutów używają skrypty JS, aby w dokumencie zapamiętywać dane,
a tutaj Thymeleaf używa w innym celu.
-->
<li data-th-text="${dt}">jakaś godzina 2</li>
<!-- zagnieżdżone wyrażenia / inline expressions - podejście podobne do JSP, tutaj mniej zalecane -->
<li>to jest wynik: [[${dt}]]</li>
</ul>
<h3>Odwołania do elementów zagnieżdżonych</h3>
<ul>
<!-- tak naprawdę wywołanie dt.getYear() -->
<li>rok: <strong th:text="${dt.year}">1997</strong></li>
<li>dzień roku: <strong th:text="${dt.dayOfYear}">100</strong></li>
<li>dzień tygodnia: <strong th:text="${dt.dayOfWeek}">MONDAY</strong></li>
<li>sekunda: <strong th:text="${dt.second}">33</strong></li>
<!-- Można też wywołać metodę, która coś odczyta, nawet jeśli nie nazywa się getXXX() -->
<li>data: <strong th:text="${dt.toLocalDate()}">2020-04-05</strong></li>
<li>czas: <strong th:text="${dt.toLocalTime()}">10:44:22</strong></li>
<li>miesiąc: <em th:text="${dt.month}">APRIL</em></li>
</ul>
<h3>Odczyt elementów listy</h3>
<p>Ten sam dzień w kolejnych tygodniach:</p>
<ol start="0">
<li th:each="date : ${futureWeeks}" th:text="${date}">2022-08-01</li>
</ol>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment