[JAVA] Verwendung von Thymeleaf mit Spring Boot

Was ist Thymeleaf?

Betriebsumgebung

Untersuchen Sie die Annahme, dass es beim Spring Boot als Ansichtsvorlagen-Engine von Spring MVC ausgeführt wird.

Hello World

build.gradle


buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE'
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.boot:spring-boot-devtools'
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

ext['thymeleaf.version'] = '3.0.7.RELEASE'
ext['thymeleaf-layout-dialect.version'] = '2.2.2'

jar.baseName = 'thymeleaf'

Ordnerstruktur


|-build.gradle
`-src/main/
  |-java/sample/thymeleaf/
  |  |-Main.java
  |  `-web/
  |    `-HelloController.java
  |
  `-resources/
    |-application.properties
    `templates/
       `-hello.html

application.properties


spring.thymeleaf.mode=HTML

Main.java


package sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello Thymeleaf!!");
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <h1 th:text="${message}"></h1>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Text einbetten

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <h1 th:text="'hello world'"></h1>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

hello.html


<h1 th:text="'hello world'"></h1>

Inline-Verarbeitung

hello.html


<!doctype html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <h1>[['hello world!!']]</h1>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Ausgabe von Variablen

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("modelValue", "Model Value!!");
        return "hello";
    }
}

hello.html


<!doctype html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <h1>[[${modelValue}]]</h1>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

hello.html


<h1>[[${modelValue}]]</h1>

--Verwenden Sie den Ausdruck "$ {[Variablenname]}", um den im Laufzeitkontext gespeicherten Wert in die Vorlage einzubetten.

HelloControlloer.java


    public String hello(Model model) {
        model.addAttribute("modelValue", "Model Value!!");

Ausdruckssyntax

wörtlich

<!--String-->
<span th:text="'some text'"></span>
<!--Numerischer Wert-->
<span th:text="123"></span>
<!--Boolescher Wert-->
<span th:text="true"></span>
<!-- null -->
<span th:text="null"></span>

String-Verkettung

<span th:text="'some text' + '!!'"></span>

Wörtlicher Ersatz

<span th:text="|Hello ${message}|"></span>

Arithmetischer Operator

<span th:text="(30 * 20 + 10 / 5 - 1) % 3"></span>

--*,/,+, '-', '%' kann verwendet werden

Logischer Operator

<span th:text="true
                and false
                or true
                and not true
                or !false"></span>

--und oder oder kann verwendet werden

Entspricht dem Vergleich

<span th:text="1 < 10"></span>
<span th:text="1 > 10"></span>
<span th:text="1 <= 10"></span>
<span th:text="1 >= 10"></span>
<span th:text="1 == 10"></span>
<span th:text="1 != 10"></span>

-- <,> ,<=,> = kann verwendet werden --Jeder ist derselbe wie der Java-Operator --==,! = Wird durch einen Vergleich mitequals ()ersetzt (ein Zeichenfolgenvergleich ist ebenfalls möglich)

Bedingter Operator

1: <span th:text="true ? 'a'"></span><br>
2: <span th:text="false ? 'b'"></span><br>
3: <span th:text="true  ? 'c': 'C'"></span><br>
4: <span th:text="true ?: 'd'"></span><br>
5: <span th:text="false ?: 'e'"></span><br>
6: <span th:text="null ?: 'f'"></span><br>

** Ausgabeergebnis **

thymeleaf.jpg

** [Bedingung]? [Wert] **

** [Bedingung]? [Wert 1]: [Wert 2] **

-Wenn [Bedingung] "wahr" ist, wird [Wert 1] ausgewertet, und wenn es "falsch" ist, wird [Wert 2] ausgewertet.

** [Objekt]?: [Wert] **

SpEL-Ausdruck

Das Innere von $ {...} wird von einer Ausdruckssprache namens SpEL (Spring Expression Language) ausgewertet. Mit diesem SpEL können Sie einfach auf Objekte zugreifen.

Die Standardausdruckssprache ist OGNL

Mit Blick auf die einfache Thymeleaf-Referenz heißt es, dass OGNL als Ausdruckssprache verwendet wird. Bei Integration in Spring wird jedoch stattdessen SpEL verwendet.

Tutorial: Thymeleaf + Spring

2 The SpringStandard Dialect

Use Spring Expression Language (Spring EL or SpEL) as a variable expression language, instead of OGNL. Consequently, all ${...} and *{...} expressions will be evaluated by Spring’s Expression Language engine.

(Übersetzung) Verwenden Sie Spring Expression Language (Spring EL oder SpEL) als Ausdruckssprache für Variablen anstelle von OGNL. Daher werden alle Ausdrücke "$ {...}" und "* {...}" von der Ausdruckssprachen-Engine von Spring ausgewertet.

Referenz der Feldeigenschaftsmethode

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("hoge", new Hoge());
        return "hello";
    }
    
    public static class Hoge {
        public int publicField = 1;
        
        public int publicMethod() {return 2;}
        
        public int getPublicValue() {return 3;}
    }
}
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <div th:text="${hoge.publicField}"></div>
        <div th:text="${hoge['publicField']}"></div>
        <div th:text="${hoge.publicMethod()}"></div>
        <div th:text="${hoge.publicValue}"></div>
        <div th:text="${hoge['publicValue']}"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--Direkte Referenz ist für Felder und Methoden möglich, die "öffentlich" sind

Kartenreferenz

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.HashMap;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello(Model model) {
        HashMap<String, String> map = new HashMap<>();
        map.put("message", "Hello World!!");

        model.addAttribute("map", map);
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <div th:text="${map.message}"></div>
        <div th:text="${map['message']}"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--Für Map können Sie mit map. Key auf den Wert verweisen

Listenreferenz

HelloConteroller.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("list", Arrays.asList(1, 2, 3));
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <div th:text="${list[0]}"></div>
        <div th:text="${list[1]}"></div>
        <div th:text="${list[2]}"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Legen Sie einen Wert für ein Attribut fest

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <span th:class="'hello' + 'world'">hoge</span>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

URL verknüpfen

application.properties


server.contextPath=/thymeleaf

--Stellen Sie Spring Boot ein, um mit dem Kontextpfad zu beginnen und den Betrieb zu überprüfen

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li>
                @{foo/bar} = [[@{foo/bar}]]
            </li>
            <li>
                @{/foo/bar} = [[@{/foo/bar}]]
            </li>
            <li>
                @{~/foo/bar} = [[@{~/foo/bar}]]
            </li>
            <li>
                @{http://localhost:8080/foo/bar} = [[@{http://localhost:8080/foo/bar}]]
            </li>
            <li>
                @{//localhost:8080/foo/bar} = [[@{//localhost:8080/foo/bar}]]
            </li>
        </ul>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Art Erläuterung
foo/bar Normaler relativer Pfad
/foo/bar Relativer Pfad vom Kontextpfad
~/foo/bar Relativer Pfad vom Stamm des Servers (/fooWird ein anderer Kontextpfad)
http://xxx/xxx Absoluter Pfad
//xxx/xxx Relativer Pfad des Protokolls

Normalerweise wird es im Attribut href des Tags <a> angegeben

<a th:href="@{/foo/bar}">/foo/bar</a>

Es wird wie folgt eingestellt.

Abfrageparameter festlegen

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("paramValue", "PARAM VALUE");
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        [[@{/foo/bar(hoge='HOGE', paramValue=${paramValue})}]]
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Betten Sie Variablen in den Pfad ein

hello.html


<!doctype html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        [[@{/foo/{pathValue}/bar(pathValue=123)}]]
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--Variationen, die am Ende mit "()" deklariert wurden, können in dem in "{}" eingeschlossenen Pfad verwendet werden.

Objekte, auf die implizit verwiesen werden kann

Zusätzlich zu dem im Controller-Modell festgelegten Wert gibt es Objekte, auf die standardmäßig zugegriffen werden kann.

<span th:text="${#httpServletRequest}"></span>
<span th:text="${#httpSession}"></span>
<span th:text="${param}"></span>
<span th:text="${session}"></span>
<span th:text="${application}"></span>

-- # httpServletRequest ist das HttpServletRequest-Objekt selbst

Unterschied mit und ohne #

--httpServletRequest wird "#" vorangestellt, nicht "session" oder "param"

Objektauswahl

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("hoge", new Hoge());
        return "hello";
    }
    
    public static class Hoge {
        public String name = "hogeee";
        public String value = "HOGEEE";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <div th:object="${hoge}">
            <div>name = [[*{name}]]</div>
            <div>value = [[*{value}]]</div>
        </div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

hello.html


        <div th:object="${hoge}">
            <div>name = [[*{name}]]</div>
            <div>value = [[*{value}]]</div>
        </div>

Deklaration lokaler Variablen

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <div th:with="message = 'Hello World!!'">
            message = [[${message}]]
        </div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

hello.html


        <div th:with="message = 'Hello World!!'">
            message = [[${message}]]
        </div>

--Variationen, die in th: with deklariert sind, werden nur in den untergeordneten Elementen dieses Tags zu gültigen Variablen und können in $ {} Ausdrücken referenziert werden.

Umschalten zwischen Anzeige und Nichtanzeige je nach Bedingungen

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("flag", true);
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <h1 th:if="${flag}">flag is true</h1>
        <h1 th:if="${!flag}">flag is false</h1>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Wert als wahr / falsch bewertet

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("booleanTrue", true);
        model.addAttribute("booleanFalse", false);
        model.addAttribute("numericZero", 0);
        model.addAttribute("numericOne", 1);
        model.addAttribute("charZero", '0');
        model.addAttribute("stringEmpty", "");
        model.addAttribute("stringZero", "0");
        model.addAttribute("stringOff", "off");
        model.addAttribute("stringNo", "no");
        model.addAttribute("stringFalse", "false");
        model.addAttribute("anyObject", new Object());
        model.addAttribute("nullValue", null);
        
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li th:if="${booleanTrue}">booleanTrue</li>
            <li th:if="${booleanFalse}">booleanFalse</li>
            <li th:if="${numericZero}">0</li>
            <li th:if="${numericOne}">numericOne</li>
            <li th:if="${charZero}">charZero</li>
            <li th:if="${stringEmpty}">stringEmpty</li>
            <li th:if="${stringZero}">stringZero</li>
            <li th:if="${stringOff}">stringOff</li>
            <li th:if="${stringNo}">stringNo</li>
            <li th:if="${stringFalse}">stringFalse</li>
            <li th:if="${anyObject}">anyObject</li>
            <li th:if="${nullValue}">nullValue</li>
        </ul>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

** Wert als falsch bewertet </ font> **

--boolean false --Numerische 0

  • null --String "false", "off", "no"

** Wert als wahr bewertet </ font> **

  • Alles außer "Wert als falsch bewertet" --Beispiel
  • "wahr" von "boolesch" --Nummer 1 --String " 0 "
  • Leere Zeichen
  • Jedes Objekt, das nicht "null" ist

Wenn ich die Referenz lese, heißt es: "Andere Werte als" 0 "in der Zeichenfolge werden als" wahr "ausgewertet." Mit anderen Worten, es scheint, dass "0" der Zeichenkette als "falsch" bewertet wird, aber wenn es tatsächlich versucht wird, wird es als "wahr" bewertet. Fehler?

Iterative Verarbeitung

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("list", Arrays.asList("hoge", "fuga", "piyo"));
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li th:each="element : ${list}">[[${element}]]</li>
        </ul> 
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--th: each = "[Variablenname zum Speichern jedes Elements]: $ {[zu iterierendes Objekt]}" , Tags können wiederholt ausgegeben werden

  • [Variablenname zum Speichern jedes Elements] wird nur bei wiederholter Ausgabe zu einer gültigen Variablen
  • Eine Klasse, die "Iterable" implementiert, kann iterativ mit "th: each" verarbeitet werden.

Karte wiederholen

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.HashMap;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        HashMap<String, String> map = new HashMap<>();
        map.put("hoge", "HOGE");
        map.put("fuga", "FUGA");
        map.put("piyo", "PIYO");

        model.addAttribute("map", map);
        
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li th:each="entry : ${map}">
                key=[[${entry.key}]], value=[[${entry.value}]]
            </li>
        </ul>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

  • Wenn "Map" iterativ verarbeitet wird, wird "Map.Entry" iterativ als jedes Element verarbeitet.

Bei wiederholter Verarbeitung außer Liste und Karte

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li th:each="element : 'text'">[[${element}]]</li>
        </ul>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--Wenn ein anderes Objekt als "Map", das "Iterable" nicht implementiert, iterativ mit "th: each" verarbeitet wird, wird es als "List" behandelt, die nur diesen Wert hat.

Wiederholte Statusreferenz

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("list", Arrays.asList("hoge", "fuga", "piyo"));
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <ul>
            <li th:each="element, status : ${list}">
                index = [[${status.index}]],
                count = [[${status.count}]],
                size = [[${status.size}]],
                current = [[${status.current}]],
                even = [[${status.even}]],
                odd = [[${status.odd}]],
                first = [[${status.first}]],
                last = [[${status.last}]]
            </li>
        </ul>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

--th: each = "[jedes Element], [Statusvariable]: [wiederholtes Ziel]" Durch Hinzufügen von, Variablenname nach der Deklaration jeder Elementvariablen kann der Status jeder Schleife geändert werden. Sie können die beibehaltenen Variablen verwenden

  • Wenn Sie die Deklaration der Statusvariablen weglassen, wird die Statusvariable mit der Variablen "[jedes Element] Stat" vorbereitet.
  • Wenn Sie th: each =" element: $ {list} " setzen, können Sie mit elementStat auf die Statusvariable verweisen. --Status enthält Informationen zum aktuellen Schleifenstatus
  • Die im Status gespeicherten Informationen lauten wie folgt
Variablennamen Bedeutung
index Aktueller Schleifenindex (0Start)
count Aktuelle Schleifenzahl (1Start)
size Größe des zu wiederholenden Objekts
current Aktuelles Wiederholungselement
even Ob das aktuelle Element gerade ist (wahr / falsch-Wert)
odd Ob das aktuelle Element ungerade ist (wahr / falsch-Wert)
first Gibt an, ob das aktuelle Element das erste ist (wahr / falsch-Wert).
last Gibt an, ob sich das aktuelle Element am Ende befindet (wahr / falsch-Wert)

th:block

HelloController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("list", Arrays.asList("hoge", "fuga", "piyo"));
        
        return "hello";
    }
}

hello.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Thymeleaf</title>
    </head>
    <body>
        <th:block th:each="element : ${list}">
            <h2>[[${element}]]</h2>
        </th:block>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

hello.html


        <th:block th:each="element : ${list}">
            <h2>[[${element}]]</h2>
        </th:block>

--<th: block>Tags werden nach dem Rendern vollständig gelöscht

  • Die Thymeleaf-Verarbeitung (th: if usw.) kann geschrieben werden, sodass das Tag
    ` nicht erhöht werden muss, nur um die Verarbeitung zu schreiben.

Ein Fragment einbetten

Betten Sie andere Vorlagen ein

Ordnerstruktur


`-src/main/
  |-java/sample/thymeleaf/
  | `-FragmentController.java
  |
  `-resources/templates/fragment/
    |-fragment.html
    `-embedded.html

FragmentController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FragmentController {
    
    
    @GetMapping("/fragment")
    public String fragment() {
        return "fragment/fragment";
    }
}

embedded.html


<h2>embedded</h2>

fragment.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Fragment</title>
    </head>
    <body>
        <h1>Hello Fragment</h1>
        <div id="foo"
             th:insert="fragment/embedded"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

Ordnerstruktur


`-src/main/
  `-resources/templates/fragment/
    |-fragment.html
    `-embedded.html

fragment.html


        <div id="foo"
             th:insert="fragment/embedded"></div>

--Verwenden Sie th: insert, um andere Vorlagen einzubetten

  • In Version 2.x gab es "th: include", aber in Version 3.x ist es veraltet
  • Geben Sie die Vorlage an, die in den Wert eingebettet werden soll
  • Der hier angegebene Wert wendet dieselbe Logik an wie beim Auflösen der Vorlagendatei aus dem Rückgabewert der Controller-Klasse.
  • Sie können auch einen Ausdruck mit dem Wert "th: insert" ("th: insert =" fragment / $ {name} ") verwenden.

Geben Sie das einzubettende Fragment an

embedded.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <body>
        <span th:fragment="hoge">hoge</span>
        <span th:fragment="fuga">fuga</span>
    </body>
</html>

fragment.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Fragment</title>
    </head>
    <body>
        <h1>Hello Fragment</h1>
        <div id="foo"
             th:insert="fragment/embedded :: fuga"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

embedded.html


        <span th:fragment="hoge">hoge</span>
        <span th:fragment="fuga">fuga</span>
  • Geben Sie den Namen des Fragments mit dem Attribut "th: fragment" auf der Einbettungsseite an

fragment.html


        <div id="foo"
             th:insert="fragment/embedded :: fuga"></div>
  • Durch Angabe von "[Vorlagenname] :: [einzubettender Fragmentname]" in "th: insert" können Sie nur das angegebene Fragment der angegebenen Vorlage einbetten.

Vollständig ersetzen durch th: ersetzen

embedded.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <body>
        <span id="hoge" th:fragment="hoge">
            HOGE
        </span>
    </body>
</html>

fragment.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Fragment</title>
    </head>
    <body>
        <h1>Hello Fragment</h1>
        <div id="foo"
             th:insert="fragment/embedded :: hoge"></div>
        <div id="bar"
             th:replace="fragment/embedded :: hoge"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

  • Im Fall von "th: insert" das untergeordnete Element des Tags mit dem Inhalt ("th: fragment") des Tags des Einbettungsziels ("embedded.html") im Tag auf der Seite der Einbettungsquelle ("fragment.html") Element) ist eingebettet
  • Im Fall von "th: replace" wird das Tag auf der Seite der Einbettungsquelle ("fragment.html") durch das Tag selbst (das Tag selbst mit "th: fragment") des Einbettungsziels ("embedded.html") ersetzt.

Übergeben Sie die Parameter an das Fragment

embedded.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <body>
        <span th:fragment="hoge(p1, p2)">
            p1 = [[${p1}]], p2 = [[${p2}]]
        </span>
    </body>
</html>

fragment.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>Hello Fragment</title>
    </head>
    <body>
        <h1>Hello Fragment</h1>
        <div th:insert="fragment/embedded :: hoge('HOGE', 'FUGA')"></div>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

embedded.html


        <span th:fragment="hoge(p1, p2)">
            p1 = [[${p1}]], p2 = [[${p2}]]
        </span>
  • Nachdem Sie den Fragmentnamen deklariert haben, können Sie die Parameter, die das Fragment empfängt, in Form von Methodenargumenten deklarieren.

fragment.html


        <div th:insert="fragment/embedded :: hoge('HOGE', 'FUGA')"></div>
  • Die Einbettungsseite kann wie ein Methodenaufruf ein Argument nach dem Fragmentnamen übergeben
  • Das Argument kann auch namentlich angegeben werden, z. B. "hoge (p1 =" HOGE ", p2 =" FUGA ")

Thymeleaf Layout Dialect Fragmente bestanden darin, gemeinsame Teile in einzelne Seiten einzubetten. Im Gegensatz dazu binden Sie diesmal Ihre eigene Seite in das gemeinsame Layout (Kopf- und Fußzeile) ein.

Dieser Prozess selbst kann nicht allein durch die Standardfunktion realisiert werden, und es ist erforderlich, eine Erweiterungsfunktion namens "Thymeleaf-Layout-Dialect" aufzunehmen.

build.gradle


ext['thymeleaf.version'] = '3.0.7.RELEASE'
ext['thymeleaf-layout-dialect.version'] = '2.2.2'

Diese "Thymeleaf-Layout-Dialect.version" ist wund.

Ordnerstruktur


`-src/main/
  |-java/sample/thymeleaf/web/
  |  `-LayoutController.java
  |
  `-resources/templates/layout/
     |-layout.html
     `-content.html

LayoutController.java


package sample.thymeleaf.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LayoutController {
    
    @GetMapping("/layout")
    public String method() {
        return "layout/content";
    }
}

layout.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head>
        <meta charset="UTF-8" />
        <title>Layout File</title>
    </head>
    <body>
        <h1>Common Layout</h1>
        <section layout:fragment="content">
        </section>
    </body>
</html>

content.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/layout}">
    <body>
        <section layout:fragment="content">
            Content
        </section>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

LayoutController.java


    @GetMapping("/layout")
    public String method() {
        return "layout/content";
    }
  • Geben Sie als Vorlage für "content.html" an

layout.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head>
        <meta charset="UTF-8" />
        <title>Layout File</title>
    </head>
    <body>
        <h1>Common Layout</h1>
        <section layout:fragment="content">
        </section>
    </body>
</html>

--Declare xmlns: layout =" http://www.ultraq.net.nz/thymeleaf/layout " als Namespace

  • Definieren Sie den Ort, an dem die Informationen jeder Seite mit "layout: fragment" eingebettet werden sollen

content.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/layout}">
    <body>
        <section layout:fragment="content">
            Content
        </section>
    </body>
</html>
  • Geben Sie die Vorlage an, deren Layout durch "layout: decorate" definiert ist --Verwenden Sie den in v3.x hinzugefügten Fragmentausdruck für den Wert --Fragment-Ausdruck wird im Format ~ {} beschrieben und die Position der Vorlage angegeben.
  • Das Format des Fragmentausdrucks ist fast das gleiche wie das durch th: insert angegebene.
  • Einzelheiten finden Sie unter Offizielles Dokument
  • Übrigens funktioniert es auch, wenn Sie nicht den Fragmentausdruck ~ {} verwenden, sondern eine Warnmeldung an die Konsole ausgegeben wird.
  • Entsprechend der Nachricht wird es in Zukunft nicht mehr verwendbar sein

Gebäudetitel

layout.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head>
        <meta charset="UTF-8" />
        <title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">Layout</title>
    </head>
    <body>
        <h1>Common Layout</h1>
        <section layout:fragment="content">
        </section>
    </body>
</html>

content.html


<!doctype html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/layout}">
    <head>
        <title>Content</title>
    </head>
    <body>
        <section layout:fragment="content">
            Content
        </section>
    </body>
</html>

** Ausführungsergebnis **

thymeleaf.jpg

Erläuterung

layout.html


        <title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">Layout</title>
  • Der Inhalt von "" kann eine Kombination aus der Layoutdatei und der Inhaltsdatei sein.</li> <li>Setzen Sie das Attribut <code>layout: title-pattern</code> auf der Seite der Layoutdatei auf<code> <title></code> und definieren Sie die Form des kombinierten<code><title></code>im Wert.</li> <li>"$ LAYOUT_TITLE" bezieht sich auf "<title>" in der Layoutdatei, "$ CONTENT_TITLE" bezieht sich auf "<title>" auf der Seite der Inhaltsdatei.</li> </ul> <h4><strong><code>content.html</code></strong></h4> <pre><code class="language-html"> <head> <title>Content</title> </head> </code></pre> <ul> <li>Die Seite der Inhaltsdatei deklariert nur "<title>" normal</li> </ul> <h4><strong><code>Generierter HTML-Titel</code></strong></h4> <pre><code class="language-html"> <title>Layout - Content</title> </code></pre> <ul> <li>Der Wert ist eine Kombination aus "<title>" in der Layoutdatei und "<title>" in der Inhaltsdatei.</li> </ul> <h1>Kommentar</h1> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title> </head> <body> <!-- standard html comment --> <!--/* --> <h1 th:text="'parser level comment'"></h1> <!-- */--> <!--/*/ <h1 th:text="'prototype comment'"></h1> /*/--> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/c0cc4e33-893f-4690-e693-70563966297f.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Es gibt drei Arten von Thymeleaf-Kommentaren</li> </ul> <h2>Regelmäßiger HTML-Kommentar</h2> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!-- standard html comment --> </code></pre> <ul> <li>Dies ist ein normaler HTML-Kommentar</li> <li>Es wird wie nach dem Rendern ausgegeben und als Kommentar zu HTML behandelt.</li> </ul> <h2>Kommentare auf Parser-Ebene</h2> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!--/* --> <h1 th:text="'parser level comment'"></h1> <!-- */--> </code></pre> <ul> <li>Mit <code><! - / *</code> beginnen und mit <code>* / -></code> enden --Dieser Kommentar wird beim Rendern vollständig entfernt und ist in HTML nicht mehr vorhanden</li> <li>Sie können es auch mit "<! - / * ->" und "<! - * / ->" einschließen. Es wird also angezeigt, wenn Sie es in einem Browser öffnen, aber es verschwindet, wenn Sie es auf dem Server ausführen. Kann realisiert werden</li> </ul> <h2>Prototyp nur Kommentare</h2> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!--/*/ <h1 th:text="'prototype comment'"></h1> /*/--> </code></pre> <ul> <li>Der Bereich von "<! - / * /" bis "/ * / ->" gilt.</li> <li>Wenn es direkt im Browser geöffnet wird, wird es als einfacher HTML-Kommentar behandelt, aber das Rendern von Thymeleaf ist zielgerichtet.</li> <li>Es wird als Kommentar als Prototyp behandelt, aber es wird verwendet, wenn Thymeleaf es verarbeiten soll, wenn es tatsächlich auf dem Server ausgeführt wird.</li> </ul> <h1>Nachrichtenressource</h1> <h4><strong><code>Ordnerstruktur</code></strong></h4> <pre><code class="language-text"> `-src/main/ |-java/sample/thymeleaf/ | |-web/ | | `-HelloController.java | `-Main.java | `-resources/ |-messages/ | `-Messages_ja.properties `-templates/ `-hello.html </code></pre> <h4><strong><code>Main.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ResourceBundleMessageSource; @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("messages/Messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } } </code></pre> <h4><strong><code>Messages_ja.properties</code></strong></h4> <pre><code class="language-properties"> foo.message=Guten Morgen Welt bar.message=Auf Wiedersehen Welt </code></pre> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title> </head> <body> <h1 th:text="#{foo.message}"></h1> <h1 th:text="#{bar.message}"></h1> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/e710e099-a7f9-9ac0-bfc6-281be874c907.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>Main.java</code></strong></h4> <pre><code class="language-java"> import org.springframework.context.support.ResourceBundleMessageSource; ... @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("messages/Messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } </code></pre> <ul> <li>Angabe der von Spring verarbeiteten Ressourcenpaketdatei</li> <li>Da die Codierung auf "UTF-8" eingestellt ist, können Sie Japanisch so schreiben, wie es in der Nachrichtendatei ist.</li> </ul> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <h1 th:text="#{foo.message}"></h1> <h1 th:text="#{bar.message}"></h1> </code></pre> <p>--Verwenden Sie den Ausdruck "# {}", um auf die Nachricht aus der Thymeleaf-Vorlage zu verweisen.</p> <ul> <li>Geben Sie den Schlüssel der Nachricht an, die im Inneren angezeigt werden soll</li> </ul> <h2>Parameter in Nachricht einbetten</h2> <h4><strong><code>Messages_ja.properties</code></strong></h4> <pre><code class="language-properties"> foo.message=Guten Morgen{0} </code></pre> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title> </head> <body> <h1 th:text="#{foo.message('Sekai')}"></h1> <h1 th:text="#{foo.message('Welt')}"></h1> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/e05dc968-f042-20fc-452b-5e672f412d85.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <h1 th:text="#{foo.message('Sekai')}"></h1> <h1 th:text="#{foo.message('Welt')}"></h1> </code></pre> <ul> <li>Wenn die Nachricht einen Platzhalter hat, können Sie den Parameter wie ein Methodenargument wie "# {Schlüsselname (Parameter ...)}" übergeben</li> </ul> <h1>Frühlingsbohne</h1> <h4><strong><code>MySpringBean.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf; import org.springframework.stereotype.Component; @Component public class MySpringBean { public String hello() { return "Hello MySpringBean!!"; } } </code></pre> <h4><strong><code>hello.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title> </head> <body> <h1 th:text="${@mySpringBean.hello()}"></h1> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/4914d432-4223-980a-9119-4c40dd46e744.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Da <code>$ {}</code> als SpEL-Ausdruck ausgewertet wird, kann auch auf Spring Beans verwiesen werden.</li> <li>Um auf eine Spring Bean zu verweisen, verwenden Sie "@bean name"</li> </ul> <h1>Verknüpfen von Formulardaten mit Spring MVC</h1> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; public class MyForm { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } </code></pre> <p>--Getter und Setter sind erforderlich, da die Form-Klasse standardmäßig den Eigenschaftszugriff verwendet.</p> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/form") public class FormController { @GetMapping public String init(Model model) { model.addAttribute(new MyForm()); return "form"; } @PostMapping public String submit(MyForm form) { System.out.println("form.value=" + form.getValue()); return "form"; } } </code></pre> <ul> <li>Registrieren Sie das Objekt von "MyForm" bei "Model.addAttribute ()" zum Zeitpunkt der ersten Anzeige</li> </ul> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <input type="text" th:field="*{value}" /> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/972095b9-16f3-75fd-798e-3640ded330c9.jpeg" alt="thymeleaf.jpg" /></p> <p>Geben Sie die entsprechenden Zeichen ein und klicken Sie auf die Schaltfläche Senden.</p> <h4><strong><code>Ausgabe der Serverkonsole</code></strong></h4> <pre><code class="language-text"> form.value=test </code></pre> <p><strong>Erläuterung</strong></p> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <form th:action="@{/form}" method="post" th:object="${myForm}"> <input type="text" th:field="*{value}" /> <input type="submit" value="Submit" /> </form> </code></pre> <ul> <li>Um das Formularobjekt ("MyForm") auf der Java-Seite mit dem HTML-Tag "<form>" zu verknüpfen, geben Sie das im Controller registrierte Formularobjekt mit dem Tag "th: object" an.</li> <li>(Es funktionierte ohne "th: object", aber die Dokumentation sagte, dass es erforderlich war ...) --Verwenden Sie das Attribut <code>th: field</code>, um jedes Eingabeelement den Formulareigenschaften zuzuordnen</li> </ul> <h2>Kontrollkästchenetikett</h2> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; public class MyForm { private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <label th:for="${#ids.next('checked')}">checked</label> <input type="checkbox" th:field="*{checked}" /> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/085b5288-a438-e02e-255f-1ca5e17e2ee6.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Wenn Sie "th: field" verwenden, wird das Attribut "id" automatisch von Thymeleaf zugewiesen.</li> <li>Es wird schwierig, "für" anzugeben, insbesondere wenn Sie während einer Schleife mehrere Kontrollkästchen erstellen.</li> <li>Um dies zu unterstützen, können Sie durch Angabe von "$ {# ids.next (" [Name der Eigenschaft, die Sie zuordnen möchten] ") mit" th: for "den Attributwert" for "auf die Zieleigenschaft setzen. Der Attributwert "id" wird festgelegt --Verwenden Sie "$ {# ids.prev ()}", wenn das Kontrollkästchen vor "<Label>" steht</li> </ul> <h2>Radio knopf</h2> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import java.util.LinkedHashMap; import java.util.Map; public class MyForm { private String selectedValue = "piyo"; public Map<String, String> radioButtons() { Map<String, String> radioButtons = new LinkedHashMap<>(); radioButtons.put("hoge", "HOGE"); radioButtons.put("fuga", "FUGA"); radioButtons.put("piyo", "PIYO"); return radioButtons; } public String getSelectedValue() { return selectedValue; } public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; } } </code></pre> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/form") public class FormController { @GetMapping public String init(Model model) { model.addAttribute(new MyForm()); return "form"; } @PostMapping public String submit(MyForm form) { System.out.println("form.selectedValue=" + form.getSelectedValue()); return "form"; } } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <div th:each="radioButton : *{radioButtons()}"> <label th:for="${#ids.next('selectedValue')}" th:text="${radioButton.value}"></label> <input type="radio" th:field="*{selectedValue}" th:value="${radioButton.key}" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/4ed25e52-6010-ad9f-7222-458f3a494010.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> private String selectedValue = "piyo"; public Map<String, String> radioButtons() { Map<String, String> radioButtons = new LinkedHashMap<>(); radioButtons.put("hoge", "HOGE"); radioButtons.put("fuga", "FUGA"); radioButtons.put("piyo", "PIYO"); return radioButtons; } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <div th:each="radioButton : *{radioButtons()}"> <label th:for="${#ids.next('selectedValue')}" th:text="${radioButton.value}"></label> <input type="radio" th:field="*{selectedValue}" th:value="${radioButton.key}" /> </div> </code></pre> <ul> <li>Um das Optionsfeld und das Formular zuzuordnen, bereiten Sie die folgenden beiden vor</li> <li>Informationen zum Erstellen von Optionsfeldern (<code>raidoButtons ()</code>)</li> <li>Dieses Mal habe ich "LinkedHashMap" verwendet, um es schnell zu machen, aber in Wirklichkeit denke ich, dass ich eine dedizierte Containerklasse vorbereiten werde, um Etiketten und Werte zu speichern und in "Liste" usw. zu packen. --Eigenschaft zum Speichern des ausgewählten Werts (<code>selectedValue</code>) --Bauen Sie Optionsfelder, während Sie das Ergebnis von <code>radioButtons ()</code> mit<code> th: each</code> drehen</li> <li>Wenn Sie ein Optionsfeld einem Formular zuordnen, müssen Sie nicht nur "th: field", sondern auch "th: value" angeben.</li> <li>Weil Sie den Wert benötigen, wenn dieses Element ausgewählt ist</li> <li>Wenn Sie den Anfangswert auswählen möchten, legen Sie den ausgewählten Wert in der entsprechenden Eigenschaft fest (<code>selectedValue =" piyo "</code>)</li> <li>Wenn Sie keinen Wert festlegen, werden alle Elemente nicht ausgewählt.</li> </ul> <h2>Dropdown-Liste</h2> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import java.util.LinkedHashMap; import java.util.Map; public class MyForm { private String selectedValue; public Map<String, String> options() { Map<String, String> radioButtons = new LinkedHashMap<>(); radioButtons.put("hoge", "HOGE"); radioButtons.put("fuga", "FUGA"); radioButtons.put("piyo", "PIYO"); return radioButtons; } public String getSelectedValue() { return selectedValue; } public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; } } </code></pre> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/form") public class FormController { @GetMapping public String init(Model model) { model.addAttribute(new MyForm()); return "form"; } @PostMapping public String submit(MyForm form) { System.out.println("form.selectedValue=" + form.getSelectedValue()); return "form"; } } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <select th:field="*{selectedValue}"> <option th:each="option : *{options()}" th:value="${option.key}" th:text="${option.value}"> </option> </select> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/f3f980e5-5be6-db57-0057-8eb92a427a2a.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Um dynamisch eine Dropdown-Liste zu erstellen, schleifen Sie "<Option>" mit "th: each" --<code> th: field</code> wird in das Tag <select> geschrieben --<code>th: value</code> muss für<code><Option></code>angegeben werden</li> </ul> <h2>Dynamisches Feld</h2> <p>So erstellen Sie Eingabeelemente, mit denen Zeilen dynamisch hinzugefügt / gelöscht werden können</p> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import java.util.ArrayList; import java.util.List; public class MyForm { private List<Row> rows = new ArrayList<>(); public void appendRow() { this.rows.add(new Row()); } public void removeRow(int index) { this.rows.remove(index); } public List<Row> getRows() { return rows; } public void setRows(List<Row> rows) { this.rows = rows; } public static class Row { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } } </code></pre> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @Controller @RequestMapping("/form") public class FormController { @GetMapping public String init(Model model) { model.addAttribute(new MyForm()); return "form"; } @PostMapping(params="appendRow") public String appendRow(MyForm form) { form.appendRow(); this.printRows(form); return "form"; } @PostMapping(params="removeIndex") public String submit(MyForm form, @RequestParam int removeIndex) { form.removeRow(removeIndex); this.printRows(form); return "form"; } private void printRows(MyForm form) { List<MyForm.Row> rows = form.getRows(); for (int i = 0; i < rows.size(); i++) { MyForm.Row row = rows.get(i); System.out.println("i=" + i + ", row.value=" + row.getValue()); } } } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <table border="1"> <tr> <th>No</th> <th>User input</th> <th>Remove Row</th> </tr> <tr th:each="row, loop : *{rows}"> <th th:text="${loop.count}"></th> <th> <input type="text" th:field="*{rows[__${loop.index}__].value}" /> </th> <th> <button type="submit" name="removeIndex" th:value="${loop.index}"> Remove </button> </th> </tr> </table> <input type="submit" name="appendRow" value="Append Row" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/5f982b10-b389-20f0-c8c3-3f51be5fe346.gif" alt="thymeleaf.gif" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <tr th:each="row, loop : *{rows}"> <th th:text="${loop.count}"></th> <th> <input type="text" th:field="*{rows[__${loop.index}__].value}" /> </th> <th> <button type="submit" name="removeIndex" th:value="${loop.index}"> Remove </button> </th> </tr> </code></pre> <ul> <li>Wenn Sie Felder zuordnen, die dynamisch zunehmen oder abnehmen, müssen Sie ein wenig entwickeln, um "th: field" anzugeben.</li> <li>Einfach $ {row.value} `führt zu einem Fehler</li> <li>Auf jedes Element muss durch Indizieren von "Zeilen" zugegriffen werden</li> <li>Darüber hinaus verwendet die Indexspezifikation den ** Vorverarbeitungsmechanismus <em><em>. --Vorverarbeitung ist ein Mechanismus, mit dem Sie vor einem normalen Ausdruck auswerten können. Er wird beschrieben, indem Sie ihn in "__" einschließen. --<code>__ $ {loop.index} __</code> Teil --Dies ermöglicht es, "</em> {rows [__ $ {loop.index} __] .value}" als "</em> {rows [0] .value}" auszuwerten und dann in "* {}" weiter auszuwerten. So werden</li> <li>Es scheint einfach als "* {rows [loop.index] .value}" zu funktionieren, aber leider funktioniert es nicht.</li> <li>Dies liegt daran, dass SpEL-Ausdrücke nicht in Klammern angegeben werden können, die den Index der Liste angeben.</li> </ul> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> @PostMapping(params="appendRow") public String appendRow(MyForm form) { form.appendRow(); this.printRows(form); return "form"; } @PostMapping(params="removeIndex") public String submit(MyForm form, @RequestParam int removeIndex) { form.removeRow(removeIndex); this.printRows(form); return "form"; } </code></pre> <ul> <li>Um festzustellen, ob auf die Schaltfläche "Zeile anhängen" oder auf die Schaltfläche "Entfernen" geklickt wurde, geben Sie das Attribut "Name" für die Schaltfläche an und wechseln Sie den Methodenaufruf des Controllers mit oder ohne Parameter. Ist</li> <li>Die <code>Parameter</code> von Mapping-Annotationen (<code> @ PostMapping</code>, <code>@ GetMapping</code> usw.) können verwendet werden, um" Ausführen, wenn dieser Parameter vorhanden ist "zu steuern.</li> </ul> <h1>Validierung</h1> <p>Spring MVC bietet einen Mechanismus zur Überprüfung der Eingabe mithilfe der Bean-Validierung. Thymeleaf bietet einen Mechanismus zum Überprüfen des Ergebnisses dieses Fehlers und zum Anzeigen einer Fehlermeldung.</p> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import javax.validation.constraints.Min; import javax.validation.constraints.Size; public class MyForm { @Size(min=3) private String text; @Min(100) private Integer number; public String getText() { return text; } public void setText(String text) { this.text = text; } public Integer getNumber() { return number; } public void setNumber(Integer number) { this.number = number; } } </code></pre> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/form") public class FormController { @GetMapping public String init(Model model) { model.addAttribute(new MyForm()); return "form"; } @PostMapping public String submit(@Validated MyForm form, BindingResult result) { System.out.println("********************************************************"); System.out.println("form = " + form); System.out.println("result = " + result); System.out.println("********************************************************"); return "form"; } } </code></pre> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <div> <input type="text" th:field="*{text}" /> <ul th:each="error : ${#fields.errors('text')}"> <li th:text="${error}"></li> </ul> </div> <div> <input type="text" th:field="*{number}" /> <ul th:each="error : ${#fields.errors('number')}"> <li th:text="${error}"></li> </ul> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/5c69ea26-d22b-c96b-b2f7-bf5d1b7082fb.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> import javax.validation.constraints.Min; import javax.validation.constraints.Size; ... @Size(min=3) private String text; @Min(100) private Integer number; </code></pre> <ul> <li>Notieren Sie die Formularfelder mit Bean Validation-Anmerkungen und definieren Sie den Prüfinhalt.</li> <li>Informationen zur Verwendung der Bean-Validierung finden Sie unter <a href="http://qiita.com/opengl-8080/items/3926fbde5469c0b330c2">hier</a>.</li> </ul> <h4><strong><code>FormController.java</code></strong></h4> <pre><code class="language-java"> import org.springframework.validation.annotation.Validated; ... @PostMapping public String submit(@Validated MyForm form, BindingResult result) { </code></pre> <ul> <li>Die Eingabeprüfung wird aktiviert, indem das Formularobjekt im Argument der Controller-Methode mit "@ Validated" versehen wird.</li> </ul> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <div> <input type="text" th:field="*{text}" /> <ul th:each="error : ${#fields.errors('text')}"> <li th:text="${error}"></li> </ul> </div> <div> <input type="text" th:field="*{number}" /> <ul th:each="error : ${#fields.errors('number')}"> <li th:text="${error}"></li> </ul> </div> </code></pre> <ul> <li>Auf Fehlermeldungen, die von jeder Eigenschaft generiert werden, kann mit <code>$ {# fields.errors ('[Eigenschaftsname]')}</code> zugegriffen werden</li> <li>Die Ergebnisse werden aufgelistet, sodass Sie jede Fehlermeldung durch Umlaufen erhalten können.</li> </ul> <h2>Überprüfen Sie, ob der Artikel ein Fehler ist</h2> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <div> <input type="text" th:field="*{text}" /> <span th:if="${#fields.hasErrors('text')}">Es ist ein Fehler!</span> </div> <div> <input type="text" th:field="*{number}" /> <span th:if="${#fields.hasErrors('number')}">Es ist ein Fehler!</span> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/cef83323-8759-8f42-6293-876f5ded7dfb.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Sie können mit <code>$ {# fields.hasErrors ('[Eigenschaftsname]')}</code> überprüfen, ob in der Eigenschaft ein Fehler vorliegt</li> </ul> <h2>Geben Sie den Stil an, wenn ein Fehler auftritt</h2> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <div> <input type="text" th:field="*{text}" class="always-assigned" th:errorclass="error-style" /> </div> <div> <input type="text" th:field="*{number}" class="always-assigned" th:errorclass="error-style" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/35a33496-3686-4b19-f79c-47bf2c69aa34.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Wenn Sie das Attribut <code>th: errorclass</code> angeben, wird das angegebene Klassenattribut nur hinzugefügt, wenn in dieser Eigenschaft ein Fehler auftritt.</li> <li>Wenn Sie einen Fehlerstil anwenden möchten, ist dieser einfacher und verständlicher als "$ {# fields.hasErrors ('text')? 'Error-style'}"</li> </ul> <h2>Überprüfen Sie, ob mindestens ein Fehler vorliegt</h2> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <h3 th:if="${#fields.hasAnyErrors()}">Es gibt einen Fehler</h3> <div> <input type="text" th:field="*{text}" /> </div> <div> <input type="text" th:field="*{number}" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/ad90fe57-796f-432b-0100-0da477cf21ca.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <h3 th:if="${#fields.hasAnyErrors()}">Es gibt einen Fehler</h3> </code></pre> <ul> <li>Mit <code># fields.hasAnyErrors ()</code> können Sie überprüfen, ob mindestens ein Fehler vorliegt</li> <li>Sie können das gleiche Ergebnis mit "# fields.hasErrors (" * ")" oder "# fields.hasErrors (" all ")" erzielen</li> </ul> <h2>Erhalten Sie alle Fehlermeldungen</h2> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <ul> <li th:each="error: ${#fields.allErrors()}"> [[${error}]] </li> </ul> <div> <input type="text" th:field="*{text}" /> </div> <div> <input type="text" th:field="*{number}" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/6f9fd659-105f-c40c-bc5b-5a12528a00ce.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Sie können alle Fehlermeldungen mit <code># fields.allErrors ()</code> erhalten</li> <li>Dies funktioniert genauso, wenn Sie "# fields.errors ('*')" oder "# fields.errors ('all')" verwenden.</li> </ul> <h2>Globaler Fehler</h2> <p>Fehler, die nicht an eine bestimmte Eigenschaft gebunden sind, werden (wahrscheinlich) als globale Fehler bezeichnet.</p> <p>Erstellen Sie Ihre eigene Validierung, um die Korrelation zu überprüfen und einen globalen Fehler zu generieren.</p> <h4><strong><code>MyValidation.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.validation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Constraint(validatedBy = MyValidator.class) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyValidation { String message() default "Es ist ein Fehler!"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } </code></pre> <h4><strong><code>MyValidator.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.validation; import sample.thymeleaf.web.MyForm; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class MyValidator implements ConstraintValidator<MyValidation, MyForm> { @Override public void initialize(MyValidation constraintAnnotation) { System.out.println("MyValidator initialize"); } @Override public boolean isValid(MyForm value, ConstraintValidatorContext context) { System.out.println("MyValidator isValid"); if (value == null) { return true; } Integer number = value.getNumber(); if (number == null) { return true; } String text = value.getText(); if (number == 500) { return "500".equals(text); } return true; } } </code></pre> <p>--Varidaten, um zu überprüfen, ob "Text" auch "500" ist, wenn "Nummer" "500" ist</p> <ul> <li>Informationen zum Erstellen eines eigenen Validators finden Sie hier [http://qiita.com/opengl-8080/items/3926fbde5469c0b330c2#%E8%87%AA%E4%BD%9C%E3%81%AE%E3% 83% 90% E3% 83% AA% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% A8% E5% 88% B6% E7% B4% 84% E3% 82% A2% E3% 83% 8E% E3% 83% 86% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E3% 82% 92% E4% BD% 9C% Siehe E6% 88% 90% E3% 81% 99% E3% 82% 8B)</li> </ul> <h4><strong><code>MyForm.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf.web; import sample.thymeleaf.validation.MyValidation; import javax.validation.constraints.Min; import javax.validation.constraints.Size; @MyValidation public class MyForm { @Size(min=3) private String text; @Min(100) private Integer number; ... } </code></pre> <ul> <li>Notieren Sie "MyForm" mit "@ MyValidation"</li> </ul> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <h3>[[${#fields.hasGlobalErrors()}]]</h3> <div> <input type="text" th:field="*{text}" /> </div> <div> <input type="text" th:field="*{number}" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p>Setzen Sie <code>number</code> auf etwas anderes als<code> 500</code>, um einen Fehler zu machen</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/51814ba2-c853-3bad-e2ce-094b53d98323.jpeg" alt="thymeleaf.jpg" /></p> <p>Ändern Sie "Nummer" in "500", um einen Fehler zu machen</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/3d294326-621a-d6b4-fb7e-d73d1fd02d62.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <h3>[[${#fields.hasGlobalErrors()}]]</h3> </code></pre> <ul> <li>Mit <code># fields.hasGlobalErrors ()</code> können Sie überprüfen, ob globale Fehler vorliegen</li> <li>Dies ist das gleiche Ergebnis mit "# fields.hasErrors (" global ")"</li> </ul> <h3>Erhalten Sie globale Fehlermeldungen</h3> <h4><strong><code>form.html</code></strong></h4> <pre><code class="language-html"> <!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Form Sample</title> </head> <body> <form th:action="@{/form}" method="post" th:object="${myForm}"> <h3>[[${#fields.globalErrors()}]]</h3> <div> <input type="text" th:field="*{text}" /> </div> <div> <input type="text" th:field="*{number}" /> </div> <input type="submit" value="Submit" /> </form> </body> </html> </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/9d2d65b1-61e1-4266-6810-13f89fd05664.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Sie können alle globalen Fehlermeldungen mit <code># fields.globalErrors ()</code> erhalten</li> <li>Dies ergibt das gleiche Ergebnis mit "# fields.errors (" global ")"</li> </ul> <h2>Fehlermeldung ändern</h2> <h4><strong><code>Main.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ResourceBundleMessageSource; @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.addBasenames("messages/Messages", "messages/validation-messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } } </code></pre> <h4><strong><code>MyWebConfig.java</code></strong></h4> <pre><code class="language-java"> package sample.thymeleaf; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Configuration; import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class MyWebConfig extends WebMvcConfigurerAdapter { private MessageSource messageSource; public MyWebConfig(MessageSource messageSource) { this.messageSource = messageSource; } @Override public Validator getValidator() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.setValidationMessageSource(messageSource); return validator; } } </code></pre> <h4><strong><code>src/main/resources/messages/validation-messages_ja.properties</code></strong></h4> <pre><code class="language-properties"> javax.validation.constraints.Min.message = {value}Bitte oben eingeben </code></pre> <p>** Ausführungsergebnis **</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/28302/888cac70-0c40-1b53-3713-3ddafb14cd7d.jpeg" alt="thymeleaf.jpg" /></p> <p><strong>Erläuterung</strong></p> <ul> <li>Aufgrund der Bean-Validierungsspezifikationen können Sie die Standardnachrichten überschreiben, indem Sie eine Eigenschaftendatei mit "ValidationMessages" als Basisnamen direkt unter dem Klassenpfad platzieren.</li> <li>Es ist jedoch etwas unpraktisch, da Sie die Eigenschaftendatei mit native2ascii codieren müssen.</li> <li>Wenn Sie den "MessageSource" -Mechanismus von Spring verwenden, können Sie Nachrichten in UTF-8 schreiben, was praktisch ist.</li> </ul> <h4><strong><code>Main.java</code></strong></h4> <pre><code class="language-java"> @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.addBasenames("messages/Messages", "messages/validation-messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } </code></pre> <p>--Nachrichtendatei für die Bean-Validierung mit addBasenames () hinzufügen</p> <h4><strong><code>validation-messages_ja.properties</code></strong></h4> <pre><code class="language-properties"> javax.validation.constraints.Min.message = {value}Bitte oben eingeben </code></pre> <p>--Überprüfen Sie die Standardnachrichtendatei, um herauszufinden, was der Schlüssel ist --Hibernate Validator ist in der Abhängigkeit enthalten, sodass Sie die Liste der Standardnachrichten anzeigen können, indem Sie in diesem JAR auf "ValidationMessages.properties" klicken.</p> <h4><strong><code>ValidationMessages.properties</code></strong></h4> <pre><code class="language-properties"> javax.validation.constraints.AssertFalse.message = must be false javax.validation.constraints.AssertTrue.message = must be true javax.validation.constraints.DecimalMax.message = must be less than ${inclusive == true ? 'or equal to ' : ''}{value} javax.validation.constraints.DecimalMin.message = must be greater than ${inclusive == true ? 'or equal to ' : ''}{value} javax.validation.constraints.Digits.message = numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected) javax.validation.constraints.Future.message = must be in the future javax.validation.constraints.Max.message = must be less than or equal to {value} javax.validation.constraints.Min.message = must be greater than or equal to {value} javax.validation.constraints.NotNull.message = may not be null javax.validation.constraints.Null.message = must be null javax.validation.constraints.Past.message = must be in the past javax.validation.constraints.Pattern.message = must match "{regexp}" javax.validation.constraints.Size.message = size must be between {min} and {max} org.hibernate.validator.constraints.CreditCardNumber.message = invalid credit card number org.hibernate.validator.constraints.EAN.message = invalid {type} barcode org.hibernate.validator.constraints.Email.message = not a well-formed email address org.hibernate.validator.constraints.Length.message = length must be between {min} and {max} org.hibernate.validator.constraints.LuhnCheck.message = The check digit for ${validatedValue} is invalid, Luhn Modulo 10 checksum failed org.hibernate.validator.constraints.Mod10Check.message = The check digit for ${validatedValue} is invalid, Modulo 10 checksum failed org.hibernate.validator.constraints.Mod11Check.message = The check digit for ${validatedValue} is invalid, Modulo 11 checksum failed org.hibernate.validator.constraints.ModCheck.message = The check digit for ${validatedValue} is invalid, ${modType} checksum failed org.hibernate.validator.constraints.NotBlank.message = may not be empty org.hibernate.validator.constraints.NotEmpty.message = may not be empty org.hibernate.validator.constraints.ParametersScriptAssert.message = script expression "{script}" didn't evaluate to true org.hibernate.validator.constraints.Range.message = must be between {min} and {max} org.hibernate.validator.constraints.SafeHtml.message = may have unsafe html content org.hibernate.validator.constraints.ScriptAssert.message = script expression "{script}" didn't evaluate to true org.hibernate.validator.constraints.URL.message = must be a valid URL org.hibernate.validator.constraints.br.CNPJ.message = invalid Brazilian corporate taxpayer registry number (CNPJ) org.hibernate.validator.constraints.br.CPF.message = invalid Brazilian individual taxpayer registry number (CPF) org.hibernate.validator.constraints.br.TituloEleitoral.message = invalid Brazilian Voter ID card number </code></pre> <h1>Referenz</h1> <ul> <li><a href="http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html">Tutorial: Using Thymeleaf (ja)</a></li> <li><a href="http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html">Tutorial: Thymeleaf + Spring</a></li> <li><a href="http://qiita.com/kazuki43zoo/items/da64a68b9805e512cdc9">Einstellungsmethode für die Verwendung der Thymeleaf 3.0-Serie mit Spring Boot 1.4 - Qiita</a></li> <li><a href="http://masatoshitada.hatenadiary.jp/entry/2016/08/10/132137">Verwenden Sie Thymeleaf 3 mit Spring Boot 1.4 - Java EE Erste Schritte! </a></li> <li><a href="https://github.com/spring-projects/spring-boot/issues/4393#issuecomment-233131972">Support Thymeleaf 3 · Issue #4393 · spring-projects/spring-boot</a></li> <li><a href="https://ultraq.github.io/thymeleaf-layout-dialect/">Introduction · Thymeleaf Layout Dialect</a></li> </ul> <!-- ENDDDDDDDDDDDDDDDDDDDDDDDDDDDDD --> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- ng_ads_new_ui --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6575041992772322" data-ad-slot="8191531813" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div style="margin-top: 30px;"> <div class="link-top" style="margin-top: 1px;"></div> <p> <font size="4">Recommended Posts</font> <!-- BEGIN LINK ************************* --> <div style="margin-top: 10px;"> <a href="/de/eb3bf3b5301bae398cc2">Verwendung von Thymeleaf mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/7d593272f4097fcc5690">Lösen Sie die Thymeleaf-Syntaxprüfung in Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/1153642f5a7eaab7fdf1">Legen Sie den Kontextparameter in Spring Boot fest</a> </div> <div style="margin-top: 10px;"> <a href="/de/6409669dc3f8b8071af4">Spring Boot 2 Multiprojekt mit Gradle</a> </div> <div style="margin-top: 10px;"> <a href="/de/764eed5328cf4e328161">[Java] Thymeleaf Basic (Spring Boot)</a> </div> <div style="margin-top: 10px;"> <a href="/de/c26d99bb57888e42eaf1">Wichtige Änderungen in Spring Boot 1.5</a> </div> <div style="margin-top: 10px;"> <a href="/de/c58085afa3358cca45fe">NoHttpResponseException in Spring Boot + WireMock</a> </div> <div style="margin-top: 10px;"> <a href="/de/142d4be2db9a6a540143">Frühlingsstiefel Hallo Welt in Eclipse</a> </div> <div style="margin-top: 10px;"> <a href="/de/143783d9b5a604f14b97">Spring Boot-Anwendungsentwicklung in Eclipse</a> </div> <div style="margin-top: 10px;"> <a href="/de/3f834119c756e5286730">Schreiben Sie den Testcode mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/988ff69b678c7f00a2fe">Implementieren Sie die REST-API mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/9e618f9f553938cf0fe4">Was ist @Autowired im Spring Boot?</a> </div> <div style="margin-top: 10px;"> <a href="/de/af5298f58a505882f1e7">Implementieren Sie die Spring Boot-Anwendung in Gradle</a> </div> <div style="margin-top: 10px;"> <a href="/de/3c4529a9d4643341da09">Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt</a> </div> <div style="margin-top: 10px;"> <a href="/de/4dffd2e4b6182d828341">Erstellen Sie mit Gradle ein Spring Boot + Docker-Image</a> </div> <div style="margin-top: 10px;"> <a href="/de/4ec3733d44c9d2b618ee">Statische Dateizugriffspriorität beim Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/57f7f9a2a3c4991b3cf8">Spring Boot-Protokoll im JSON-Format ausgeben</a> </div> <div style="margin-top: 10px;"> <a href="/de/5cc060021ddf7cd108e4">Memorandum zum Herunterladen lokaler Dateien mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/77e3903ec0bb2aec8845">Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt</a> </div> <div style="margin-top: 10px;"> <a href="/de/8d7f71ebedeeb2526cee">[Trainieren! ] Zeigen Sie Hello World mit Spring Boot an</a> </div> <div style="margin-top: 10px;"> <a href="/de/9b723d6210a26d512a9f">Verwenden Sie die DynamoDB-Abfragemethode mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/c14302d266868c5b31fd">Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL</a> </div> <div style="margin-top: 10px;"> <a href="/de/ca68a3001bae19f92879">Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf</a> </div> <div style="margin-top: 10px;"> <a href="/de/d937b7cf2cd5324cb992">Memo zur Installationsmethode von Spring Boot + Thymeleaf Boot Strap</a> </div> <div style="margin-top: 10px;"> <a href="/de/e02cad0e81ad8ba9d73e">DI SessionScope Bean im Spring Boot 2-Filter</a> </div> <div style="margin-top: 10px;"> <a href="/de/f3afd40754f6ba587768">Ändern Sie das Sitzungszeitlimit in Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/f847c23c3db37bd73ec3">Führen Sie die WEB-Anwendung mit Spring Boot + Thymeleaf aus</a> </div> <div style="margin-top: 10px;"> <a href="/de/76feb28f45a4ff9cc0ae">Fordern Sie Spring Boot heraus</a> </div> <div style="margin-top: 10px;"> <a href="/de/bbef095c87cab3720c70">Spring Boot Form</a> </div> <div style="margin-top: 10px;"> <a href="/de/d2e456f08cafdaa74e90">gae + frühlingsstiefel</a> </div> <div style="margin-top: 10px;"> <a href="/de/0a2aca650721626055a3">SameSite-Cookie im Spring Boot (Spring Web MVC + Tomcat)</a> </div> <div style="margin-top: 10px;"> <a href="/de/187f01d5639f8e3d0b50">Testen Sie den Controller mit Mock MVC im Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/18c24f5899c65c9487f7">Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/322490b227e90d39aec1">Verwenden Sie den Thymeleaf-Textvorlagenmodus von Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/39937cf39d2069758c83">Führen Sie ein Spring Boot-Projekt mit VS-Code aus</a> </div> <div style="margin-top: 10px;"> <a href="/de/4ef1b71ad073eafc2135">Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben</a> </div> <div style="margin-top: 10px;"> <a href="/de/7bdfab8e974931afdac5">Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]</a> </div> <div style="margin-top: 10px;"> <a href="/de/961b71a95daf3a2bce96">Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt</a> </div> <div style="margin-top: 10px;"> <a href="/de/98f60c8064c369b32087">Erstellen Sie eine CRUD-App mit Spring Boot 2 + Thymeleaf + MyBatis</a> </div> <div style="margin-top: 10px;"> <a href="/de/aec763604f6496d32a0d">Hinweise zu Anmerkungen beim Schreiben von Tests für Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/af71c0e8de0426dfb8f6">Erstellen Sie Ihr eigenes Dienstprogramm mit Thymeleaf mit Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/bc5c3b7796bb72fa049c">So binden Sie mit einer Eigenschaftendatei in Spring Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/db039613637e1cf7bc88">Anmerkungen, die in Spring Boot-Aufgabenverwaltungstools verwendet werden</a> </div> <div style="margin-top: 10px;"> <a href="/de/f17fbdbca565c1ed8963">Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an</a> </div> <div style="margin-top: 10px;"> <a href="/de/67a63c91a7db8717fc7d">Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf</a> </div> <div style="margin-top: 10px;"> <a href="/de/0268fa0db9820d639e56">Injizieren Sie den Logger im Frühjahr</a> </div> <div style="margin-top: 10px;"> <a href="/de/0767bde61bef6256f568">Geben Sie die statische Ressourcencodierung in Spring Boot an</a> </div> <div style="margin-top: 10px;"> <a href="/de/13c7aae9019a28561f07">SPRING BOOT Lernaufzeichnung 01</a> </div> <div style="margin-top: 10px;"> <a href="/de/1d5e1fb5580a0c2b4fbc">Frühlingsstiefel + Heroku Postgres</a> </div> <div style="margin-top: 10px;"> <a href="/de/25e885d7d4fd05bbaf80">spring taglib: Formularnotizen</a> </div> <div style="margin-top: 10px;"> <a href="/de/26bd03b08fce1be6ff04">Untersuchte asynchrone Ausführung von Abfragen in Spring Boot 1.5.9</a> </div> <div style="margin-top: 10px;"> <a href="/de/2c7dfd88e98827a800b5">Verwendung von th: include, th: replace, th: insert, th: fragment in Thymeleaf</a> </div> <div style="margin-top: 10px;"> <a href="/de/30110cf4670d8db719cc">Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten</a> </div> <div style="margin-top: 10px;"> <a href="/de/4824d4a8c012f7ec53db">Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot</a> </div> <div style="margin-top: 10px;"> <a href="/de/5b0283431f80643e7161">So erstellen Sie ein Spring Boot-Projekt in IntelliJ</a> </div> <div style="margin-top: 10px;"> <a href="/de/5b86f162214f34d5e671">Erster Frühlingsstiefel (DI)</a> </div> <div style="margin-top: 10px;"> <a href="/de/5c2b2b7878ebcddf5017">SPRING BOOT Lernprotokoll 02</a> </div> <div style="margin-top: 10px;"> <a href="/de/5f7003bb78917dff6bb1">Spring Boot2 Spickzettel</a> </div> <div style="margin-top: 10px;"> <a href="/de/6b0f0fcfe681734e2617">Spring Boot-Ausnahmebehandlung</a> </div> <div style="margin-top: 10px;"> <a href="/de/75c54e747ed1bbbf71fa">Spring Boot Servlet-Zuordnung</a> </div> <div style="margin-top: 10px;"> <a href="/de/76a1b1c46f737cdbda5f">Spring Boot Entwicklung-Entwicklungsumgebung-</a> </div> <!-- END LINK ************************* --> </p> </div> </div> </div> <div class="footer text-center" style="margin-top: 40px;"> <!-- <p> Licensed under cc by-sa 3.0 with attribution required. </p> --> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/highlight.min.js"></script> <!-- ads --> <script data-ad-client="ca-pub-6575041992772322" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- end ads --> </body> </html>