package kr.or.ddit.book.web;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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.servlet.ModelAndView;
import kr.or.ddit.book.service.IBookService;
/*
* @Controller 어노테이션이 있는 클래스는 스프링이 브라우저의 요청(request)을 받아들이는 컨트롤러라고 인지해서
* 자바 빈(Java Bean)으로 등록해서 관리한다.
*/
@Controller
@RequestMapping("/book")
public class BookInsertController {
//컨트롤러는 페이지를 리턴한다. 어떤 기능이 필요하다면 서비스에게 요청한다.
//중급프로젝트때까지는 싱글톤패턴을 이용해 getInstance() 사용했지만 이제는 사용하지 않는다.
//의존성주입 @Autowired 또는 @Inject 을 사용하면 알아서 해준다. 백신~!~!~
@Autowired
private IBookService service;
/*
* @RequestMapping
* - 요청 URL을 어떤 메소드가 처리할 지 여부를 결정
*
* method 속성은 http요청 메소드를 의미한다.
* 일반적인 웹 페이지 개발에서 GET 메소드는 데이터를 변경하지 않는 경우에,
* POST 메소드는 데이터가 변경될 경우 사용된다.
*
* ModelAndView는 컨트롤러가 반환할 데이터를 담당하는 모델(Model)과 화면을 담당하는 뷰(View)의 경로를 합쳐놓은 객체다.
* ModelAndView는 생성자에 문자열 타입 파라미터가 입력되는 뷰의 경로라고 간주한다.
*
* 뷰의 경로를 'book/form'과 같은 형태로 전달하는 이유는 요청(request)에 해당하는 url이 mapping되는 화면의 경로 값을
* ViewResolver라는 녀석이 제일 먼저 받는다. 받아서, suffix와 prefix 속성에 의해서 앞에는 '/WEB-INF/views/'를 붙이고
* 뒤에는 '.jsp'를 붙여 최종 위치에 해당하는 jsp파일을 찾아준다.
*
* suffix와 prefix 속성은 spring의 servlet-context.xml에서 확인할 수 있다.
*/
//Model= 데이터 View= 화면 > 데이터와 화면을 가용
@RequestMapping(value="/form.do", method= RequestMethod.GET)
public ModelAndView bookForm() {
//WEB-INF/views/book이라는 폴더안의 form.jsp
return new ModelAndView("book/form");
}
/*
* 데이터의 변경이 일어나므로 http 메소드는 POST 방식으로 처리
* @RequestParam은 HTTP 파라미터를 Map 변수에 자동으로 바인딩한다.
* Map 타입의 경우는 @RequsetParam을 붙여야만 HTTP 파라미터의 값을 map안에 바인딩해준다.
*/
@RequestMapping(value="/form.do", method= RequestMethod.POST)
public ModelAndView insertBook(@RequestParam Map<String, Object> map) {
ModelAndView mav = new ModelAndView();
// 이때까지 이렇게 데이터를 받아왔었지만 이제 이렇게 쓰지 않는다~
// String title = request.getParmeter("title");
// 이제는 파라미터에 map생성하면 자동 바인딩해서 넘어온다. (단, @RequestParam을 앞에 꼭 적어야한다)
return mav;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="${pageContext.request.contextPath}/resources/css/bootstrap.min.css" rel="stylesheet"/>
<title>책 생성하기</title>
</head>
<body>
<div class="jumbotron">
<div class="container">
<h2 class="display-4">책 생성하기</h2>
</div>
</div>
<div class="container">
<form action="" method="post">
<div class="row">
<div class="col-md-12 mb-2">
<div class="row">
<div class="col-md-2">
<label for="title" class="col-form-label">제목</label>
</div>
<div class="col-md-10">
<input type="text" class="form-control" name="title" id="title"/>
</div>
</div>
</div>
<div class="col-md-12 mb-2">
<div class="row">
<div class="col-md-2">
<label for="category" class="col-form-label">카테고리</label>
</div>
<div class="col-md-10">
<input type="text" class="form-control" name="category" id="category"/>
</div>
</div>
</div>
<div class="col-md-12 mb-2">
<div class="row">
<div class="col-md-2">
<label for="price" class="col-form-label">가격</label>
</div>
<div class="col-md-10">
<input type="text" class="form-control" name="price" id="price"/>
</div>
</div>
</div>
<button type="submit" class="btn btn-warning">등록</button>
<a href="/book/list.do" class="btn btn-primary">목록</a>
</div>
</form>
</div>
</body>
</html>