1) built.gradle
Spring boot에서 JSP 사용하기 위해..
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'//추가
//implementation 'org.apache.tomcat.embed:tomcat.embed:tomcat-embed-jasper'//추가
implementation 'javax.servlet:jstl'//추가
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
=>
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.58'
implementation 'javax.servlet:jstl'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
implementation 'org.apache.tomcat.embed:tomcat.embed:tomcat-embed-jasper' //JASPER
implementation 'javax.servlet:jstl' // JSTL
디펜던시 추가한 이유?
설명 출처 블로그
1. 스프링 부트에서는 기본적으로 JSP를 지원하지 않음
2. 스프링 부트에 내장된 tomcat에는 컴파일하는 jsp 관련 엔진이 포함되지 않음
2) main에 webapp
이라는 directory 추가
3) 그 안에 jsp 라는 디렉토리 추가
4) vscode - view-jsp.jsp
파일 생성
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
지금 우리가 java로 여기 작성하고 있는데 나중에 html로 변환 부탁
이라는 의미를 지닌다<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix ="c" uri = "http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
</head>
<body>
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Occupation</th>
</tr>
<tbody>
<c:forEach items="${profiles}" var="profile">
<tr>
<td>${profile.name}</td>
<td>${profile.age}</td>
<td>${profile.occupation}</td>
</tr>
</c:forEach>
</tbody>
</thead>
</table>
</body>
</html>
5) application properties
spring.mvc.view.prefix : /WEB-INF/jsp/
spring.mvc.view.suffix : .jsp
6) Controller 작성
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("view")
public class SimpleController {
private static final Logger logger
= LoggerFactory.getLogger(SimpleController.class);
@GetMapping("/simple-jsp")
public String simpleJsp(){
logger.info("in simple jsp");
return "view-jsp";
}
}
=> run 해보니 잘 뜬다
1) list import
import java.util.List;
2)
@GetMapping("/simple-jsp")
public String simpleJsp(){
logger.info("in simple jsp");
List<SimplePayload> profile = new ArrayList<>();
profile.add(new SimplePayload("custard", 23, "developer"));
profile.add(new SimplePayload("happy", 22, "teacher"));
profile.add(new SimplePayload("luckyHappyPretty", 20, "student"));
return "view-jsp";
}
List<SimplePayload> profile = new ArrayList<>();
3) Model model
이라는 데이터 전달용 매개변수 추가
model.addAttribute("profiles", profile);
@GetMapping("/simple-jsp")
public String simpleJsp(Model model){ //model이라는 데이터 추가
logger.info("in simple jsp");
//profile arraylist 에 요소들 추가
List<SimplePayload> profile = new ArrayList<>();
profile.add(new SimplePayload("custard", 23, "developer"));
profile.add(new SimplePayload("happy", 22, "teacher"));
profile.add(new SimplePayload("luckyHappyPretty", 20, "student"));
model.addAttribute("profiles", profile); //전달 요소를 모델에 추가
return "view-jsp";
}
4) 결과
1) dependency 수정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'//추가
//implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.58'
//implementation 'javax.servlet:jstl'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2) Controller - ModelandView 방식으로
@GetMapping("/simple-thyme")
public ModelAndView simpleThyme(){
ModelAndView mandv = new ModelAndView();
logger.info("in simple thyme");
List<SimplePayload> profile = new ArrayList<>();
profile.add(new SimplePayload("custard", 23, "developer"));
profile.add(new SimplePayload("happy", 22, "teacher"));
profile.add(new SimplePayload("luckyHappyPretty", 20, "student"));
mandv.addObject("profiles",profile);
mandv.setViewName("view-thyme");
return mandv;
}
}
함수의 자료형을 ModelandView로 선언해서 return 값을 이 자료형으로 설정
ModelandView로 인스턴스를 만들고, 해당 인스턴스 안에 만들었던 데이터를 addObject로 담아주고, 돌려줄(보여줄) View이름을 setViewName으로 알려주면
=> 해당 뷰에 담은 object를 똑같이 돌려주는 것
다만 thyme 방식으로 가게 되면 static이 아닌 templates 자리에 뷰 파일(html) 생성해주기
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Occupation</th>
</tr>
<tbody>
<tr th:each="profile: ${profiles}">
<td th:text="${profile.name}" >
<td th:text="${profile.age}" >
<td th:text="${profile.occupation}" >
</tr>
</tbody>
</thead>
</table>
</body>
</html>
<!-- <c:forEach items="${profiles}" var="profile"> <tr> <td>${profile.name}</td> <td>${profile.age}</td> <td>${profile.occupation}</td> </tr> </c:forEach> -->
> 참고 :
[https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html](https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html)
`/WEB-INF/templates/home.html`
```java
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
List는 interface다. interface는 공통되는 메소드를 추출해 놓은 클래스로 생각하면 된다.
즉 범위로 생각하면 List 안에 ArrayList, LinkenList...등이 포함
ArrayList<Object> list = new ArrayList<>();
List<Object> list = new ArrayList<>();
`출처: https://yoon-dailylife.tistory.com/7 [알면 쓸모있는 개발 지식]`
-> 위는 그냥 구현체 클래스로 구현
-> 아래는 ArrayList를 업캐스팅해서 사용
-> 같은 결과 but List를 사용해 ArrayList를 생성하는 것은 유연성에서 효과d
매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라.
적합한 인터페이스가 없다면 클래스의 계층구조 중 가장 상위의 클래스를 사용하라.
Arraylist
◆ ArrayList : resizable array
리스트에 저장되는 데이터의 수가 늘어나면 자동으로 증가함
Could not find org.apache.tomcat.embed:tomcat.embed:tomcat-embed-jasper.
https://tomcat.apache.org/
-> 각자 컴퓨터 운영체제 맞게 톰캣 9.0 zip으로 다운로드
servlet
폴더가 있는 곳에 복붙하기나의 경우 => C:\Users\사용자명.m2\repository\javax
음 ~ 잘 되네!!!