Web Spring boot 타임리프2
Thymeleaf 2
조건문, 반복문, Switch
Java Controller
@Controller
public class TestController {
@RequestMapping("/{num}")
public ModelAndView index(@PathVariable int num, ModelAndView mav) {
mav.setViewName("index");
mav.addObject("num", num);
mav.addObject("check", num % 2 == 0);
mav.addObject("trueVal", "Even number.");
mav.addObject("falseVal", "Odd number.");
ArrayList<String[]> list = new ArrayList<String[]> ();
list.add(new String[] {"kim", "kim@a.com"});
list.add(new String[] {"lee", "lee@b.com"});
mav.addObject("list", list);
return mav;
}
}
html
<!-- "변수식 ? 값1 : 값2" -->
<p th:text="${num} + ' : ' + (${check} ? ${trueVal} : ${falseVal})"></p>
<!-- if -->
<p th:if="${check}" th:text="${num} + ' : ' + ${trueVal}">true</p>
<p th:unless="${check}" th:text="${num} + ' : ' + ${falseVal}">false</p>
<!-- switch -->
<div th:switch="${num}">
<p th:case="1" th:text="one">1</p>
<p th:case="2" th:text="two">2</p>
<p th:case="3" th:text="three">3</p>
<p th:case="*">?</p>
</div>
<!-- each -->
<table border="1">
<tr>
<td>NAME</td>
<td>E-MAIL</td>
</tr>
<tr th:each="obj:${list}">
<td th:text="${obj[0]}"></td>
<td th:text="${obj[1]}"></td>
</tr>
</table>
출력
타임리프로 레이아웃
기본 문구
보통 hearder , footer같은 반복되는 html을 조립하기 위해 사용
의존성 추가
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.4.1</version>
</dependency>
예제 프로젝트 구조
header 공통
<html lagn="ko"
xmlns:th="http://www.thymeleaf.org">
<!--headerFragment 선언-->
<div th:fragment="headerFragment">
<h1>HEADER</h1>
</div>
</html>
footer 공통
<html lagn="ko"
xmlns:th="http://www.thymeleaf.org">
<!--footerFragment 선언-->
<div th:fragment="footerFragment">
<h1>FOOTER</h1>
</div>
</html>
공통 config 부분
<html lagn="ko"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<!--configFragment 선언-->
<th:block th:fragment="configFragment">
<!-- 이 영역에 공통으로 사용할 css, js library를 선언한다. -->
<link rel="stylesheet" th:href="@{/css/common/common.css}" >
<script th:src="@{/js/common/common.js}"></script>
<!-- Content Page의 CSS fragment 삽입 -->
<th:block layout:fragment="css"></th:block>
<!-- Content Page의 script fragment 삽입 -->
<th:block layout:fragment="script"></th:block>
</th:block>
</html>
default_layout 부분
<!DOCTYPE html>
<html lagn="ko"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
<meta charset="UTF-8" />
<title>Bamdule</title>
<!-- config fragment 사용 -->
<th:block th:replace="fragment/config :: configFragment" ></th:block>
</head>
<body>
<!-- header fragment 사용 -->
<th:block th:replace="fragment/header :: headerFragment"></th:block>
<!--
content fragment 사용
현재 layout을 사용하는 content fragment의 내용을 삽입한다.
-->
<th:block layout:fragment="content"></th:block>
<!-- footer fragment 사용 -->
<th:block th:replace="fragment/footer :: footerFragment"> </th:block>
</body>
</html>
- Layout은 fragment들이 조합된 html입니다.
- th:replace=”frament경로 :: fragment이름” 속성은 해당 영역을 fragment로 치환하겠다는 의미입니다.
- layout:fragment=”content”는 해당 layout을 사용하는 content의 내용을 불러오겠다는 의미입니다.
home.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="layout/default_layout">
<!-- index.html 고유 CSS 추가 -->
<th:block layout:fragment="css">
<link rel="stylesheet" th:href="@{/css/page/home.css}" >
</th:block>
<!-- index.html 고유 스크립트 추가 -->
<th:block layout:fragment="script">
<script th:src="@{/js/page/home.js}"></script>
</th:block>
<div layout:fragment="content">
<h1>content</h1>
</div>
</html>
- 여기서 유심히 볼 코드는 layout:decorator=”layout/default_layout” 입니다.
- layout:decorator=”layout path” 속성을 입력해 layout을 사용할 수 있습니다.
- layout:fragment=”content” 속성을 통해 content fragment를 선언합니다.