타임리프의 기본사용법을 공부하던 중이었다.
dto클래스와 데이터를 전송할 컨트롤러를 만들고 dto객체를 Model에 추가해서 전달한다.
반복문과 제어문 처리를 공부하던 중 주석처리를 하다가 "Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback." 에러가 떠서 무엇이 문제인지 확인해보았다.
와중에 Exception evaluating SpringEL expression: "state.index" (template: "sample/ex2" - line 15, col 7)와 EL1007E: Property or field 'index' cannot be found on null를 확인해서 표현법이 잘못되었는지 확인해보았는데 표현법은 이상이 없는 거 같았다.
콘솔창에 뜬 문제
2023-06-19T17:07:30.480+09:00 ERROR 7487 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "sample/ex2": An error happened during template parsing (template: "class path resource [templates/sample/ex2.html]")
<ul>
<!-- <li th:each="dto : ${list}">
[[${dto}]]
</li></ul>-->
<!--<li th:each="dto, state: ${list}">
[[${state.index}]] -- [[${dto}]]
</li>-->
<!-- 제어문 처리 -->
<ul> <li th:each="dto, state : ${list}" th:if="${dto.sno % 5 == 0}">
[[${dto}]]
</li>
</ul>
<!-- th:if, th:unlesss, sno가 5로 나눈 나머지가 0인 경우에는 sno만을 출력하고,
그렇지 않으면 SampleDTO의 first를 출력하라 -->
<li th:each="dto, state: ${list}">
<span th:if="${dto.sno % 5 ==0}" th:text="${'-----------' +dto.sno}"></span>
<span th:unless="${dto.sno % 5 ==0}" th:text="${dto.first}"></span>
</li>
<ul>
<li th:each="dto : ${list}" th:text="${dto.sno % 5 ==0}?${dto.sno}"></li>
</ul>
이상하게 주석처리가 2개가 넘어가면 브라우저에 인터벌 서버 에러가 뜬다.
►►► 그래서 주석을 한개만 남겨두었더니 정상 작동한다.
내가 구글링을 어떻게 했는 진 모르겠는데 주석에 관한 문제라는 걸 결국 발견했다. (초보) --> 타임리프파싱관련 서치하다가 찾은 거 같다.
다음은 타임리프의 주석처리에 관한 내용이다.
<!-- <li th:each="dto : ${list}">
[[${dto}]]
</li></ul>-->
자바스크립트의 표준 HTML은 타임리프가 렌더링하지 않고 그대로 남겨둔다.(웹 소스코드에서도 확인이 가능하다.화면에서도 볼 수 없다(주석처리))
HTML에서만 사용하는 주석이다.
<!--/* [[${data}]] */--> //한줄
<!--/*-->
<span th:text="${data}">html data</span> //여러줄
<!--*/-->
타임리프 파서 주석은 타임리프 진짜 주석이다. 렌더링에서 주석 부분을 제거한다.(즉 출력이 안된다.) 타임리프 파서 자체가 인정하는 주석. 소스코드에서 확인불가능
<!--/*/
<span th:text="${data}">html data</span>
/*/-->
HTML 파일을 열면 주석처리가 되나, 타임리프를 렌더링 한 경우에만 보인다. html주석이기때문에 웹브라우저가 렌더링하지 않는다. 파일을 직접 열면 안보인다.(데이터가 없다, 주석처리가 그대로 보인다.) , 타임리프가 서버사이드에서 렌더링하는 경우에는 데이터가 보인다, 출력이 된다.
Reference : https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2&unitId=83264
페이지 소스 코드