Spring - Controller호출, forward/redirect, RestController
RestController 개념정리
http://doublesprogramming.tistory.com/105
Controller 전체 코드
package com.example.spring01.sample; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; @Controller // 컨트롤러 bean으로 로딩(현재 클래스를 컨트롤러로 메모리에 로딩시켜준다) public class SampleController { // 로그 객체 생성 private static final Logger logger = LoggerFactory.getLogger(SampleController.class); @RequestMapping("sample/doA") // url pattern // 리턴타입 없이 void일 경우, mapping된 url pattern이름과 동일한 jsp로 포워드한다. //public void doA(Model model){ public String doA(Model model){ logger.info("doA called...."); // 로그 출력 // model.addAttribute(key, value); // map과 같이 key, value구조로 되어있다. model.addAttribute("message", "홈페이지 방문을 환영합니다."); // 리턴타입이 void이면, 메서드가 종료된 후에 doA.jsp로 포워드 return "sample/doB"; // doB.jsp로 포워드 } @RequestMapping("sample/doB") // url pattern public void doB(){ logger.info("doB called...."); // 메서드가 종료된 후에 doB.jsp로 포워드 } // ModelAndView : Model - 데이터저장소, View화면 // 데이터와 포워드할 페이지의 정보 // forward : 주소변경X , 화면전환, 대량의 데이터 전달 // redirect : 주소변경O, 화면전환, 소량의 데이터 전달(get방식만 가능) @RequestMapping("sample/doC") // url pattern public ModelAndView doC(){ logger.info("doC called...."); // 메서드가 종료된 후에 doC.jsp로 포워드 // 맵에 객체를 저장 Map<String, Object> map = new HashMap<String, Object>(); map.put("product", new ProductVO("연필", 1000)); // new ModelAndView("view의 이름", "map변수명", 맵); return new ModelAndView("sample/doC", "map", map); } @RequestMapping("sample/doD") public String doD(){ // redirect의 경우, return type을 String으로 설정 // doE.jsp로 리다이렉트 return "redirect:/sample/doE"; //return "sample/doE"; // 포워드 } @RequestMapping("sample/doE") public void doE(){ //doE.jsp로 포워드 } } | cs |
DTO(VO)
package com.example.spring01.sample; public class ProductVO { private String productName; private double productPrice; // Constructor public ProductVO(String productName, double productPrice) { super(); this.productName = productName; this.productPrice = productPrice; } // Getter/Setter public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public double getProductPrice() { return productPrice; } public void setProductPrice(double productPrice) { this.productPrice = productPrice; } // toString() @Override public String toString() { return "ProductVO [productName=" + productName + ", productPrice=" + productPrice + "]"; } } | cs |
View
home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>컨트롤러 호출 연습페이지</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <% // 컨텍스트 메서드 호출 String path = request.getContextPath(); %> <script> // json의 형식 // {변수명: 값, 변수명: 값} // {name: "냉장고", price: 990000} function doF(){ $.ajax({ type: "post", url: "<%=path%>/sample/doF", success: function(result){ console.log(result); $("#result").html("상품명 : "+result.productName+", 가격 : "+result.productPrice); } }); } </script> <body> <h2>컨트롤러 호출 연습 페이지</h2> <a href="<%=path%>/sample/doA">doA</a> : model <br> <a href="<%=path%>/sample/doB">doB</a> : 단순호출<br> <a href="<%=path%>/sample/doC">doC</a> : modelAndView <br> <a href="<%=path%>/sample/doD">doD</a> : redirect <br> <!-- 1. doF()함수 호출 --> <a href="javascript:doF()">doF</a> : json<br> <!-- 2. 함수 호출 결과물 출력 --> <div id="result"></div> </body> </html> | cs |
Home.jsp 화면
프로젝트 실행 => 브라우저에 메인 페이지 출력
doA.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>doA 페이지</title> </head> <body> <h2>doA 페이지</h2> <h3>${message}</h3> </body> </html> | cs |
SampleController doA 메서드
@RequestMapping("sample/doA") public String doA(Model model){ logger.info("doA called...."); model.addAttribute("message", "홈페이지 방문을 환영합니다."); return "sample/doA"; } | cs |
doA링크 클릭후 화면
home.jsp에서 doA링크 클릭 => SampleController doA 메서드 호출 => doB.jsp로 포워드(model 리턴)
doB.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>doB 페이지</title> </head> <body> <h2>doB 페이지</h2> <h3>${message}</h3> </body> </html> | cs |
SampleController doB 메서드
@RequestMapping("sample/doB") public void doB(){ logger.info("doB called...."); } | cs |
doB링크 클릭후 화면
home.jsp에서 doB링크 클릭 => SampleController doB 메서드 호출 => doB.jsp로 포워드
doC.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>doC페이지</title> </head> <body> 상품명 : ${map.product.productName}<br> 가격 : ${map.product.productPrice} </body> </html> | cs |
SampleController doC 메서드
@RequestMapping("sample/doC") public ModelAndView doC(){ logger.info("doC called...."); Map<String, Object> map = new HashMap<String, Object>(); map.put("product", new ProductVO("연필", 1000)); return new ModelAndView("sample/doC", "map", map); } | cs |
doC링크 클릭후 화면
home.jsp에서 doC링크 클릭 => SampleController doC 메서드 호출 => doC.jsp로 포워드(ModelAndView 리턴)
doE.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>doE 페이지</title> </head> <body> <h2>doE 페이지</h2> </body> </html> | cs |
SampleController doD/doF 메서드
@RequestMapping("sample/doD") public String doD(){ return "redirect:/sample/doE"; } @RequestMapping("sample/doE") public void doE(){ } | cs |
doD링크 클릭후 화면
home.jsp에서 doE링크 클릭 => SampleController doE 메서드 호출 => doE로 리다이렉트
=> SampleController doE메서드 호출 => doE.jsp로 포워드
RestController ajax, json
Sample2Controller
package com.example.spring01.sample; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; // ajax 처리 전용 컨트롤러(백그라운드 실행) @RestController // 스프링 4.0이상부터 사용가능 public class Sample2Controller { //@ResponseBody : json형식으로 데이터를 리턴 @ResponseBody @RequestMapping("sample/doF") public ProductVO doF(){ // doF.jsp로 json 데이터가 리턴 return new ProductVO("스마트폰", 990000); } } | cs |
home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>컨트롤러 호출 연습페이지</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <% // 컨텍스트 메서드 호출 String path = request.getContextPath(); %> <script> // json의 형식 // {변수명: 값, 변수명: 값} // {name: "냉장고", price: 990000} function doF(){ $.ajax({ type: "post", url: "<%=path%>/sample/doF", success: function(result){ console.log(result); $("#result").html("상품명 : "+result.productName+", 가격 : "+result.productPrice); } }); } </script> <body> <h2>컨트롤러 호출 연습 페이지</h2> <a href="<%=path%>/sample/doA">doA</a> : model <br> <a href="<%=path%>/sample/doB">doB</a> : 단순호출<br> <a href="<%=path%>/sample/doC">doC</a> : modelAndView <br> <a href="<%=path%>/sample/doD">doD</a> : redirect <br> <!-- 1. doF()함수 호출 --> <a href="javascript:doF()">doF</a> : json<br> <!-- 2. 함수 호출 결과물 출력 --> <div id="result"></div> </body> </html> | cs |
doF 링크 클릭후 화면과 콘솔
home.jsp doF링크 클릭 => Sample2Controller doF메서드 호출 => ProductVO 타입의 json 데이터 객체 리턴
=> div에 출력