* 아키텍쳐
요청처리(@RequestParam, @RequestHeader, @CookieValue)
웹브라이저 ----------------------> Controller
|
|
<--------------------- hello( /WEB-INF/views/hello.jsp)
7> Model 생성방법
- 이전 서블릿/jsp 는 scope 에 setAttribute(key,value) 로 저장하고 jsp 에서 보여줌.
scope 종류에 따라서 저장하고
request.setAttribute(key,value);
session.setAttribute(key,value);
application.setAttribute(key,value);
나중에 jsp 에 보여줌.
jsp 에서 보여주는 방법은
EL: ${key}
위 방식으로 jsp 에 보여준다.
* Spring 에서 JSTL 사용방법
<1> 의존성 설정
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<2> jsp 에서 taglib 등록
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
방법1: HttpServletRequest 이용
@GetMapping("/m1")
public String m1(HttpServletRequest request) {
System.out.println("m1");
request.setAttribute("m1", "홍길동");
request.setAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
request.setAttribute("m1_list", list);
return "m1";
}
방법2: Model 이용
@GetMapping("/m2")
public String m2(Model m) { // 자동으로 new Model() 해서 주입됨.
// 기본적으로 request scope 에 저장됨.
System.out.println("m2");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.addAttribute("m1_list", list);
return "m1";
}
방법3: ModelMap 이용
@GetMapping("/m3")
public String m3(ModelMap m) { // 자동으로 new ModelMap() 해서 주입됨.
// 기본적으로 request scope 에 저장됨.
System.out.println("m3");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.addAttribute("m1_list", list);
return "m1";
}
방법4: Map 이용
@GetMapping("/m4")
public String m4(Map<String, Object> m) { // 자동으로 new Model() 해서 주입됨.
// 기본적으로 request scope 에 저장됨.
System.out.println("m4");
m.put("m1", "홍길동");
m.put("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.put("m1_list", list);
return "m1";
}
package com.exam.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.exam.dto.LoginDTO;
@Controller
public class MainController {
Logger logger = LoggerFactory.getLogger(getClass());
@GetMapping("/m1")
public String m1(HttpServletRequest request) {
System.out.println("m1");
request.setAttribute("m1", "홍길동");
request.setAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
request.setAttribute("m1_list", list);
return "m1";
}
@GetMapping("/m2")
public String m2(Model m) { // 자동으로 new Model() 해서 주입됨.
System.out.println("m2");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.addAttribute("m1_list", list);
return "m1";
}
@GetMapping("/m3")
public String m3(ModelMap m) { // 자동으로 new ModelMap() 해서 주입됨.
System.out.println("m3");
m.addAttribute("m1", "홍길동");
m.addAttribute("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.addAttribute("m1_list", list);
return "m1";
}
@GetMapping("/m4")
public String m4(Map<String, Object> m) { // 자동으로 new Model() 해서 주입됨.
System.out.println("m4");
m.put("m1", "홍길동");
m.put("m1_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
m.put("m1_list", list);
return "m1";
}
}
package com.exam.dto;
public class LoginDTO {
String userid;
String passwd;
public LoginDTO() {
super();
// TODO Auto-generated constructor stub
}
public LoginDTO(String userid, String passwd) {
super();
this.userid = userid;
this.passwd = passwd;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "LoginDTO [userid=" + userid + ", passwd=" + passwd + "]";
}
}
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m1.jsp</h2>
m1: ${m1}<br>
m1_dto: ${m1_dto}<br>
m1_list:
<c:forEach var="dto" items="${m1_list}">
${dto}<br>
</c:forEach>
</body>
</html>
# application.properties
logging.level.org.springframework=info
# tomcat port 번호 변경
server.port=8090
# context 명 변경
server.servlet.context-path=/app
# jsp의 경로와 확장자 지정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.mvc.pathmatch.matching-strategy=ant-path-matcher
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.exam</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
방법5: 자동으로 key 사용해서 저장
@GetMapping("/m5")
public String m5(LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// request.setAttribute(key, value)
// 즉, 내부적으로 request.setAttribute(loginDTO, dto);
// 자동으로 빈 이름(첫글자는 소문자)으로 key 로 설정됨.
dto.setUserid("이순신");
dto.setPasswd("9876");
return "m5";
}
방법6: 명시적으로 key 사용해서 저장(*)
@GetMapping("/m6")
public String m6(@ModelAttribute("dto_model") LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.
dto.setUserid("이순신");
dto.setPasswd("9876");
return "m6";
}
방법7:
@GetMapping("/m7")
public String m7(@ModelAttribute("list_model") ArrayList<LoginDTO> list) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.
list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));
return "m7";
}
==> 방법7 까지가 메서드의 파라미터로 지정해서 Model 를 생성함.
그러면 리턴타입의 String 은 View 정보가 되는것이다.(jsp정보)
==> 메서드의 파라미터로 지정해서 Model 를 생성함.
모델은 파라미터에서 선언해서 만들거나 리턴타입으로 만든다.
==> 방법8 부터는 메서드의 리턴타입으로 Model 를 생성함.
==> View 정보는 어떻게 얻을까? 요청맵핑값을 view 정보로 사용한다.
package com.exam.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.exam.dto.LoginDTO;
@Controller
public class MainController {
Logger logger = LoggerFactory.getLogger(getClass());
@GetMapping("/m5")
public String m5(LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// request.setAttribute(key, value)
// 즉, 내부적으로 request.setAttribute(loginDTO, dto);
// 자동으로 빈 이름(첫글자는 소문자)으로 key 로 설정됨.
dto.setUserid("이순신");
dto.setPasswd("9876");
return "m5";
}
@GetMapping("/m6")
public String m6(@ModelAttribute("dto_model") LoginDTO dto) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.
dto.setUserid("이순신");
dto.setPasswd("9876");
return "m6";
}
@GetMapping("/m7")
public String m7(@ModelAttribute("list_model") ArrayList<LoginDTO> list) {
// LoginDTO 가 Model 이 됨.
// 즉, 내부적으로 request.setAttribute(명시적지정, dto);
// key 값 설정은 @ModelAttribute("key값") 사용.
list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));
return "m7";
}
}
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m5.jsp</h2>
${loginDTO}
</body>
</html>
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m6.jsp</h2>
${dto_model}
</body>
</html>
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m7.jsp</h2>
<c:forEach var="dto" items="${list_model}">
${dto}<br>
</c:forEach>
</body>
</html>
방법8: 자동으로 key 사용해서 저장
@GetMapping("/m8") // /WEB-INF/views/m8.jsp 찾음
public LoginDTO m8() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
방법9: 명시적으로 key 사용해서 저장
@GetMapping("/m9") // /WEB-INF/views/m9.jsp
public @ModelAttribute("dto_model") LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
@GetMapping("/m9") // /WEB-INF/views/m9.jsp
@ModelAttribute("dto_model")
public LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
방법10:
@GetMapping("/m10") // /WEB-INF/views/m10.jsp
public @ModelAttribute("list_model") ArrayList<LoginDTO> m10() { // 리턴타입인 LoginDTO 가 Model 이다.
ArrayList<LoginDTO> list = new ArrayList<>();
list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));
return list;
}
==> 방법8 에서 방법10 까지는 Model 과 View 정보가 분리되어서 설정했음.
==> 아래의 방법부터는 Model 과 View 정보를 한번에 설정 가능.
package com.exam.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.exam.dto.LoginDTO;
@Controller
public class MainController2 {
Logger logger = LoggerFactory.getLogger(getClass());
@GetMapping("/m8") // /WEB-INF/views/m8.jsp
public LoginDTO m8() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
// -------------------------------------------
@GetMapping("/m9") // /WEB-INF/views/m9.jsp
public @ModelAttribute("dto_model") LoginDTO m9() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
@GetMapping("/m9a") // /WEB-INF/views/m9.jsp
@ModelAttribute("dto_model")
public LoginDTO m9a() { // 리턴타입인 LoginDTO 가 Model 이다.
return new LoginDTO("유관순", "1234");
}
// @ModelAttribute 를 밖에 사용해도 상관없다.
// -------------------------------------------
@GetMapping("/m10") // /WEB-INF/views/m10.jsp
public @ModelAttribute("list_model") ArrayList<LoginDTO> m10() { // 리턴타입인 LoginDTO 가 Model 이다.
ArrayList<LoginDTO> list = new ArrayList<>();
list.add(new LoginDTO("홍길동", "1234"));
list.add(new LoginDTO("이순신", "9876"));
return list;
}
}
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m8.jsp</h2>
${loginDTO}
</body>
</html>
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m9.jsp</h2>
${dto_model}
</body>
</html>
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m10.jsp</h2>
<c:forEach var="dto" items="${list_model}">
${dto}<br>
</c:forEach>
</body>
</html>
방법11:
@GetMapping("/m11")
public ModelAndView m11() {
ModelAndView mav = new ModelAndView();
// 뷰정보
mav.setViewName("m11"); // /WEB-INF/views/m11.jsp
// 모델정보
mav.addObject("m11", "홍길동");
mav.addObject("m11_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
mav.addObject("m11_list", list);
return mav;
}
==> 모델이 없을때는?
// Model 은 없고 View 는 m12.jsp 가 된다.
@GetMapping("/m12")
public void m12() {
}
package com.exam.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import com.exam.dto.LoginDTO;
@Controller
public class MainController3 {
Logger logger = LoggerFactory.getLogger(getClass());
@GetMapping("/m11")
public ModelAndView m11() {
ModelAndView mav = new ModelAndView();
// 뷰정보
mav.setViewName("m11"); // /WEB-INF/views/m11.jsp
// 모델정보
mav.addObject("m11", "홍길동");
mav.addObject("m11_dto", new LoginDTO("홍길동", "1234"));
List<LoginDTO> list = Arrays.asList(new LoginDTO("홍길동1", "1234"),
new LoginDTO("홍길동2", "9999"));
mav.addObject("m11_list", list);
return mav;
}
// ------------------------------------------------------
// Model 은 없고 View 는 m12.jsp 가 된다.
@GetMapping("/m12")
public void m12() {
}
}
<%@ page
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>m11.jsp</h2>
m11: ${m11}<br>
m11_dto: ${m11_dto}<br>
m11_list:
<c:forEach var="dto" items="${m11_list}">
${dto}<br>
</c:forEach>
</body>
</html>
'[study]이론정리 > Spring Boot' 카테고리의 다른 글
Spring MVC - Ajax + json 통신 (0) | 2024.07.02 |
---|---|
Spring MVC - Model Scope (0) | 2024.07.02 |
Spring MVC - 쿠키값 얻기 (0) | 2024.07.02 |
Spring MVC - 요청헤더값 얻기 (0) | 2024.07.02 |
Spring MVC - 요청파라미터얻기2 (멀티값) (0) | 2024.07.02 |