모델을 통한 데이터 전달
- 예시1
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
//요청URI : /read01
//Model 객체를 통해서 다양한 데이터를 뷰(View)에 전달
@GetMapping("/read01")
public String read01(Model model) {
model.addAttribute("userId", "hongkd");
model.addAttribute("password", "1234");
model.addAttribute("email", "aaa@ccc.com");
model.addAttribute("userName", "홍길동");
model.addAttribute("birthDay", "1989-09-07");
// /views/read01.jsp
return "read01";
}
}
read01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h3>Result</h3>
<p>userId : ${userId}</p>
<p>password : ${password}</p>
<p>email : ${email}</p>
<p>userName : ${userName}</p>
<p>birthDay : ${birthDay}</p>
- 예시2
Member.java
package kr.or.ddit.vo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
//POJO가 약해짐
@Data
public class Member {
private String userId;
private String userName = "hongkd";
private String password = "1234";
@DateTimeFormat(pattern="yyyy-MM-dd") private Date regDate;
private int coin;
private String gender;
private String email;
private String birthDay;
private String nationality;
private String cars;
private String[] carArray;
private ArrayList<String> carList;
private String hobby;
private String[] hobbyArray;
private ArrayList<String> hobbyList;
private String developer;
private boolean foreigner;
private String introduction;
private Date dateOfBirth;
// 중첩된(nested) 자바빈즈
// MEMBER : ADDRESS = 1 : 1
private Address address;
// MEMBER : CARD = 1 : N
private List<Card> cardList;
//스프링프레임워크에서 제공하는 MultipartFile 파일객체타입
private MultipartFile picture;
//<input type="file" name="pictures" multiple>
// 위의 input과 name 값이 변수명과 같아야 함
private MultipartFile[] pictures;
}
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
//요청URI : /read02
//Model 객체에 자바빈즈 클래스 객체를 값으로만 전달할 때는 뷰에서 참조할 이름을 클래스명의 앞글자를 소문자로 변환하여 처리함
@GetMapping("/read02")
public String read02(Model model) {
Member member = new Member();
member.setUserId("hongkd");
member.setPassword("1234");
member.setEmail("aaa@ccc.com");
member.setUserName("홍길동");
member.setBirthDay("1989-09-07");
Calendar cal = Calendar.getInstance();
cal.set(1988, 10, 7);
member.setDateOfBirth(cal.getTime());
log.info("member : " + member);
model.addAttribute("member",member);
// forwarding : /views/read02.jsp
return "read02";
}
}
read02.jsp
=> model.addAttribute("member",member); 로 저장한 member의 값을 jsp에서 꺼내올 수 있음
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<p>${member}</p>
<p>userId : ${member.userId}</p>
<p>userName : ${member.userName}</p>
- String[]와 List<String> 비교 => 다를 것 없음
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
@GetMapping("/read04")
public String read04(Model model) {
String[] carArray = {"saab", "audi"};
List<String> carList = new ArrayList<String>();
carList.add("saab");
carList.add("audi");
String[] hobbyArray = {"Music", "Movie"};
List<String> hobbyList = new ArrayList<String>();
hobbyList.add("Music");
hobbyList.add("Movie");
model.addAttribute("carArray", carArray);
model.addAttribute("carList", carList);
model.addAttribute("hobbyArray", hobbyArray);
model.addAttribute("hobbyList", hobbyList);
// /views/read04.jsp 포워딩
return "read04";
}
}
read04.jsp
stat.index : 0부터 시작
stat.count : 1부터 시작
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h4>hobbyArray</h4>
<!-- hobbyArray : {"Music", "Movie"} -->
<!-- items에는 컨트롤러에 있는 이름 그대로 집어 넣음 -->
<c:forEach var="hobby" items="${hobbyArray}" varStatus="stat">
<p>${stat.index} : ${hobby}</p>
</c:forEach>
<hr />
<h4>hobbyList</h4>
<!-- hobbyList : List<String> -->
<!-- hobbyList.add("Music"); hobbyList.add("Movie"); -->
<c:forEach var="hobby" items="${hobbyList}" varStatus="stat">
<p>${stat.count} : ${hobby}</p>
</c:forEach>
- 중첩된 자바빈즈
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
@GetMapping("/read05")
public String read05(Model model){
Member member = new Member();
// member 안에 있는 값임
Address address = new Address();
address.setPostCode("080908");
address.setLocation("seoul");
member.setAddress(address);
List<Card> cardList = new ArrayList<Card>();
Card card1 = new Card();
card1.setNo("123456");
card1.setValidMonth("05/24");
cardList.add(card1);
Card card2 = new Card();
card2.setNo("11111");
card2.setValidMonth("06/24");
cardList.add(card2);
member.setCardList(cardList);
Calendar cal = Calendar.getInstance();
cal.set(2000, 05, 07);
member.setDateOfBirth(cal.getTime());
model.addAttribute("member", member);
return "read05";
}
}
read05.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<p>${member}</p>
<!-- --MEMBER : ADDRESS = 1 : 1 (association)
-- member.address.userId(자바빈객체.중첩된 자바빈객체.프로퍼티)
address = Address(userId = null , posetCode = 080908
, location = seoul),
-->
<!-- model.addAttribute("member", -->
<p>member.address.postCode
: ${member.address.postCode}
</p>
<p>member.address.location
: ${member.address.location}
</p>
<hr />
<!-- List<Card> cardList -->
<h4>member.cardList</h4>
<c:forEach var="card" items="${member.cardList}" varStatus="stat">
<p>${card.no} : ${card.validMonth}</p>
</c:forEach>
- 쿼리 조인 예시1
LprodController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.service.LprodService;
import kr.or.ddit.vo.LprodVO;
import kr.or.ddit.vo.ProductVO;
import lombok.extern.slf4j.Slf4j;
/*
Controller 어노테이션
스프링 프레임워크에게 "이 클래스는 웹 브라우저의 요청(request)를
받아들이는 컨트롤러야" 라고 알려주는 것임.
스프링은 servlet-context.xml의 context:component-scan의 설정에 의해
이 클래스를 자바빈 객체로 등록(메모리에 바인딩).
*/
//스프링 프레임워크에게 "이 클래스는 컨트롤러야"라고 알려주자
@Slf4j
@RequestMapping("/lprod")
@Controller
public class LprodController {
//DI(의존성 주입) / IoC(제어의 역전)
@Autowired
LprodService lprodService;
/*
요청URI : /lprod/detail?lprodGu=P101
요청파라미터 : lprodGu=P101
요청방식 : get
리턴타입 : ModelAndView
View : lprod > detail.jsp
detail(ModelAndView mav) => 스프링이 mav객체를 자동 생성
*/
@RequestMapping(value="/detail", method=RequestMethod.GET)
public ModelAndView detail(LprodVO lprodVO, ModelAndView mav){
log.info("detail 도착");
//Model
// lprod_SQL.xml 의 namespace인 lprod내의 id값인 detail에 접근하여
// SELECT LPROD_ID, LPROD_GU, LPROD_NM
// FROM LPROD
// WHERE LPROD_GU = 'P101'
// 을 처리한 후 다음이 콘솔에 출력되도록 해보자
log.info("detail->lprodVO : " + lprodVO);
lprodVO = this.lprodService.detail(lprodVO);
log.info("lprodVO : " + lprodVO);
mav.addObject("lprodVO",lprodVO);
// forwarding : jsp
mav.setViewName("lprod/detail");
return mav;
}
}
LprodVO.java
package kr.or.ddit.vo;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
//POJO(Plain Old Java Object)에 위배
@Data
public class LprodVO {
private int lprodId;
private String lprodGu;
private String lprodNm;
//상품분류코드 : 상품 = 1 : N
//LPROD :PRODUCT = 1 : N
private List<ProductVO> productVOList;
private MultipartFile[] pictures;
}
detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
<script type="text/javascript" src="/resources/js/jquery.min.js"></script>
</head>
<body>
<h1>상품분류 상세</h1>
<!--
요청URI : /lprod/updatePost
요청파라미터 : {lprodId=14,lprodGu=P501, lprodNm=분식류}
요청방식 : post
-->
<h3>상품 분류 정보</h3>
<div id="divForm">
<form id="frm" action="/lprod/updatePost" method="post">
<p>
<input type="number" name="lprodId" value="${lprodVO.lprodId}"
readonly class="formdata" placeholder="상품분류 아이디(ex. 14)" />
</p>
<p>
<input type="text" name="lprodGu" value="${lprodVO.lprodGu}" readonly
class="formdata" placeholder="상품분류 코드(ex. P501)" required />
</p>
<p>
<input type="text" name="lprodNm" value="${lprodVO.lprodNm}" readonly
class="formdata" placeholder="상품분류 명(ex. 분식류)" />
</p>
<!-- ///// 일반모드 시작 ///// -->
<p id="p1">
<input type="button" id="edit" value="수정" /> <input type="button"
id="delete" value="삭제" /> <input type="button" id="list" value="목록" />
</p>
<!-- ///// 일반모드 끝 ///// -->
<!-- ///// 수정모드 시작 ///// -->
<p id="p2" style="display: none">
<input type="button" id="confirm" value="확인" /> <input type="button"
id="cancel" value="취소" />
</p>
<!-- ///// 수정모드 끝 ///// -->
</form>
</div>
<h3>상품 정보</h3>
<!-- mav.addObject("lprodVO",lprodVO); -->
<%-- <p>${lprodVO.productVOList}</p> --%>
<table border="1">
<thead>
<th>상품 아이디</th><th>상품 명</th><th>상품 가격</th>
</thead>
<tbody>
<!-- lprodVO.productVOList : List<ProductVO> -->
<c:forEach var="productVO" items="${lprodVO.productVOList}" varStatus="">
<tr>
<th>${productVO.productId}</th>
<th>${productVO.pname}</th>
<th>${productVO.unitPrice}</th>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
lprod_SQL.xml
join을 했을 때 resultMap사용
resultMap의 이름으로 resultMap 생성 후 id 같은 이름으로 기입
lprodVO에서 1:N으로 사용했기에 collection 을 사용 (collection의 property의 이름은 vo에 있는 이름과 같아야 함)
resultMap을 사용하여 이름을 정의
resultMap 생성 후 id를 정의한 것으로 기입하여 사용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="lprod">
<!-- LPROD : 1 -->
<!-- DB영역과 Java의 영역을 서로 매핑하는 역할을 함 -->
<resultMap type="lprodVO" id="lprodMap">
<result property="lprodId" column="LPROD_ID"/>
<result property="lprodGu" column="LPROD_GU"/>
<result property="lprodNm" column="LPROD_NM"/>
<!-- 1:N이기에 collection 사용 -->
<collection property="productVOList" resultMap="productMap"></collection>
</resultMap>
<!-- PRODUCT : N -->
<resultMap type="productVO" id="productMap">
<result property="productId" column="PRODUCT_ID"/>
<result property="pname" column="PNAME"/>
<result property="unitPrice" column="UNIT_PRICE"/>
<result property="description" column="DESCRIPTION"/>
<result property="manufacturer" column="MANUFACTURER"/>
<result property="category" column="CATEGORY"/>
<result property="unitsInStock" column="UNITS_IN_STOCK"/>
<result property="condition" column="CONDITION"/>
<result property="filename" column="FILENAME"/>
<result property="quantity" column="QUANTITY"/>
</resultMap>
<!-- PRODUCT : N -->
<!-- join을 했기에 resultMap을 사용 -->
<select id="detail" parameterType="lprodVO" resultMap="lprodMap">
SELECT A.LPROD_ID, A.LPROD_GU, A.LPROD_NM,
B.PRODUCT_ID, B.PNAME, B.UNIT_PRICE, B.DESCRIPTION, B.MANUFACTURER,
B.CATEGORY, B.UNITS_IN_STOCK, B.CONDITION, B.FILENAME, B.QUANTITY
FROM LPROD A LEFT OUTER JOIN PRODUCT B ON(A.LPROD_GU = SUBSTR(B.PRODUCT_ID,1,4))
WHERE A.LPROD_GU = #{lprodGu}
</select>
</mapper>
- 쿼리 조인 예시2
EmployeeVO.java
package kr.or.ddit.vo;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@Data
public class EmployeeVO {
private String empNo;
private String empName;
private String empAddress;
private String empTelno;
private int empSalary;
private String filename;
private List<LicenseVO> licenseVOList;
//EMPLOYEE : 증명사진 = 1 : 1
private MultipartFile uploadFile;
}
EmployeeController.java
package kr.or.ddit.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.sun.org.apache.xpath.internal.operations.Mod;
import kr.or.ddit.service.EmployeeService;
import kr.or.ddit.vo.EmployeeVO;
import lombok.extern.slf4j.Slf4j;
// 스프링 프레임워크에게 컨트롤러임을 알려줌
// 스프링이 빈(bean,객체)으로 등록하여 관리
@Controller
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {
// 의존성 주입(Dependency Injection)
@Autowired
EmployeeVO myEmpVO;
@Autowired
EmployeeService employeeService;
@RequestMapping(value="/detail", method=RequestMethod.GET)
public ModelAndView detail(EmployeeVO employeeVO, ModelAndView mav) {
log.info("list->detail : " + employeeVO);
employeeVO = this.employeeService.detail(employeeVO);
mav.addObject("employeeVO", employeeVO);
mav.setViewName("employee/detail");
return mav;
}
}
employee_SQL.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="employee">
<!-- EMPLOYEE : 1 -->
<resultMap type="employeeVO" id="employeeMap">
<result property="empNo" column="EMP_NO"/>
<result property="empName" column="EMP_NAME"/>
<result property="empAddress" column="EMP_ADDRESS"/>
<result property="empTelno" column="EMP_TELNO"/>
<result property="empSalary" column="EMP_SALARY"/>
<result property="filename" column="FILENAME"/>
<collection property="licenseVOList" resultMap="licenseMap"></collection>
</resultMap>
<!-- LICENSE : N -->
<resultMap type="licenseVO" id="licenseMap">
<result property="empNo" column="EMP_NO"/>
<result property="licNo" column="LIC_NO"/>
<result property="licNm" column="LIC_NM"/>
<result property="licDt" column="LIC_DT"/>
</resultMap>
<!-- 조인 조건인 P.K = F.K이므로 F.K는 쿼리에서 제외 => 공동된 이름은 삭제-->
<select id="detail" parameterType="employeeVO" resultMap="employeeMap">
SELECT A.EMP_NO, A.EMP_NAME, A.EMP_ADDRESS, A.EMP_TELNO, A.EMP_SALARY, A.FILENAME,
B.LIC_NO, B.LIC_NM, B.LIC_DT
FROM EMPLOYEE A LEFT OUTER JOIN LICENSE B ON(A.EMP_NO = B.EMP_NO)
WHERE A.EMP_NO = #{empNo}
</select>
</mapper>
'스프링 프레임워크' 카테고리의 다른 글
[스프링 프레임워크] 22장 공통 코드로 관리 (0) | 2024.05.10 |
---|---|
[스프링 프레임워크] 21장 스프링 폼 태그 라이브러리 (0) | 2024.05.10 |
[스프링 프레임워크] 19장 파일업로드 Ajax 방식 요청 처리 (0) | 2024.05.08 |
[스프링 프레임워크] 18장 Ajax 방식 요청 처리 (0) | 2024.05.08 |
[스프링 프레임워크] 17장 파일 업로드 (0) | 2024.05.03 |