카테고리 없음

타임리프 기본 기능 알아보기 -1 - 경험을 기록하는

여행하는 개발자(SOO) 2024. 6. 12. 09:00
728x90

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&param2=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} | 이렇게 하면 자바스크립트의 ``(백틱) 템플릿 리터럴 같은 효과를 낼 수 있다.
문자와 문자를 연결할 때 + 를 사용하지 않아도 되고 문자야 변수를 연결할 때도 따로 +를 할 필요가 없다.

728x90