타임리프 기본 기능 알아보기 -1 - 경험을 기록하는
SpringEL표현식
spring이 object를 표현하는 방식
Thymeleaf에서 springEL을 사용해서 오브젝트에 접근이 가능하다.
basic/variable
<ul>Object
<li>${user.username} = <span th:text="${user.username}"></span></li>
<li>${user['username']} = <span th:text="${user['username']}"></span></li>
<li>${user.getUsername()} = <span th:text="${user.getUsername()}"></span></li>
</ul>
<ul>List
<li>${users[0].username} = <span th:text="${users[0].username}"></span></li>
<li>${users[0]['username'] = <span th:text="${users[0]['username']}"></span></li>
<li>${users[0].getUsername()} = <span th:text="${users[0].getUsername()}"></span></li>
</ul>
<ul>Map
<li>${userMap['userA'].username = <span th:text="${userMap['userA'].username}"></span></li>
<li>${userMap['userA']['userA'] = <span th:text="${userMap['userA']['username']}"></span></li>
<li>${userMap['userA'].getUsername()} = <span th:text="${userMap['userA'].getUsername()}"></span></li>
</ul>
지역 변수 선언
th:with
를 사용해서 지역 변수 선언을 할 수 있다. 단, 선언한 태그 안에서만 사용 가능하다.
<h1>지역 변수 - (th:with)</h1>
<div th:with="first=${users[0]}">
<p>처음 사람의 이름은 <span th:text="${first.username}"></span></p>
</div>
기본 객체들
타임리프가 제공하는 기본객체
스프링부트 3.0부터는 타임리프에서 request
, response
, session
, servletContext
를 기본객체로 제공하지 않아서 model에 담아서 view로 넘겨야 한다.
${request}
${response}
${session}
${servletContext}
${#locale}
BasicController
@GetMapping("/basic-objects")
public String basicObjects(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
session.setAttribute("sessionData", "Hello Session");
model.addAttribute("request", request);
model.addAttribute("response", response);
model.addAttribute("servletContext", request.getServletContext());
return "basic/basic-objects";
}
@Component("helloBean")
static class HelloBean {
public String hello(String data){
return "Hello" + data;
}
}
basic/basic-object.html
<body>
<h1>식 기본 객체 (Expression Basic Objects)</h1>
<ul>
<li>request = <span th:text="${request}"></span></li>
<li>response = <span th:text="${response}"></span></li>
<li>session = <span th:text="${session}"></span></li>
<li>servletContext = <span th:text="${servletContext}"></span></li>
<li>locale = <span th:text="${#locale}"></span></li>
</ul>
<h1>편의 객체</h1>
<ul>
<li>Request Parameter = <span th:text="${param.paramData}"></span></li>
<li>session = <span th:text="${session.sessionData}"></span></li>
<li>spring bean = <span th:text="${@helloBean.hello('Spring!')}"></span></li>
</ul>
</body>
유틸리티 객체와 날짜
문자, 날짜, 오브젝트, 메시지 등을 편리하게 사용할 수 있도록 하는 객체
유틸리티 객체에 대한 자세한 내용
유틸리티 객체 종류
#messages
: 메시지, 국제화 처리#dates
:java.util.Date
서식 지정, 구성 요소 추출 등#numbers
: 숫자 개체의 서식을 지정하는 방법#springs
: String 객체에 대한 메서드 제공#bools
: Boolean 처리 메서드 제공#arrays
: 배열 처리 메서드 제공#temporals
: 자바 8 날짜 서식 지원
자바 8의 날짜 타입 사용하려면 thymeleaf-extras-java8 time라는
라이브러리가 필요하다.
하지만, 스프링부트 3.2 이상을 사용한다면 이미 포함되어 있어서 신경 쓰지 않아도 된다.
BasicController
@GetMapping("/date")
public String date(Model model) {
model.addAttribute("localDateTime", LocalDateTime.now());
return "basic/date";
}
basic/date.html
<ul>
<li>default = <span th:text="${localDateTime}"></span></li>
<li>yyyy-MM-dd HH:mm:ss = <span th:text="${#temporals.format(localDateTime, 'yyyy-MM-dd HH:mm:ss')}"></span></li>
</ul>
URL 링크
@{...} 문법을
사용하면 된다.
쿼리 파라미터@{/hello(param1=${param1}, param2=${param2})}
- /hello?param1=data1¶m2=data2
- 파라미터가 {..}에 없고 모두 (..) 안에 있다면 쿼리 파라미터가 된다.
경로 변수@{/hello{param1}/{param2}(param1=${param1}, param2=${param2})}
- /hello/data1/data2
- URL에서 {..} 안에 파라미터가 들어가게 되면 (..) 안에 있는 param은 {..}의 값으로 바뀐다.
경로 변수 + 쿼리 파라미터@{/hello/{param1}(param1=${param1}, param2=${param2})}
- /hello/data1?param2=data2
- {..} 안에 있는 param1의 경우는 (..)에 있는 param1은 경로 변수가 되고 (..) 안에만 있는 param2의 경우 쿼리 파라미터가 된다.
리터럴
값을 나타내는 표기법, 고정된 값을 나타냅니다.
String str = "문자입니다."; //문자 리터럴
int a = 30 + 40; //정수 리터럴
주의사항
타임리프에서 문자 리터럴은 ' 작은따옴표로 감싸야한다.
<p th:text=${" 'hello' "}></P>
하지만 매번 이렇게 사용하는 것은 매우 불편한 일이기 때문에 Thymeleaf에서는 공백이 없다면 토큰으로 인지해서 '
작은 따옴표 생략이 가능하다.<p th:text=${"hello"}>
하지만, 공백이 있다면 <p th:text=${"'hello world'"}></P>
<-- 이렇게 '
작은 따옴표로 감싸줘야 정상적으로 작동한다.
리터럴 대체 문법|...|
| hello ${data} | 이렇게 하면 자바스크립트의 ``(백틱) 템플릿 리터럴 같은 효과를 낼 수 있다.
문자와 문자를 연결할 때 + 를 사용하지 않아도 되고 문자야 변수를 연결할 때도 따로 +를 할 필요가 없다.