<properties>
<java.version>11</java.version>
+ <bootstrap.version>4.5.2</bootstrap.version>
</properties>
<dependencies>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
+ <dependency>
+ <groupId>org.webjars</groupId>
+ <artifactId>bootstrap</artifactId>
+ <version>${bootstrap.version}</version>
+ <scope>runtime</scope>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<!DOCTYPE HTML>
-<html xmlns:th="http://www.thymeleaf.org">
+<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layout :: pagelayout(~{:: title}, ~{:: h1}, ~{:: div.card-text})}">
<head>
<title th:text="'400: ' + ${exception.getClass().getSimpleName()}">Testing Exception-Handling - Template for 400</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1 th:text="'400: ' + ${exception.getClass().getSimpleName()}">Template for 400</h1>
- <div>
+ <div class="card-text table">
<p><strong th:text="'Catched exception: ' + ${exception}">EXCEPTION</strong></p>
- <p><a href="#" th:href="@{/}">Back to HOME</a></p>
+ <p><a href="#" th:href="@{/}" class="btn btn-primary">Back to HOME</a></p>
</div>
</body>
</html>
<!doctype html>
-<html xmlns:th="http://www.thymeleaf.org">
+<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layout :: pagelayout(~{:: title}, ~{:: h1}, ~{:: table.card-text})}">
<head>
<title th:text="|${status}: ${error}">XXX: ERROR</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1 th:text="|${status}: ${error}">XXX: ERROR</h1>
- <table>
+ <table class="card-text table">
<tbody>
- <tr>
+ <tr class="border-top-0">
<th scope="row">Status</th>
<td th:text="${status}">ERROR.STATUS</td>
</tr>
<td th:text="${message}">ERROR.MESSAGE</td>
</tr>
<tr th:if="!${#strings.isEmpty(requestId)}">
- <th scope="row">Request-ID</th>
+ <th class="text-nowrap" scope="row">Request-ID</th>
<td th:text="${requestId}">ERROR.REQUEST_ID</td>
</tr>
<tr>
<tr th:if="!${#strings.isEmpty(trace)}">
<th scope="row">Trace</th>
<td>
- <div>
- <pre th:text="${trace}">ERROR.TRACE</pre>
+ <div class="overflow-hidden">
+ <pre class="overflow-hidden" th:text="${trace}">ERROR.TRACE</pre>
</div>
</td>
</tr>
<!--**/-->
</tbody>
</table>
- <p><a href="#" th:href="@{/}">Back to HOME</a>
+ <p><a href="#" th:href="@{/}" class="btn btn-primary">Back to HOME</a>
</div>
</body>
</html>
--- /dev/null
+<!doctype html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org" th:fragment="pagelayout(title,header,body)">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+ <title th:replace="${title}">TITLE</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" th:href="@{/webjars/bootstrap/4.5.2/css/bootstrap.min.css}">
+ </head>
+ <body>
+ <nav class="navbar navbar-dark bg-primary navbar-expand navbar-dark flex-column">
+ <h2 class="navbar-brand">Demo: Testing Exception-Handling With/In the Springframework</h2>
+ </nav>
+ <main class="container mt-5">
+ <div id="content" class="card">
+ <div class="card-header"><h1 th:replace="${header}">HEADER</h1></div>
+ <div class="card-body"><div th:replace="${body}">BODY</div></div>
+ </div>
+ </main>
+ </body>
+</html>
<!DOCTYPE HTML>
-<html xmlns:th="http://www.thymeleaf.org">
+<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layout :: pagelayout(~{:: title}, ~{:: h1}, ~{:: div.card-text})}">
<head>
<title>Template: view</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Deep Thought</h1>
- <div th:switch="${answer}">
+ <div th:switch="${answer}" class="card-text">
<p th:case="null">
<strong>What is the answer to the ultimate question of life, the universe and everything?</strong>
</p>
<li>Outcome: <strong th:text="${outcome.get()}">OUTCOME</strong></li>
</ul>
</div>
- <div>
+ <div class="card-text">
<form action="#" th:action="@{/}" method="get">
- <div>
- <label for="answer">Answer:</label>
- <input type="text" name="answer" value="42" th:value="${answer}"/>
- <button type="submit">Submit</button>
+ <div class="input-group">
+ <div class="input-group-prepend">
+ <label for="answer" class="input-group-text">Answer:</label>
+ </div>
+ <input type="text" name="answer" value="42" th:value="${answer}" class="form-control"/>
+ <button type="submit" class="btn btn-primary input-group-append">Submit</button>
</div>
</form>
</div>