https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-methods 참고

method 의 arguments 에 들어갈 수 있는 것에 대해 배우고 있었음
Controller04(1) - 여러개로 나눠서 올림
@Controller
@RequestMapping("/cont04")
public class Controller04 {
@RequestMapping("/met01")
public void method01(String name, String city) {
System.out.println(name);
System.out.println(city);
}
@RequestMapping("/met02")
public void method02(HttpServletRequest request) {
// 2. request 분석/가공
String name = request.getParameter("name");
String city = request.getParameter("city");
Bean01 bean = new Bean01();
bean.setName(name);
bean.setCity(city);
System.out.println(bean); // 잘 들어왔는지 확인
// 3. business logic
// 4. add attributes
// 5. forward / redirect
}
@RequestMapping("/met03")
public void method03(Bean01 bean) {
System.out.println(bean); // 잘 들어왔는지 확인
}
// /cont04/met04?country=usa&phone=0109999&address=seoul&email=usa@seoul.com
@RequestMapping("/met04")
public void method04(Bean02 bean) {
System.out.println(bean); // 각 프로퍼티가 null이 아니도록 요청 해보세요.
}
// /cont04/met05?name=john&age=33
@RequestMapping("/met05")
public void method05(Bean03 bean) {
System.out.println(bean);
}
// /cont04/met06?id=99&score=99.99
@RequestMapping("/met06")
public void method06(Bean04 bean) {
System.out.println(bean); // 각 프로퍼티가 0이 아니도록 요청
}
method01
method argument 로 (String name, String city) 작성
Bean01
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean01 {
private String name;
private String city;
}
method02, method03

method02 를 method03 과 같이 간단히 작성할 수 있음
method arguments 에 (Bean01 bean) 을 작성함으로써
method03 결과


Bean02
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String country;
private String address;
private String phone;
private String email;
}
method04
각 property 가 null 이 아니도록 요청 (주소창에)
→ /cont04/met04?country=usa&phone=0101234&address=ny&email=jisoo@gmail.com
즉, 주소창으로 전달받은 값은 method argument 에서 Bean02 bean 작성하여 bean 에 모두 전달됨
Bean03
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean03 {
private String name;
private int age;
}
method05
string 아니어도 될까? yes! 된다
int 형 넣어서 실행해봄
단, type 에 맞지 않는 값이 들어오면 오류, 아무것도 넣어주지 않으면 기본값
Bean04
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean04 {
private int id;
private double score;
}
method06
int 말고 double 도 해보기
Controller04(2)
// /cont04/met07?tel=010&tel=011&tel=012
@RequestMapping("/met07")
public void method07(@RequestParam("tel") ArrayList<String> tel) {
System.out.println(tel);
}
// /cont04/met08?name=john&tel=010&tel011
@RequestMapping("/met08")
public void method08(Bean05 bean) {
System.out.println(bean);
}
// ?name=john&id=99&address=seoul&address=jeju&address=ny
@RequestMapping("/met09")
public void method09(Bean06 bean) {
System.out.println(bean); // 모든 프로퍼티에 값이 들어가도록 요청
}
method07
이번에는 리스트!
tel 로 받아서 리스트 tel 에 저장
요청 : /cont04/met07?tel=010&tel=011&tel=012
위처럼 리스트에 넣을 값을 작성해주면 된다
Bean05
package org.zerock.controller.p01controller.bean;
import java.util.ArrayList;
import lombok.Data;
@Data
public class Bean05 {
private String name;
private ArrayList<String> tel;
}
method08
(Bean05 bean) 작성
bean 안에 리스트도 존재
요청 : /cont04/met08?name=john&tel=010&tel=011
여전히 리스트에 넣을 값은 위와같이 작성
Bean06
package org.zerock.controller.p01controller.bean;
import java.util.ArrayList;
import lombok.Data;
@Data
public class Bean06 {
private String name;
private int id;
private ArrayList<String> address;
}
method09
(Bean06 bean) 작성, 요청 - 연습
Controller04(3)
@RequestMapping("/met10")
public void method10(@RequestParam("date")
// @DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(iso = ISO.DATE) LocalDate date) {
System.out.println(date);
}
@RequestMapping("/met11")
public void method11(@RequestParam("dateTime") @DateTimeFormat(iso = ISO.DATE_TIME) LocalDateTime dateTime) {
System.out.println(dateTime);
}
// /cont04/met12?name=donald&birth=1999-01-01&inserted=1988-01-02T15:33:22
@RequestMapping("/met12")
public void method12(Bean07 bean) {
System.out.println(bean);
}
// /cont04/met13?name=trump&age=99&moved=1988-02-02&writed=2010-03-03T17:22:11
@RequestMapping("/met13")
public void method13(Bean08 bean) {
System.out.println(bean); // 모든 프로퍼티가 request param으로 부터 채워져서 출력되도록
}
@RequestMapping("/met14")
public void method14(@RequestParam String name, @RequestParam int age, HttpServletRequest request) {
System.out.println(name);
System.out.println(age);
System.out.println(request);
}
method10
(@RequestParam("date") @DateTimeFormat(iso=ISO.DATE) LocalDate date)
(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date)
date 로 받아오며, yyyy-MM-dd 형식으로 받음
date 에 저장
요청 : /cont04/met10?date=2021-12-31
method11
(@RequestParam("dateTime") @DateTimeFormat(iso=ISO.DATE_TIME) LocalDate dateTime)
dateTime 으로 받아와서 dateTime 에 저장
요청 : cont04/met11?dateTime=2021-12-31T11:22:33
Bean07
package org.zerock.controller.p01controller.bean;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import lombok.Data;
@Data
public class Bean07 {
private String name;
@DateTimeFormat(iso = ISO.DATE)
private LocalDate birth;
@DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime inserted;
}
method12
bean 에도 @DateTimeFormat(iso = ISO.DATE), @DateTimeFormat(iso = ISO.DATE_TIME) 명시해두어야 함
method 에는 (Bean07 bean) 작성하면 됨
요청 : cont04/met12?name=donald&birth=1999-01-01&inserted=1988-01-02T15:33:22
Bean08
package org.zerock.controller.p01controller.bean;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import lombok.Data;
@Data
public class Bean08 {
private String name;
private int age;
@DateTimeFormat(iso = ISO.DATE)
private LocalDate moved;
@DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime writed;
}
method13
연습
요청 : cont04/met13?name=trump&age=99&moved=1988-02-02&writed=2021-10-10T13:30:10
method14
(@RequestParam String name, @RequestParam int age, HttpServletRequest request)
요청 : cont04/met14/name=donald&age=33

controller.p02controller
Controller05(1) - 여러개로 나눠서 올림
package org.zerock.controller.p02controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/cont05")
public class Controller05 {
// request handler method return values
@RequestMapping("/met01")
public String method01(HttpServletRequest request) {
// 2. request 분석/가공
// 3. business 로직
// 4. add attribute
// 5. forward / redirect
/* servlet / jsp 사용할 때 */
// String path = "/WEB-INF/view/view01.jsp";
// request.getRequestDispatcher(path).forward(request, response);
/* spring mvc 사용시 */
return "view01";
}
// 할일 : /cont05/met02 로 요청이 오면 /WEB-INF/views/view02.jsp로 포워드 되도록 method02작성
@RequestMapping("/met02")
public String method02() {
return "view02";
}
원래 servlet 에서 다음과 같이 작성하던 5. forward / redirect 항목
String path = "/WEB-INF/view/view01.jsp";
request.getRequestDispatcher(path).forward(request, response);
→ return "view01"; 로 간단히 작성할 수 있다
폴더경로와 .jsp 확장자는 xml 파일에 명시되어있어서 생략한다

src > main > webapp > WEB-INF > views
view01
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<title>Insert title here</title>
</head>
<body>
<h1>포워드 잘됨</h1>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>
포워드 잘 됨 작성
method01
요청 : cont05/met01

콘솔 창 말고 화면에 뜸
포워딩 잘 됨
view02
<body>
<h1>view02 포워드 완료</h1>
</body>
method02
요청 : cont05/met02

Controller05(2)
@RequestMapping("/met03")
public String method03() {
return "cont05/view03"; // prefix: /WEB-INF/views/ , suffix : .jsp
}
@RequestMapping("/met04")
public String method04() {
return "/cont05/view04"; // /WEB-INF/views//cont05/view04.jsp
}
만약 다른 폴더에 있는 파일로 포워딩하고 싶다면, 폴더 경로까지 작성
return "cont05/view03";
src > main > webapp > WEB-INF > views >cont05
view03
<body>
<h1>view03 포워드 완료 <i class="fab fa-apple"></i> </h1>
</body>
method03
요청 : /cont05/met03

(servlet-context.xml 파일 수정 resources → resource, resources > css > icon > css, webfonts 저장)

method04
경로 앞에 / 를 붙여도 됨 - / 가 중복되면 하나로 봄
"cont05/met04" = "/cont05/met04"
Controller05(3)
// redirect
@RequestMapping("/met05")
public String method05() {
/* servlet 사용 시 */
// String location = request.getContextPath() + "/path";
// response.sendRedirect(location);
/* spring mvc 사용 시 */
return "redirect:/cont05/met04";
}
// 할일 : /cont05/met06 으로 요청 왔을 때 /cont05/met04 로 redirect 되는 method06을 만들기
@RequestMapping("/met06")
public String method06() {
return "redirect:/cont05/met04";
}
이번엔 포워딩 말고 리디렉트!
redirect
원래 servlet 에서 다음과 같이 작성하던 redirect
String location = request.getContextPath() + "/path";
response.sendRedirect(location);
→ return "redirect:/cont05/met04"; 와 같이 "redirect:경로" 로 간단히 작성
method05
요청 /cont05/met05 로 보내면 /cont05/met04 로 리디렉트되어 method04 실행됨

method06
마찬가지로 met04 로 리디렉트됨
Controller05(4)
// /cont05/met07
@RequestMapping("/met07")
public String method07() {
return null; // view 이름과 요청 경로가 같은 경우 null 리턴 가능
}
// /cont05/met08
@RequestMapping("/met08")
public void method08() {
// view 이름과 요청 경로가 같은 경우 void return 타입으로 결정
}
// 할 일 : /cont05/met09 로 요청이 왔을 때 /WEB-INF/views/cont05/met09.jsp로 포워드 되도록 method09 메소드를 작성
@RequestMapping("/met09")
public void method09() {
}
만약 view 이름 (포워딩 할 jsp 파일 경로, 이름) 과 해당 메소드 요청 경로가 동일한 경우
return "cont05/met07" 대신 return null; 하여도 jsp 파일로 포워딩 됨
메소드의 리턴 타입을 void 로 작성하면 return null; 을 작성하지 않아도 포워딩 됨
method09
public void method09() { } 작성하여 views > cont05 > met09.jsp 파일로 포워딩해보기
met09
<body>
<h1>met09.jsp 포워드 완료 <i class="fas fa-search"></i></h1>
</body
요청 : cont05/met09

controller.p03controller
Controller06(1) - 여러개로 나눠서 올림
@Controller
@RequestMapping("/cont06")
public class Controller06 {
@RequestMapping("/met01")
public void method01(HttpServletRequest request) {
request.setAttribute("myatt12", "hello world");
}
method01
(HttpServletRequest request)
request.setAttribute 로 hello world 를 myatt12 에 저장하여 전달
void 리턴타입이므로 /cont06/met01 로 포워딩
met01
<body>
<h1>/cont06/met01.jsp forward </h1>
<p>${myatt12 }</p>
</body>
요청 : /cont06/met01

hello world 잘 전달되었음
Controller06(2)
@RequestMapping("/met02")
public void method02(Model model) {
// 4. add attribute
model.addAttribute("myattr1", "myvalue1");
// 5
}
// 할일 : 요청 경로 : /cont06/met03
// view name : /cont06/met03
// view에서 사용하는 attribute 명 : "myattr2"
// myattr2의 값 : "myvalue2"
// 가 되도록 method03 작성
// 또한 view도 작성해서 myattr2가 myvalue2를 출력하는 확인
@RequestMapping("/met03")
public void method03(Model model) {
model.addAttribute("myattr2", "myvalue2");
}
method02
(HttpServletRequest request) 대신 (Model model) 작성 - Model 객체 이용
request.setAttribute 대신 model.addAttribute 작성
myattr2 에 myvalue2 저장하여 전달
met02
<body>
<h2>/cont06/met02.jsp 포워드 됨</h2>
<p>${myattr1 }</p>
</body>
요청 : cont06/met02

method03
met03
<body>
<p>\${myattr2 } : ${myattr2 }</p>
</body>
요청 : cont06/met03

Controller06(3)
@RequestMapping("/met04")
public void method04(Model model) {
// 3.
Bean01 bean = new Bean01();
bean.setAge(99);
bean.setName("trump");
// 4.
model.addAttribute("myBean", bean);
}
@RequestMapping("/met05")
public void method05(Model model) {
// 3.
Bean01 bean = new Bean01();
bean.setAge(88);
bean.setName("donald");
// 4.
// model.addAttribute("bean01", bean); // attribute의 이름이 클래스(type)의 이름(to lower
// camel case)과 같은 경우 생략 가능
model.addAttribute(bean);
// 할일 : view (jsp) 를 만들어서 "bean01" attribute가 있는 지 확인)
}
method04
model.addAttribute 로 string 말고 다른 객체도 전달 가능
이번에는 bean 전달해보기
Bean01 객체 bean 생성, setter 메소드로 age, name 값 저장
model.addAttribute 로 bean 을 myBean 으로 전달
controller.p03controller.bean
Bean01
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean01 {
private String name;
private int age;
}
met04
<body>
<p>${myBean.age }</p>
<p>${myBean.name }</p>
</body>
전달받은 myBean 에서 age, name 꺼내기
요청 : cont06/met04

method05
attribute 이름이 클래스의 이름(Bean01)과 같은 경우 생략 가능
model.addAttribute("bean01", bean) 대신 model.addAttribute(bean) 만 작성
met05
<body>
<p>${bean01.age }</p>
<p>${bean01.name }</p>
</body>
요청 : cont06/met05

Controller06(4)
@RequestMapping("/met06")
public void method06(Model model) {
model.addAttribute("attr1", "val1");
model.addAttribute("attr2", "val2");
}
@RequestMapping("/met07")
public void method07(String name, String city, Model model) {
model.addAttribute("name", name);
model.addAttribute("city", city);
}
@RequestMapping("/met08")
public String method08(@ModelAttribute("name") String name,
@ModelAttribute("city") String city) {
return "/cont06/met07";
}
method06
met06
<body>
<p>${attr1 }</p>
<p>${attr2 }</p>
</body>
요청 : cont06/met06

method07
(String name, String city, Model model) 작성
name 을 "name" 에 전달, city 를 "city" 에 전달
met07
<body>
<p>${name }</p>
<p>${city }</p>
</body>
요청 : cont06/met07?name=jennie&city=london


name 과 city 에 들어갈 값은 쿼리 스트링으로 작성하여 전달해줌
method08
(@ModelAttribute("name") String name, @ModelAttribute("city") String city)
Model model 작성하고 model.addAttribute("attribute 이름", 전달할 것 ) 작성하는 대신
전달하려는 것들 각 앞에 @ModelAttribute("attribute 이름") 작성
메소드 리턴타입이 void 아닌 String 이어서 return "cont06/met07"; 작성하여 method07 로 포워딩
→ 요청을 cont06/met08?name=jisoo&city=seoul 로 보내면,
method08 에서 값을 전달하여 method07 로 포워딩되고, met07 에 의해 결과가 다음과 같이 출력됨

Controller06(5)
@RequestMapping("/met09")
public void method09(Bean01 bean, Model model) {
model.addAttribute("bean", bean);
}
@RequestMapping("/met10")
public String method10(@ModelAttribute("bean") Bean01 bean) {
return "/cont06/met09";
}
@RequestMapping("/met11")
public void method11(@ModelAttribute Bean01 bean) {
}
@RequestMapping("/met12")
public String method12(Bean01 bean) {
return "/cont06/met11";
}
// /cont06/met13?city=seoul&address=gangnam
@RequestMapping("/met13")
public void method13(Bean02 bean) {
// todo1: Bean02 클래스 완성
// todo2: /cont06/met13.jsp 를 작성해서 seoul,gangnam이 출력
}
method09
이번에는 bean
(Bean01 bean, Model model) 작성
met09
<body>
<p>${bean.name }</p>
<p>${bean.age }</p>
</body>

요청 : cont06/met09?name=ironman&age=77
method09 에서 Bean01 에 저장, met09 로 포워딩 되어 값이 꺼내져 출력됨
method10
bean 도 Model model, model.addAttribute 작성하는 대신 (@ModelAttribute("bean") Bean01 bean) 작성
Bean01 bean 을 bean 으로 전달
위 09와 마찬가지, met09.jsp 로 포워딩 (꺼내는 코드가 같아서)
method11
위에서 배웠듯 attribute 이름이 클래스의 이름(Bean01)과 같은 경우 생략 가능 하므로 @ModelAttribute 뒤에 attrubute 이름 생략
return~ 작성하지 않도록 메소드 리턴타입 void, 경로 met11 과 같은 view 파일 생성, 포워딩
met11
<body>
<p>\${bean01.name } : ${bean01.name }</p>
<p>\${bean01.age } : ${bean01.age }</p>
</body>
마찬가지로 요청시 쿼리 스트링으로 값 작성하여 전달, bean 에 저장하여 전달
method12
그런데!

@ModelAttribute 는 생략할 수 있다!
return "cont06/met11" 포워딩하여 met11 로 출력 (출력하는 코드 동일하므로 met12 따로 작성하지 않았음)
method13
연습
Bean02
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String city;
private String address;
}
met13
<body>
<p>${bean02.city }</p>
<p>${bean02.address }</p>
</body>
'course 2021 > Spring' 카테고리의 다른 글
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |
---|---|
Spring04 - 12/07(controller07~09) (0) | 2021.12.20 |
Spring02 - 12/03 (0) | 2021.12.16 |
Spring01 - 12/02 (0) | 2021.12.14 |
Spring Tool Suite (0) | 2021.12.07 |
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-methods 참고

method 의 arguments 에 들어갈 수 있는 것에 대해 배우고 있었음
Controller04(1) - 여러개로 나눠서 올림
@Controller
@RequestMapping("/cont04")
public class Controller04 {
@RequestMapping("/met01")
public void method01(String name, String city) {
System.out.println(name);
System.out.println(city);
}
@RequestMapping("/met02")
public void method02(HttpServletRequest request) {
// 2. request 분석/가공
String name = request.getParameter("name");
String city = request.getParameter("city");
Bean01 bean = new Bean01();
bean.setName(name);
bean.setCity(city);
System.out.println(bean); // 잘 들어왔는지 확인
// 3. business logic
// 4. add attributes
// 5. forward / redirect
}
@RequestMapping("/met03")
public void method03(Bean01 bean) {
System.out.println(bean); // 잘 들어왔는지 확인
}
// /cont04/met04?country=usa&phone=0109999&address=seoul&email=usa@seoul.com
@RequestMapping("/met04")
public void method04(Bean02 bean) {
System.out.println(bean); // 각 프로퍼티가 null이 아니도록 요청 해보세요.
}
// /cont04/met05?name=john&age=33
@RequestMapping("/met05")
public void method05(Bean03 bean) {
System.out.println(bean);
}
// /cont04/met06?id=99&score=99.99
@RequestMapping("/met06")
public void method06(Bean04 bean) {
System.out.println(bean); // 각 프로퍼티가 0이 아니도록 요청
}
method01
method argument 로 (String name, String city) 작성
Bean01
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean01 {
private String name;
private String city;
}
method02, method03

method02 를 method03 과 같이 간단히 작성할 수 있음
method arguments 에 (Bean01 bean) 을 작성함으로써
method03 결과


Bean02
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String country;
private String address;
private String phone;
private String email;
}
method04
각 property 가 null 이 아니도록 요청 (주소창에)
→ /cont04/met04?country=usa&phone=0101234&address=ny&email=jisoo@gmail.com
즉, 주소창으로 전달받은 값은 method argument 에서 Bean02 bean 작성하여 bean 에 모두 전달됨
Bean03
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean03 {
private String name;
private int age;
}
method05
string 아니어도 될까? yes! 된다
int 형 넣어서 실행해봄
단, type 에 맞지 않는 값이 들어오면 오류, 아무것도 넣어주지 않으면 기본값
Bean04
package org.zerock.controller.p01controller.bean;
import lombok.Data;
@Data
public class Bean04 {
private int id;
private double score;
}
method06
int 말고 double 도 해보기
Controller04(2)
// /cont04/met07?tel=010&tel=011&tel=012
@RequestMapping("/met07")
public void method07(@RequestParam("tel") ArrayList<String> tel) {
System.out.println(tel);
}
// /cont04/met08?name=john&tel=010&tel011
@RequestMapping("/met08")
public void method08(Bean05 bean) {
System.out.println(bean);
}
// ?name=john&id=99&address=seoul&address=jeju&address=ny
@RequestMapping("/met09")
public void method09(Bean06 bean) {
System.out.println(bean); // 모든 프로퍼티에 값이 들어가도록 요청
}
method07
이번에는 리스트!
tel 로 받아서 리스트 tel 에 저장
요청 : /cont04/met07?tel=010&tel=011&tel=012
위처럼 리스트에 넣을 값을 작성해주면 된다
Bean05
package org.zerock.controller.p01controller.bean;
import java.util.ArrayList;
import lombok.Data;
@Data
public class Bean05 {
private String name;
private ArrayList<String> tel;
}
method08
(Bean05 bean) 작성
bean 안에 리스트도 존재
요청 : /cont04/met08?name=john&tel=010&tel=011
여전히 리스트에 넣을 값은 위와같이 작성
Bean06
package org.zerock.controller.p01controller.bean;
import java.util.ArrayList;
import lombok.Data;
@Data
public class Bean06 {
private String name;
private int id;
private ArrayList<String> address;
}
method09
(Bean06 bean) 작성, 요청 - 연습
Controller04(3)
@RequestMapping("/met10")
public void method10(@RequestParam("date")
// @DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(iso = ISO.DATE) LocalDate date) {
System.out.println(date);
}
@RequestMapping("/met11")
public void method11(@RequestParam("dateTime") @DateTimeFormat(iso = ISO.DATE_TIME) LocalDateTime dateTime) {
System.out.println(dateTime);
}
// /cont04/met12?name=donald&birth=1999-01-01&inserted=1988-01-02T15:33:22
@RequestMapping("/met12")
public void method12(Bean07 bean) {
System.out.println(bean);
}
// /cont04/met13?name=trump&age=99&moved=1988-02-02&writed=2010-03-03T17:22:11
@RequestMapping("/met13")
public void method13(Bean08 bean) {
System.out.println(bean); // 모든 프로퍼티가 request param으로 부터 채워져서 출력되도록
}
@RequestMapping("/met14")
public void method14(@RequestParam String name, @RequestParam int age, HttpServletRequest request) {
System.out.println(name);
System.out.println(age);
System.out.println(request);
}
method10
(@RequestParam("date") @DateTimeFormat(iso=ISO.DATE) LocalDate date)
(@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date)
date 로 받아오며, yyyy-MM-dd 형식으로 받음
date 에 저장
요청 : /cont04/met10?date=2021-12-31
method11
(@RequestParam("dateTime") @DateTimeFormat(iso=ISO.DATE_TIME) LocalDate dateTime)
dateTime 으로 받아와서 dateTime 에 저장
요청 : cont04/met11?dateTime=2021-12-31T11:22:33
Bean07
package org.zerock.controller.p01controller.bean;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import lombok.Data;
@Data
public class Bean07 {
private String name;
@DateTimeFormat(iso = ISO.DATE)
private LocalDate birth;
@DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime inserted;
}
method12
bean 에도 @DateTimeFormat(iso = ISO.DATE), @DateTimeFormat(iso = ISO.DATE_TIME) 명시해두어야 함
method 에는 (Bean07 bean) 작성하면 됨
요청 : cont04/met12?name=donald&birth=1999-01-01&inserted=1988-01-02T15:33:22
Bean08
package org.zerock.controller.p01controller.bean;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import lombok.Data;
@Data
public class Bean08 {
private String name;
private int age;
@DateTimeFormat(iso = ISO.DATE)
private LocalDate moved;
@DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime writed;
}
method13
연습
요청 : cont04/met13?name=trump&age=99&moved=1988-02-02&writed=2021-10-10T13:30:10
method14
(@RequestParam String name, @RequestParam int age, HttpServletRequest request)
요청 : cont04/met14/name=donald&age=33

controller.p02controller
Controller05(1) - 여러개로 나눠서 올림
package org.zerock.controller.p02controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/cont05")
public class Controller05 {
// request handler method return values
@RequestMapping("/met01")
public String method01(HttpServletRequest request) {
// 2. request 분석/가공
// 3. business 로직
// 4. add attribute
// 5. forward / redirect
/* servlet / jsp 사용할 때 */
// String path = "/WEB-INF/view/view01.jsp";
// request.getRequestDispatcher(path).forward(request, response);
/* spring mvc 사용시 */
return "view01";
}
// 할일 : /cont05/met02 로 요청이 오면 /WEB-INF/views/view02.jsp로 포워드 되도록 method02작성
@RequestMapping("/met02")
public String method02() {
return "view02";
}
원래 servlet 에서 다음과 같이 작성하던 5. forward / redirect 항목
String path = "/WEB-INF/view/view01.jsp";
request.getRequestDispatcher(path).forward(request, response);
→ return "view01"; 로 간단히 작성할 수 있다
폴더경로와 .jsp 확장자는 xml 파일에 명시되어있어서 생략한다

src > main > webapp > WEB-INF > views
view01
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<title>Insert title here</title>
</head>
<body>
<h1>포워드 잘됨</h1>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>
포워드 잘 됨 작성
method01
요청 : cont05/met01

콘솔 창 말고 화면에 뜸
포워딩 잘 됨
view02
<body>
<h1>view02 포워드 완료</h1>
</body>
method02
요청 : cont05/met02

Controller05(2)
@RequestMapping("/met03")
public String method03() {
return "cont05/view03"; // prefix: /WEB-INF/views/ , suffix : .jsp
}
@RequestMapping("/met04")
public String method04() {
return "/cont05/view04"; // /WEB-INF/views//cont05/view04.jsp
}
만약 다른 폴더에 있는 파일로 포워딩하고 싶다면, 폴더 경로까지 작성
return "cont05/view03";
src > main > webapp > WEB-INF > views >cont05
view03
<body>
<h1>view03 포워드 완료 <i class="fab fa-apple"></i> </h1>
</body>
method03
요청 : /cont05/met03

(servlet-context.xml 파일 수정 resources → resource, resources > css > icon > css, webfonts 저장)

method04
경로 앞에 / 를 붙여도 됨 - / 가 중복되면 하나로 봄
"cont05/met04" = "/cont05/met04"
Controller05(3)
// redirect
@RequestMapping("/met05")
public String method05() {
/* servlet 사용 시 */
// String location = request.getContextPath() + "/path";
// response.sendRedirect(location);
/* spring mvc 사용 시 */
return "redirect:/cont05/met04";
}
// 할일 : /cont05/met06 으로 요청 왔을 때 /cont05/met04 로 redirect 되는 method06을 만들기
@RequestMapping("/met06")
public String method06() {
return "redirect:/cont05/met04";
}
이번엔 포워딩 말고 리디렉트!
redirect
원래 servlet 에서 다음과 같이 작성하던 redirect
String location = request.getContextPath() + "/path";
response.sendRedirect(location);
→ return "redirect:/cont05/met04"; 와 같이 "redirect:경로" 로 간단히 작성
method05
요청 /cont05/met05 로 보내면 /cont05/met04 로 리디렉트되어 method04 실행됨

method06
마찬가지로 met04 로 리디렉트됨
Controller05(4)
// /cont05/met07
@RequestMapping("/met07")
public String method07() {
return null; // view 이름과 요청 경로가 같은 경우 null 리턴 가능
}
// /cont05/met08
@RequestMapping("/met08")
public void method08() {
// view 이름과 요청 경로가 같은 경우 void return 타입으로 결정
}
// 할 일 : /cont05/met09 로 요청이 왔을 때 /WEB-INF/views/cont05/met09.jsp로 포워드 되도록 method09 메소드를 작성
@RequestMapping("/met09")
public void method09() {
}
만약 view 이름 (포워딩 할 jsp 파일 경로, 이름) 과 해당 메소드 요청 경로가 동일한 경우
return "cont05/met07" 대신 return null; 하여도 jsp 파일로 포워딩 됨
메소드의 리턴 타입을 void 로 작성하면 return null; 을 작성하지 않아도 포워딩 됨
method09
public void method09() { } 작성하여 views > cont05 > met09.jsp 파일로 포워딩해보기
met09
<body>
<h1>met09.jsp 포워드 완료 <i class="fas fa-search"></i></h1>
</body
요청 : cont05/met09

controller.p03controller
Controller06(1) - 여러개로 나눠서 올림
@Controller
@RequestMapping("/cont06")
public class Controller06 {
@RequestMapping("/met01")
public void method01(HttpServletRequest request) {
request.setAttribute("myatt12", "hello world");
}
method01
(HttpServletRequest request)
request.setAttribute 로 hello world 를 myatt12 에 저장하여 전달
void 리턴타입이므로 /cont06/met01 로 포워딩
met01
<body>
<h1>/cont06/met01.jsp forward </h1>
<p>${myatt12 }</p>
</body>
요청 : /cont06/met01

hello world 잘 전달되었음
Controller06(2)
@RequestMapping("/met02")
public void method02(Model model) {
// 4. add attribute
model.addAttribute("myattr1", "myvalue1");
// 5
}
// 할일 : 요청 경로 : /cont06/met03
// view name : /cont06/met03
// view에서 사용하는 attribute 명 : "myattr2"
// myattr2의 값 : "myvalue2"
// 가 되도록 method03 작성
// 또한 view도 작성해서 myattr2가 myvalue2를 출력하는 확인
@RequestMapping("/met03")
public void method03(Model model) {
model.addAttribute("myattr2", "myvalue2");
}
method02
(HttpServletRequest request) 대신 (Model model) 작성 - Model 객체 이용
request.setAttribute 대신 model.addAttribute 작성
myattr2 에 myvalue2 저장하여 전달
met02
<body>
<h2>/cont06/met02.jsp 포워드 됨</h2>
<p>${myattr1 }</p>
</body>
요청 : cont06/met02

method03
met03
<body>
<p>\${myattr2 } : ${myattr2 }</p>
</body>
요청 : cont06/met03

Controller06(3)
@RequestMapping("/met04")
public void method04(Model model) {
// 3.
Bean01 bean = new Bean01();
bean.setAge(99);
bean.setName("trump");
// 4.
model.addAttribute("myBean", bean);
}
@RequestMapping("/met05")
public void method05(Model model) {
// 3.
Bean01 bean = new Bean01();
bean.setAge(88);
bean.setName("donald");
// 4.
// model.addAttribute("bean01", bean); // attribute의 이름이 클래스(type)의 이름(to lower
// camel case)과 같은 경우 생략 가능
model.addAttribute(bean);
// 할일 : view (jsp) 를 만들어서 "bean01" attribute가 있는 지 확인)
}
method04
model.addAttribute 로 string 말고 다른 객체도 전달 가능
이번에는 bean 전달해보기
Bean01 객체 bean 생성, setter 메소드로 age, name 값 저장
model.addAttribute 로 bean 을 myBean 으로 전달
controller.p03controller.bean
Bean01
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean01 {
private String name;
private int age;
}
met04
<body>
<p>${myBean.age }</p>
<p>${myBean.name }</p>
</body>
전달받은 myBean 에서 age, name 꺼내기
요청 : cont06/met04

method05
attribute 이름이 클래스의 이름(Bean01)과 같은 경우 생략 가능
model.addAttribute("bean01", bean) 대신 model.addAttribute(bean) 만 작성
met05
<body>
<p>${bean01.age }</p>
<p>${bean01.name }</p>
</body>
요청 : cont06/met05

Controller06(4)
@RequestMapping("/met06")
public void method06(Model model) {
model.addAttribute("attr1", "val1");
model.addAttribute("attr2", "val2");
}
@RequestMapping("/met07")
public void method07(String name, String city, Model model) {
model.addAttribute("name", name);
model.addAttribute("city", city);
}
@RequestMapping("/met08")
public String method08(@ModelAttribute("name") String name,
@ModelAttribute("city") String city) {
return "/cont06/met07";
}
method06
met06
<body>
<p>${attr1 }</p>
<p>${attr2 }</p>
</body>
요청 : cont06/met06

method07
(String name, String city, Model model) 작성
name 을 "name" 에 전달, city 를 "city" 에 전달
met07
<body>
<p>${name }</p>
<p>${city }</p>
</body>
요청 : cont06/met07?name=jennie&city=london


name 과 city 에 들어갈 값은 쿼리 스트링으로 작성하여 전달해줌
method08
(@ModelAttribute("name") String name, @ModelAttribute("city") String city)
Model model 작성하고 model.addAttribute("attribute 이름", 전달할 것 ) 작성하는 대신
전달하려는 것들 각 앞에 @ModelAttribute("attribute 이름") 작성
메소드 리턴타입이 void 아닌 String 이어서 return "cont06/met07"; 작성하여 method07 로 포워딩
→ 요청을 cont06/met08?name=jisoo&city=seoul 로 보내면,
method08 에서 값을 전달하여 method07 로 포워딩되고, met07 에 의해 결과가 다음과 같이 출력됨

Controller06(5)
@RequestMapping("/met09")
public void method09(Bean01 bean, Model model) {
model.addAttribute("bean", bean);
}
@RequestMapping("/met10")
public String method10(@ModelAttribute("bean") Bean01 bean) {
return "/cont06/met09";
}
@RequestMapping("/met11")
public void method11(@ModelAttribute Bean01 bean) {
}
@RequestMapping("/met12")
public String method12(Bean01 bean) {
return "/cont06/met11";
}
// /cont06/met13?city=seoul&address=gangnam
@RequestMapping("/met13")
public void method13(Bean02 bean) {
// todo1: Bean02 클래스 완성
// todo2: /cont06/met13.jsp 를 작성해서 seoul,gangnam이 출력
}
method09
이번에는 bean
(Bean01 bean, Model model) 작성
met09
<body>
<p>${bean.name }</p>
<p>${bean.age }</p>
</body>

요청 : cont06/met09?name=ironman&age=77
method09 에서 Bean01 에 저장, met09 로 포워딩 되어 값이 꺼내져 출력됨
method10
bean 도 Model model, model.addAttribute 작성하는 대신 (@ModelAttribute("bean") Bean01 bean) 작성
Bean01 bean 을 bean 으로 전달
위 09와 마찬가지, met09.jsp 로 포워딩 (꺼내는 코드가 같아서)
method11
위에서 배웠듯 attribute 이름이 클래스의 이름(Bean01)과 같은 경우 생략 가능 하므로 @ModelAttribute 뒤에 attrubute 이름 생략
return~ 작성하지 않도록 메소드 리턴타입 void, 경로 met11 과 같은 view 파일 생성, 포워딩
met11
<body>
<p>\${bean01.name } : ${bean01.name }</p>
<p>\${bean01.age } : ${bean01.age }</p>
</body>
마찬가지로 요청시 쿼리 스트링으로 값 작성하여 전달, bean 에 저장하여 전달
method12
그런데!

@ModelAttribute 는 생략할 수 있다!
return "cont06/met11" 포워딩하여 met11 로 출력 (출력하는 코드 동일하므로 met12 따로 작성하지 않았음)
method13
연습
Bean02
package org.zerock.controller.p03controller.bean;
import lombok.Data;
@Data
public class Bean02 {
private String city;
private String address;
}
met13
<body>
<p>${bean02.city }</p>
<p>${bean02.address }</p>
</body>
'course 2021 > Spring' 카테고리의 다른 글
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |
---|---|
Spring04 - 12/07(controller07~09) (0) | 2021.12.20 |
Spring02 - 12/03 (0) | 2021.12.16 |
Spring01 - 12/02 (0) | 2021.12.14 |
Spring Tool Suite (0) | 2021.12.07 |