everyday com-eat
카테고리
작성일
2022. 2. 22. 19:43
작성자
갱수터
728x90

th구문과 html구문 우선순위

 

maincontroller

@Controller
public class MainController {
	@GetMapping("/")
	public String main(Model model) {
		
		model.addAttribute("title", "ksmart42");
		
		return "main";
	}
}

main.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}">메인화면</title>
</head>
<body>
	한국스마트정보교육원 42기 진수경
</body>
</html>

 

실행 결과

html <title> 태그보다 thymeleaf 태그가 우선으로 적용된다

 

 


 

thymeleaf 객체 바인딩

기본으로 이용할 Member dto 생성(getter/setter, tostring, 생성자메서드 오버라이딩 )

 

 

서비스 패키지 생성 후 

ExamService 클래스 생성

getMemberInfo 메서드 생성

@Service	//어노테이션 추가
public class ExamService {
	public Member getMemberInfo(String memberId) {
		
		Member member = new Member();
		member.setMemberId("id00" + memberId);
		member.setMemberPw("pw00" + memberId);
		member.setMemberLevel("관리자");
		member.setMemberAddr("전주시 덕진구 기린대로 446");
		member.setMemberMobile("0637171008");
		
		return member;
	}
}

 

 

 

controller 패키지 생성 후

ExamController 클래스 생성 후

ExamService DI 주입

@Controller
@RequestMapping("/exam")
public class ExamController {

1. DI 필드 주입방식
@Autowired
private ExamService examService;


2. DI setter method 주입방식
private ExamService examService;

@Autowired
public void setExamService(ExamService examService) {
this.examService = examService; }


3. DI 생성자 method 주입방식
private ExamService examService;

//spring framwork v4.3 이후부터 @Autowired 생략 가능	
public ExamController(ExamService examService) {
	this.examService = examService;
}
}

 

@GetMapping 메서드 생성

//ExamController class에 @RequestMapping으로 ("/exam")을 매핑해뒀기 때문에 getmapping 경로 하나만 적을수 있게됨
@GetMapping("/exam1")
public String exam1(Model model) {
	
	Member member = examService.getMemberInfo("1");
	
	model.addAttribute("title", "ksmart42");
	model.addAttribute("user", member);	
		
	return "exam/exam1";
}

 

 

view단 파일 생성

thymeleaf 라이브러리에 prefix,suffix로 미리 경로와 파일확장자가 정해져 있음
그래서 templates폴더 하위에 html확장자로 파일 생성하는 것...
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:title="${title}"></title>
</head>
<body>
	<!-- thymeleaf 객체 바인딩 -->
	<h1>객체</h1>
	<h1 th:text="${user}"></h1>
	<h1>[[${user}]]</h1>
	
	<h1>객체에 있는 멤버변수</h1>
	<h1 th:text="${user.memberId}"></h1>
	<h1 th:text="${user.getMemberId()}"></h1>
</body>
</html>

 

thymeleaf 문법
- th:___=""
- title은 없음 실행화면 보면 타이틀안나온걸 볼 수 있음 text로 해줘야함
- html 태그에 th:로 넣거나
- [[]] 이중대괄호 안에 넣어서 출력시켜야함
- thymeleaf로 바인딩된 객체에 .으로 접근할 수 있음

 

빌드

 

 

 

thymeleaf 리스트객체 바인딩

위에 만들어둔 ExamService 클래스에

getMemberList 메서드 생성

public List<Member> getMemberList(){
	List<Member> membeList = new ArrayList<Member>();

	Member member =null;
	for(int i=1; i<10; i++) {
		if(i%3 ==0) {
			member = new Member("id00"+i, "pw00"+i, "구매자", "전주시 덕진구", "0101234123"+i);
		}
		if(i%3 ==1) {
			member = new Member("id00"+i, "pw00"+i, "관리자", "전주시 완산구", "0101234123"+i);
		}
		if(i%3 ==2) {
			member = new Member("id00"+i, "pw00"+i, "판매자", "전주시 덕진구", "0101234123"+i);
		}
		
		membeList.add(member);
	}
	
	return membeList;
}

 

ExamController@GetMapping 메서드 생성

//ExamController class에 @RequestMapping으로 ("/exam")을 매핑해뒀기 때문에 getmapping 경로 하나만 적을수 있게됨
@GetMapping("/exam2")
public String exam2(Model model) {
	List<Member> memberList = examService.getMemberList();
	
			
	model.addAttribute("title", "ksmart42");
	model.addAttribute("list", memberList);	
	
	return "exam/exam2";
}

 

view단 파일 생성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}"></title>
</head>
<body>
	<!-- thymeleaf 리스트객체 바인딩 -->
	<h1>리스트객체</h1>
	<table border="1">
		<thead>
			<tr>
				<th>인덱스</th>
				<th>카운트</th>
				<th>사이즈</th>
				<th>odd</th>
				<th>even</th>
				<th>first</th>
				<th>last</th>
				<th>아이디</th>
				<th>비밀번호</th>
				<th>회원등급</th>
				<th>주소</th>
				<th>핸드폰번호</th>
			</tr>
		</thead>
		<tbody>
        	<!-- 반복문 th:each구문 l처럼 별칭 줄 수있음, 두번째는 상태 나타내는 것 -->
			<tr th:each="l,status : ${list}">
				<td th:text="${status.index}"></td>
				<td th:text="${status.count}"></td>
				<td th:text="${status.size}"></td>
				<td th:text="${status.odd }"></td>
				<td th:text="${status.even}"></td>
				<td th:text="${status.first }"></td>
				<td th:text="${status.last}"></td>
				<td th:text="${l.memberId}"></td>
				<td th:text="${l.memberPw}"></td>
				<td th:text="${l.memberLevel}"></td>
				<td th:text="${l.memberAddr}"></td>
				<td th:text="${l.memberMobile}"></td>
			</tr>
		</tbody>
	</table>
</body>
</html>

 

빌드

 

지역변수(with)와 조건문(if, unless)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:title="${title}"></title>
</head>
<body>
	<h1>리스트객체</h1>
	<!-- target이라는 지역변수 선언 -->
	<table border="1" th:with="target='id001'">
		<thead>
			<tr>
				<th>아이디</th>
				<th>비밀번호</th>
				<th>회원등급</th>
				<th>주소</th>
				<th>핸드폰번호</th>
			</tr>
		</thead>
		<tbody>
			<tr th:each="l : ${memberList}">
				<!-- memberId가 target과 같다면이라는 if 조건문 -->
				<td th:if="${l.memberId == target}" style="color:red;" th:text="${l.memberId}"></td>
				<td th:unless="${l.memberId == target}" th:text="${l.memberId}"></td>
				<th:block th:if="${l.memberId == target}">
					<td th:text="${l.memberPw}" style="color:blue;"></td>
				</th:block>
				<th:block th:if="${l.memberId != target}">
					<td th:text="${l.memberPw}"></td>
				</th:block>
				<td th:text="${l.memberLevel}"></td>
				<td th:text="${l.memberAddr}"></td>
				<td th:text="${l.memberMobile}"></td>
			</tr>
		</tbody>
		<tfoot>
			<tr>
			<!-- 	값을 바인딩 할 땐 $를 붙인다 -->
				<td colspan="5" th:text="${target}"></td>
			</tr>
		</tfoot>
	</table>
</body>
</html>

 

빌드

 

 

<th:block>

눈에 보이는 html 태그가 아니라 논리적인 thymeleaf블럭으로

if조건문이나 each구문 등 활용할 수 있는 태그

 

 

실습. 조회되는 회원이 없을 때

view단 if조건문으로 처리하기

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}"></title>
</head>
<body>
	<!-- thymeleaf 리스트객체 바인딩 -->
	<!-- 1. 지역변수(th:with) -->
	<!-- 2. 조건문(th:if, th:unless) -->
	<h1>리스트객체</h1>
	<table border="1" th:with="target='id001'">
		<thead>
			<tr>
				<th>아이디</th>
				<th>비밀번호</th>
				<th>회원등급</th>
				<th>주소</th>
				<th>핸드폰번호</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td colspan="5" th:if="${memberList}==null" th:text="${'조회된 결과가 없습니다.'}"></td>
			</tr>
			<tr th:unless="${memberList}==null" th:each="l : ${memberList}">
				<td th:if="${l.memberId == target}" style="color:red;" th:text="${l.memberId}"></td>
				<td th:unless="${l.memberId == target}" th:text="${l.memberId}"></td>
				<td th:if="${l.memberId == target}" th:text="${l.memberPw}" style="color:blue;"></td>
				<td th:if="${l.memberId != target}" th:text="${l.memberPw}"></td>
				<td th:text="${l.memberLevel}"></td>
				<td th:text="${l.memberAddr}"></td>
				<td th:text="${l.memberMobile}"></td>
			</tr>
		</tbody>
	</table>
</body>
</html>

 

ExamController에서 테스트해보기

 

넘어오는 값 없을 때

넘어오는 값 있을 때

 

 

null 체크

<h1 th:text="${#lists.isEmpty(memberList)}"></h1>

생각을 해야할게 null을 체크하는거기 때문에 null이 아니면 true가 아니라 false가 나온다
그니깐 false가 나와야 가져올 값이 있다는 뜻...

 

유틸리티 객체와 유사 for문 controller

@GetMapping("/exam5")
public String exam5(Model model) {
	List<Member> memberList = examService.getMemberList();
	//memberList.get(1).getMemberId();
	model.addAttribute("title", "ksmart42");
	model.addAttribute("memberList", memberList);	
	model.addAttribute("now", new Date());
	   model.addAttribute("price", 123456789);

	
	return "exam/exam5";
}

 

thymeleaf 유틸리티 객체

<h1 th:text="${now}"></h1>
<h1 th:text="${#dates.format(now, 'yyyy-MM-dd HH:mm:ss')}"></h1>
<h1 th:text="${#dates.createToday()}"></h1>
<h1 th:text="${#numbers.formatInteger(price, 3, 'COMMA')}"></h1>

 

 

 

thymeleaf 유사 for문

<th:block th:each="num, status:${#numbers.sequence(1, #lists.size(memberList))}">
	<h2 th:text="${num}"></h2>
	<h2 th:text="${status.index}"></h2>
	<h1 th:text="${memberList.get(status.index)}"></h1>
</th:block>