Commit ffef3d90 by Patryk Czarnik

DateTimeController i wprowadzenie do szablonów

parent faea2d0c
package com.example.demo;
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;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class DateTimeController {
@RequestMapping("/time1")
@ResponseBody
public LocalTime time1() {
// Gdy metoda zwraca jakiś obiekt (klasy innej niż String i niektóre inne "magiczne" klasy samego Springa),
// a metoda posiada adnotację @ResponseBody, to dane odsyłane są w odpowiedzi w formacie JSON.
return LocalTime.now();
}
@RequestMapping("/time2")
@ResponseBody
public String time2() {
// Gdy metoda zwraca String i posiada adnotację @ResponseBody, to dane odsyłane są w odpowiedzi jako HTML.
// (tzn. są oznaczone jako text/html, ale nie są automatycznie formatowane).
return LocalTime.now().toString();
}
// https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#patterns
private static final DateTimeFormatter FORMAT_DATY = DateTimeFormatter
.ofPattern("EEEE, dd.MM.YYYY, 'godzina' HH:mm:ss", new Locale("pl", "PL"));
// Aby powiedzieć wprost, jaki jest format (content-type) odpowiedzi zwracanej przez metdę, można uzyć parametru produces
@RequestMapping(path="/time3", produces="text/plain")
@ResponseBody
public String time3() {
return LocalDateTime.now().format(FORMAT_DATY);
}
// Jak wysłać w odpowiedzi HTML?
// 1. Utworzyć bezpośrednio w kodzie Javy... - słabe
@RequestMapping(path="/time4", produces="text/html")
@ResponseBody
public String time4() {
LocalDateTime dt = LocalDateTime.now();
return String.format(
"<html><body><h1>Data i czas</h1>"
+ "<p>Teraz jest godzina <strong style='color:purple'>%s</strong></p>"
+ "<p>Dzisiejsza data: <strong style='color:blue'>%s</strong></p>"
+ "<p style='color: green'>%s</p>"
+ "</body></html>",
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.
@RequestMapping("/time5")
public String time5(Model model) {
LocalDateTime dt = LocalDateTime.now();
model.addAttribute("czas", dt);
model.addAttribute("sformatowany_czas", dt.format(FORMAT_DATY));
return "show_time5.html";
}
@RequestMapping("/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 "show_time6.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">
<head>
<meta charset="UTF-8">
<title>Spis treści</title>
<link rel="stylesheet" type="text/css" th:href="@{/styl.css}">
</head>
<body>
<h1>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="@{/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>
</ul>
<h2>Przykłady formularzy</h2>
<ul>
<li><a th:href="@{/kalkulator}">Kalkulator</a> (formlularz)</li>
<li><a th:href="@{/kalkulator/historia}">Historia Kalkulatora HTML</a></li>
<li><a th:href="@{/historia.json}">Historia Kalkulatora JSON</a></li>
<li><a th:href="@{/historia.txt}">Historia tekstowo</a></li>
<li><a th:href="@{liczenie(liczba1=211,liczba2=303,operacja='*')}">Liczenie bezpośrednie</a> w parametrami URL</li>
</ul>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bieżący czas</title>
</head>
<body>
<h1>Wyświetlanie czasu</h1>
<p>Wersja uproszczona</p>
<p>Teraz jest [[${czas}]]</p>
<h3>Wybrane pola daty i czasu</h3>
<ul>
<li>rok: [[${czas.year}]]</li>
<li>dzień roku: [[${czas.dayOfYear}]]</li>
<li>sekunda: [[${czas.second}]]</li>
<li>cała data: [[${czas.toLocalDate()}]]</li>
</ul>
<h3>Sfromatowany czas</h3>
<p>[[${sformatowany_czas}]]</p>
<!-- Wstawianie danych za pomocą kwadratowych nawiasów w Thymeleaf nie jest najbardziej zalecaną techniką.
Bardziej zalecane jest th:text -->
</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