1. 롬복 다운로드
- 안 켜질 경우에 ini 파일 메모장으로 열고 표시한 부분 상대경로로 변경해줄 것
* BuilderVO2, BootTest
더보기
- BuilderVO2(위에 어노테이션 까먹지 말고 붙일 것!)
package com.simple.basic.command;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //get, set, tostring
@NoArgsConstructor //기본 생성자
@AllArgsConstructor //모든 생성자
@Builder //빌더 패턴
public class BuilderVO2 {
private String name;
private int age;
}
- BootTest
package com.simple.basic;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.simple.basic.command.BuilderVO;
import com.simple.basic.command.BuilderVO.Builder;
import com.simple.basic.command.BuilderVO2;
import com.simple.basic.controller.HomeController;
@SpringBootTest //스프링 부트 테스트 클래스
public class BootTest {
@Test
public void testCode02() {
BuilderVO2 vo2 = BuilderVO2.builder()
.age(10)
.name("민정")
.build();
System.out.println(vo2.toString());
}
}
2. 타임리프(th라는 태그 이름으로 명시적으로 달아주고 나서 시작하면 됨, 반드시는 아님!)
- a 링크에서는 @{경로..}, 경로는 골뱅이!
- fragment: include
* ThymeleafController, ex01~ex07, layout01~03, test
- 실행은 3번째 처럼 내장 톰캣으로 실행하고 크롬에 view/ex01 검색(@Test 까먹지 말것!)
- 2번째 문단 사진처럼 가변값의 경우 @{test(age=${vo.age})} 이런 식으로 넘겨줄 것
더보기
- ThymeleafController
package com.simple.basic.controller;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.simple.basic.command.BuilderVO2;
import com.simple.basic.command.SimpleVO;
@Controller
@RequestMapping("/view")
public class ThymeleafController {
@GetMapping("/ex01") //get 방식만 허용
public String ex01() {
return "view/ex01";
}
@GetMapping("/ex02")
public String ex02(Model model) {
ArrayList<BuilderVO2> list = new ArrayList<>();
for(int i = 1; i <= 10; i++) {
BuilderVO2 vo = BuilderVO2
.builder().name("홍길동" + i)
.age(i)
.build();
list.add(vo);
}
//model
model.addAttribute("list", list);
return "view/ex02";
}
@GetMapping("/ex03")
public String ex03(Model model) {
ArrayList<BuilderVO2> list = new ArrayList<>();
for(int i = 1; i <= 10; i++) {
BuilderVO2 vo = BuilderVO2
.builder().name("홍길동" + i)
.age(i)
.build();
list.add(vo);
}
//model
model.addAttribute("list", list);
return "view/ex03";
}
//test
//쿼리 스트링
@GetMapping("/test")
public String test(@RequestParam("age") int age,
@RequestParam("name") String name) {
System.out.println("test 메서드 실행됨");
System.out.println(age);
System.out.println(name);
return "view/test";
}
//쿼리 파라미터
@GetMapping("/test2/{a}/{b}")
public String test(@PathVariable("a") String a,
@PathVariable("b") String b) {
System.out.println(a);
System.out.println(b);
return "view/test";
}
@GetMapping("/ex04")
public String ex04(Model model) {
BuilderVO2 vo = new BuilderVO2("이순신", 20);
model.addAttribute("name", "홍길동");
model.addAttribute("vo", vo);
return "view/ex04";
}
//타임리프 내장 함수
@GetMapping("/ex05")
public String ex05(Model model) {
//날짜의 형변환은 database, 자바, 화면에서 처리
model.addAttribute("regdate", LocalDateTime.now()); //날짜형
return "view/ex05";
}
//타임리프 include
@GetMapping("/ex06")
public String ex06() {
return "view/ex06";
}
//타임리프 템플릿 모형 사용하기
@GetMapping("/ex07")
public String ex07() {
return "view/ex07";
}
//실습
@GetMapping("/quiz01")
public void quiz01(Model model) {
SimpleVO vo = SimpleVO.builder()
.name("이순신")
.num("1")
.id("abc123")
.build();
model.addAttribute("vo", vo);
}
}
- ex01
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- 타임리프 명시적 선언 -->
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>타임리프 출력과 변수</h3>
<!-- 타임리프 문법을 사용하려면 속성 앞에 th를 붙입니다. -->
<!-- 동일한 표현입니다. -->
<h3 th:text="${'hello world'}"></h3>
<h3>[[${'헬로 월드'}]]</h3>
<h3 th:text="${1 == 1}"></h3>
<h3>[[${1 == 1}]]</h3>
<h3 th:text="${ true and false }"></h3>
<h3>[[${true and false}]]</h3>
<h3>[[${ '가' eq '가나다' }]]</h3>
<hr/>
<!-- 변수 선언 -->
<div th:with="a = 10">
[[${a}]]
</div>
<div th:with = "a = '홍길동'" th:text="${a}">
</div>
<!-- value 값의 사용 -->
<div th:with = "a = '이순신' ">
<input type="text" th:value="${a}">
</div>
<hr/>
<!-- if문 -->
<div th:with="a=10">
<span th:if="${a == 10}">[[${a + '입니다.'}]]</span>
<span th:if="${a == 20}">[[${a + '입니다.'}]]</span>
</div>
<!-- if else 문 : unless는 동일한 조건을 적습니다. -->
<div th:with="a=10">
<span th:if="${a != 10}">10이 아닙니다</span>
<span th:unless="${a != 10}">10 입니다</span>
</div>
<!-- 삼항 연산자 -->
<div th:with="a=10">
[[${a == 10 ? '참' : '거짓'}]]<br/>
[[${a} == 10 ? '참' : '거짓']]
</div>
</body>
</html>
- ex02
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>반복문</h3>
[[${list}]]
<ul>
<li th:each="vo : ${list}">
[[${vo.name}]]
[[${vo.age}]]
</li>
</ul>
<hr/>
<h3>반복문과 state 변수(jstl = varState)</h3>
<!-- each에 두번째 변수를 선언하면 상태 값을 담아줍니다. (index, count, size, current 등) -->
<ul>
<li th:each="vo, a : ${list}">
[[${a.count}]]번 - [[${vo.name}]]
</li>
</ul>
<h3>반복문과 조건문</h3>
<ul>
<li th:each="vo : ${list}" th:if="${vo.age % 2 == 0}">
[[${vo.age + '는 짝수입니다.'}]]
</li>
</ul>
<h3>반복문과 조건문2</h3>
<ul>
<li th:each="vo : ${list}">
<span th:if="${vo.age % 2 == 0}">짝수</span>
<span th:unless="${vo.age % 2 == 0}">홀수</span>
</li>
</ul>
</body>
</html>
- ex03
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>타임리프 block문</h3>
[[${list}]]
<hr/>
<!-- block은 별도의 태그를 사용하지 않고, 마치 중괄호처럼 사용하고 싶을 때 적용 -->
<ul>
<th:block th:each="vo : ${list}">
<li>[[${vo}]]</li>
</th:block>
</ul>
<!-- 가짜 태그 -->
<!-- <th:block>11</th:block> -->
<hr/>
<h3>타임리프 a태그</h3>
<a href="test?a=10">일반 a 태그</a>
<a th:href="@{test?a=10}">타임리프 a태그</a>
<!--
a링크로 값을 넘기는 방법
경로(키=값, 키=값)
경로/변수/변수(변수=값, 변수=값)
-->
<ul>
<li th:each=" vo : ${list}">
<a th:href="@{test(age=${vo.age}, name=${vo.name} )}">키 값 넘기기(쿼리 스트링 방식)</a>
<a th:href="@{test2/{age}/{name}(age=${vo.age}, name=${vo.name} )}">키 값 넘기기(쿼리 파라미터)</a>
</li>
</ul>
</body>
</html>
- ex04
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
[[${name}]] <br/>
[[${vo}]] <br/>
<!-- 컨트롤러에서 보내는 값을 JSON 문자열 형태로 받아줍니다. -->
<script th:inline="javascript">
console.log( '[[${name}]]' );
console.log( '[[${vo}]]' );
var aa = '[[${name}]]';
var bb = '[[${vo}]]';
console.log(JSON.parse(aa));
console.log(JSON.parse(bb));
</script>
</body>
</html>
- ex05
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>타임리프 내장 함수(구글링 하세요)</h3>
[[${regdate}]]
<br/>
[[ ${#temporals.format(regdate, 'yyyy-MM-dd') }]]
<br/> <!-- 문자열 자르기 -->
[[${#strings.substring('홍길동', 0, 1) }]]
</body>
</html>
- ex06
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>타임리프 include</h3>
<!-- fragment를 가져오기 ~{경로 :: 가져올 이름} -->
<div th:replace="~{/include/layout01 :: part1}"></div>
<th:block th:replace="~{/include/layout01 :: part2}"></th:block>
<!-- 파일을 통째로 가져오려면 ~{경로} -->
<th:block th:replace="~{/include/layout02} "></th:block>
</body>
</html>
- ex07: second는 .second라고 쓰면 됨, script태그는 th:block 아래에 두면 사용이 가능함.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- ~{파일 경로 :: 템플릿 함수(~{::선택자} } -->
<th:block th:replace="~{ /include/layout03 :: 함수( ~{:: .second } ) }">
<div id="first">
아이디 선택자 #
</div>
<div class="second">
클래스 선택자
</div>
</th:block>
<script>
console.log("이 파일에서만 사용")
</script>
</body>
</html>
- layout01
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div th:fragment="part1">
<h3>프래그먼트1</h3>
</div>
<div th:fragment="part2">
<h3>프래그먼트2</h3>
</div>
</body>
</html>
- layout02
<header>
<nav>
<ul>
<li><a href="#">메뉴</a></li>
<li><a href="#">메뉴</a></li>
<li><a href="#">메뉴</a></li>
<li><a href="#">메뉴</a></li>
</ul>
</nav>
</header>
- layout03
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="함수(section)">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<header>
공통 템플릿 헤더
</header>
<section th:replace=${section}>
</section>
<footer>
공통 템플릿 푸터
</footer>
</body>
</th:block>
</html>
- test
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>test 결과 화면</h3>
</body>
</html>
* ThymeleafController, quiz01, SimpleVO
더보기
- ThymeleafController
package com.simple.basic.controller;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.simple.basic.command.BuilderVO2;
import com.simple.basic.command.SimpleVO;
@Controller
@RequestMapping("/view")
public class ThymeleafController {
@GetMapping("/ex01") //get 방식만 허용
public String ex01() {
return "view/ex01";
}
@GetMapping("/ex02")
public String ex02(Model model) {
ArrayList<BuilderVO2> list = new ArrayList<>();
for(int i = 1; i <= 10; i++) {
BuilderVO2 vo = BuilderVO2
.builder().name("홍길동" + i)
.age(i)
.build();
list.add(vo);
}
//model
model.addAttribute("list", list);
return "view/ex02";
}
@GetMapping("/ex03")
public String ex03(Model model) {
ArrayList<BuilderVO2> list = new ArrayList<>();
for(int i = 1; i <= 10; i++) {
BuilderVO2 vo = BuilderVO2
.builder().name("홍길동" + i)
.age(i)
.build();
list.add(vo);
}
//model
model.addAttribute("list", list);
return "view/ex03";
}
//test
//쿼리 스트링
@GetMapping("/test")
public String test(@RequestParam("age") int age,
@RequestParam("name") String name) {
System.out.println("test 메서드 실행됨");
System.out.println(age);
System.out.println(name);
return "view/test";
}
//쿼리 파라미터
@GetMapping("/test2/{a}/{b}")
public String test(@PathVariable("a") String a,
@PathVariable("b") String b) {
System.out.println(a);
System.out.println(b);
return "view/test";
}
@GetMapping("/ex04")
public String ex04(Model model) {
BuilderVO2 vo = new BuilderVO2("이순신", 20);
model.addAttribute("name", "홍길동");
model.addAttribute("vo", vo);
return "view/ex04";
}
//타임리프 내장 함수
@GetMapping("/ex05")
public String ex05(Model model) {
//날짜의 형변환은 database, 자바, 화면에서 처리
model.addAttribute("regdate", LocalDateTime.now()); //날짜형
return "view/ex05";
}
//타임리프 include
@GetMapping("/ex06")
public String ex06() {
return "view/ex06";
}
//타임리프 템플릿 모형 사용하기
@GetMapping("/ex07")
public String ex07() {
return "view/ex07";
}
//실습
@GetMapping("/quiz01")
public void quiz01(Model model) {
SimpleVO vo = SimpleVO.builder()
.name("이순신")
.num("1")
.id("abc123")
.build();
model.addAttribute("vo", vo);
}
}
- quiz01
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<th:block th:replace="~{/include/layout03 :: 함수(~{:: .wrap } ) }">
<h3>이 화면에 진입할 때 SimpleVO를 이용하여 데이터를 출력 합니다. (값은 아무거나)</h3>
<p>
회원정보확인 링크에는 quiz_result01?키=값 형태로
회원번호, 이름, 아이디 을 넘겨주세요
아래 class="wrap" 부분만 layout03 템플릿에 전달 될 수 있도록 처리하세요
</p>
<div class="wrap">
회원번호: [[${vo.num}]] <br/>
이름: [[${vo.name}]] <br/>
아이디: [[${vo.id}]] <br/>
<br>
<a th:href="@{quiz_result01(num=${vo.num}, name=${vo.name}, id=${vo.id} )}">회원정보확인</a>
</div>
</th:block>
</html>
- SimpleVO
package com.simple.basic.command;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //get, set, tostring
@NoArgsConstructor //기본 생성자
@AllArgsConstructor //모든 생성자
@Builder //빌더 패턴
public class SimpleVO {
private String num;
private String name;
private String id;
}
'TIL > Spring boot' 카테고리의 다른 글
day88-spring boot (0) | 2023.02.17 |
---|---|
day86-spring boot (0) | 2023.02.16 |
day85-spring boot (0) | 2023.02.15 |
day84-spring boot (0) | 2023.02.14 |
day82-spring boot (0) | 2023.02.09 |