타임리프 특징
타임리프 사용 선언
<html xmlns:th="http://www.thymeleaf.org">
기본 표현식
• 간단한 표현:
◦ 변수 표현식: ${...}
◦ 선택 변수 표현식: *{...}
◦ 메시지 표현식: #{...}
◦ 링크 URL 표현식: @{...}
◦ 조각 표현식: ~{...}
• 리터럴
◦ 텍스트: 'one text', 'Another one!',…
◦ 숫자: 0, 34, 3.0, 12.3,…
◦ 불린: true, false
◦ 널: null
◦ 리터럴 토큰: one, sometext, main,…
• 문자 연산:
◦ 문자 합치기: +
◦ 리터럴 대체: |The name is ${name}|
• 산술 연산:
◦ Binary operators: +, -, *, /, %
◦ Minus sign (unary operator): -
• 불린 연산:
◦ Binary operators: and, or
◦ Boolean negation (unary operator): !, not
• 비교와 동등:
◦ 비교: >, <, >=, <= (gt, lt, ge, le)
◦ 동등 연산: ==, != (eq, ne)
• 조건 연산:
◦ If-then: (if) ? (then)
◦ If-then-else: (if) ? (then) : (else)
◦ Default: (value) ?: (defaultvalue)
• 특별한 토큰:
◦ No-Operation: _
HTML 태그의 속성이 아닌 콘텐츠 영역에 직접 데이터 출력
1. [[${data}]]
: escape 지원 (HTML 엔티티)
2. [(${data})]
: Unescape
th:text
: escape
th:utext
: Unescape
//일반 변수
${data.id}
${data['id']}
${data.getId()}
// List
${data[0].id}
${data[0]['id']}
${data[0].getId()}
//map
${data[userA].id}
${data[userA]['id']}
${data[userA].getId()}
지역변수
<h1> 지역 변수 - (th:with)</h1>
<div th:with="frist=${users[0]}">
${first.id} 이런식으로 사용
타임리프는 기본 객체들을 제공한다.
${#request}
${#response}
${#session}
${#servletContext}
${#locale}
스프링 부트 3.0부터 지원안하는 객체가 많기에
컨트롤러에서 model에 따로 넣어서 사용해야한다.
편의 객체
HTTP 요청 파라미터 접근 : param
${param.paramData}
HTTP 세션 접근 : session
${session.sessionData}
스프링 빈 접근 : @
${@helloBean.hello('Spring!')}
#message : 메시지, 국제화 처리
#uris : URI 이스케이프 지원
#dates : java.util.Date 서식 지원
#calendars : java.util.Calendar 서식 지원
#temporals : 자바8 날짜 서식 지원
#numbers : 숫자 서식 지원
#strings : 문자 관련 편의 기능
#objects : 객체 관련 기능 제공
#bools : boolean 관련 기능 제공
#arrays : 배열 관련 기능 제공
#lists , #sets , #maps : 컬렉션 관련 기능 제공
#ids : 아이디 처리 관련 기능 제공, 뒤에서 설명
자세한 사용법은 교재 참고
1. 단순 URL
@{/home} -> /home
2. 쿼리 파라미터
@{/home(param1=${param1}, param2=${param2}}
-> /home?param1=data1¶m2=data2
3. 경로 변수 + 쿼리 파라미터
@{/home/{param1}(param1=${param1}, param2=${param2})}
-> /home/data1?param2=data2
경로상에 변수가 있으면 ()부분은 변수로 처리
/home : 절대경로
home : 상대경로
리터럴 : 소스 코드상에 고정된 값
String a = "hello"
int a = 10 * 20
"hello"는 문자 리터럴 , 10, 20 은 숫자 리터럴
타임리프 리터럴
문자 :'hello'
숫자 : 10
불린 : true , false
null : null
타임리프에서 문자 리터럴은 항상 '(작은 따음표)로 감싸야함
th:text="hello world!" : 중간에 공백으로 하나의 의미있는 토큰 인식 x
th:text="'hello world!'" : 정상 작동
리터럴 대체
th:text="|hello ${data}|"
작은 따옴표로 감싸지 않아도 사용 가능
// 산술 연산은 같다.
th:text="1 + 2"
th:text="10 % 2 == 0"
// 비교 연산
th:text="1 gt 10" // 1 > 10
th:text="1 >= 10"
th:text="1 ge 10" // 1 >= 10
th:text="1 == 10"
th:text="1 != 10"
// > 이렇게 해도 잘 작동한다.
// 조건식
th:text="(10 % 2 == 0) ? '짝수' : '홀수'"
//Elvis 연산자
// 데이터가 있다면, null 이 아니라면 데이터 출력
// 없다면, null이라면 '데이터가 없습니다. ' 출력
th:text="${data}? : '데이터가 없습니다.'"
//No-Operation
// null, 데이터가 없다면 th부분이 무시된다고 보면 된다.
// html 그대로 출력
<span>th:text="${data}?:_"> 데이터가 없습니다. </span>
th:xxx : 기존 html 속성으로 설정
// 속성 추가
th:attrappend : 속성 값의 뒤에 값 추가
th:attrprepend : 속성 값의 앞에 값 추가
th:classappend : class 속성에 자연스럽게 추가
checked 처리
checked
속성은 값과 상관없이 속성이 있기만 하면 체크된다.th:checked
는 값이 false인 경우 checked 속성 자체를 제거 <tr th:each="user : ${users}">
// List, 배열, java.util.Iterable , java.util.Enumeration 을 구현한
모든 객체를 반복에 사용
// Map 은 변수에 담기는 값이 Map.Entry
<tr th:each="user, userStat : ${users}">
ex) ${user.id} 사용
index : 0부터 시작하는 값
count : 1부터 시작하는 값
size : 전체 사이즈
even , odd : 홀수, 짝수 여부( boolean )
first , last :처음, 마지막 여부( boolean )
current : 현재 객체
// 사용
${userStat.count}
${userStat.size}
이런식으로 사용
th:if="${user.age lt 20}"
th:unless="${user.age ge 20}"
<td th:switch="${user.age}">
<span th:case="10">10살</span>
<span th:case="20">20살</span>
<span th:case="*">기타</span>
</td>
<h1>예시</h1>
<span th:text="${data}">html data</span>
<h1>1. 표준 HTML 주석</h1>
<!--
<span th:text="${data}">html data</span>
-->
<h1>2. 타임리프 파서 주석</h1>
<!--/* [[${data}]] */-->
<!--/*--> // 여러줄 처리
<span th:text="${data}">html data</span>
<!--*/-->
<h1>3. 타임리프 프로토타입 주석</h1>
<!--/*/
<span th:text="${data}">html data</span>
/*/-->
그대로 남음
타임리프 렌더링시 주석 부분 제거
타임리프 렌더링시 주석부분 실행 , HTML로 열었을 때는 주석 남음
<th:block th:each="user : ${users}">
<div>
사용자 이름1 <span th:text="${user.username}"></span>
사용자 나이1 <span th:text="${user.age}"></span>
</div>
<div>
요약 <span th:text="${user.username} + ' / ' + ${user.age}"></span>
</div>
</th:block>
<th:block>
은 렌더링시 제거<script th:inline="javascript">
<!-- 자바스크립트 인라인 사용 전 -->
<script>
var username = [[${user.username}]];
var age = [[${user.age}]];
//자바스크립트 내추럴 템플릿
var username2 = /*[[${user.username}]]*/ "test username";
//객체
var user = [[${user}]];
</script>
<!-- 자바스크립트 인라인 사용 후 -->
<script th:inline="javascript">
var username = [[${user.username}]];
var age = [[${user.age}]];
//자바스크립트 내추럴 템플릿
var username2 = /*[[${user.username}]]*/ "test username";
//객체
var user = [[${user}]];
</script>
자바스크립트 인라인 사용 전 - 결과
<script>
var username = userA;
var age = 10;
//자바스크립트 내추럴 템플릿
var username2 = /*userA*/ "test username";
//객체
var user = BasicController.User(username=userA, age=10);
</script>
자바스크립트 인라인 사용 후
<script>
var username = "userA";
var age = 10;
//자바스크립트 내추럴 템플릿
var username2 = "userA";
//객체
var user = {"username":"userA","age":10};
</script>
"
문자 처리를 해준다.<!-- 자바스크립트 인라인 each -->
<script th:inline="javascript">
[# th:each="user, stat : ${users}"]
var user[[${stat.count}]] = [[${user}]];
[/]
</script>
자바스크립트 인라인 each 결과
<script>
var user1 = {"username":"userA","age":10};
var user2 = {"username":"userB","age":20};
var user3 = {"username":"userC","age":30};
</script>
🔖 학습내용 출처