Commit 471b8b2e by Patryk Czarnik

TimeController - wersje z szablonami

parent 7381a89d
package com.example.demo; package com.example.demo;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
@Controller @Controller
public class TimeController { public class TimeController {
// Spring MVC
@GetMapping("/time1") @GetMapping("/time1")
@ResponseBody @ResponseBody
...@@ -55,6 +60,39 @@ public class TimeController { ...@@ -55,6 +60,39 @@ public class TimeController {
dt.toLocalTime(), dt.toLocalDate(), dt.format(FORMAT_DATY)); 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, ...
// 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(Model model) {
LocalDateTime dataCzas = LocalDateTime.now();
model.addAttribute("dt", dataCzas);
return "wyswietl_czas5.html";
}
// Przykład pokazujący dalsze możliwości Thymeleaf.
// https://www.thymeleaf.org/
@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";
}
} }
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bieżąca godzina</title>
</head>
<body>
<p>Zaraz powiem, która godzina…</p>
<p>Wartość obiektu <code>dt</code>: [[${dt}]]</p>
<p>Sekunda: [[${dt.second}]]</p>
<p>Dzień roku: [[${dt.dayOfYear}]]</p>
</body>
</html>
<!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>
</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