//인스턴스 생성,클라이언트와 데이터 입출력을 제어하는 클래스에 적용.
@Controller
public class TestController {
//클라이언트의 요청을 처리할 메소드를 지정하는 @. 내부적으로는 HttpServletRequest
@RequestMapping("test1")
public ModelAndView abc() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("list");
modelAndView.addObject("msg","스프링만세")
//HttpServletRequest request = new HttpServletRequest();
//request.setAttribude("msg","스프링만세");
return modelAndView;
//보낼 요청이 한개라면 아래의 한줄로 위를 전부 지우고 축약가능. forwarding
return new ModelAndView("list","msg","스프링만세");
}
}
여기서 Controller가 list.jsp파일을 호출했다.(Contorller~Dispatcher..)
요청받은 dispatcherServlet은 다시 View를 통해 클라이언트로 jsp페이지를 표시한다.
ModelAndView
: 모델을 수행한 결과값을 저장
요청 하기로 한 list.jsp를 EL로 출력해보자.
<body>
결과는 ${msg }<br/>
<!-- req 생략 -->
결과는 ${requestScope.msg }
</body>
index는 클라이언트 측의 요청URL(test1,2,3....) 이는 컨트롤러의 Mapping된 이름과 매칭될 예정. 요청명을 DispatcherServlet에게 준다
DispatcherServlet가 요청명을 컨트롤러에게 넘긴다.
TestController
컨트롤러에서는 모델을 수행한 결과값과 보여질 뷰파일 정보(jsp)을 저장하는 ModelAndView
객체를 지원한다.
그 객체에 어떠한 모델의 결과값을 어떠한 뷰에 뿌려질지 담아야하고, 위 예제에서는 모델값을 문자열로 넣었고 뷰정보는 list.jsp로 설정했다.
그 저장된 ModelAndView
객체는 다시 DispatcherServlet에게 넘어가고, DispatcherServlet는 뷰파일을 확인 후 결과를 출력한다.
prefix/surfix의 정보를 합쳐 웹에서 실행한다.
server.port=80
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
//매핑명 여러가지
@RequestMapping(value={"test2","kbs","mbc/sbs"},method=RequestMethod.GET)
public ModelAndView abc2() {
//원래는 모델측의 결과 반환값이 담김
return new ModelAndView("list","msg","스프링만세2222");
}
@GetMapping("test3")
public ModelAndView abc3() {
//(뷰선택,컨트롤러의 처리결과 정보)
return new ModelAndView("list","msg","스프링만세3333");
}
//GetMapping일땐 ModelAndView 사용을 하지 않았다. String return
@GetMapping("test4")
public String abc4(Model model) {
model.addAttribute("msg","스프링만세4444");
return "list";
}
@RequestMapping(value="test6",method=RequestMethod.POST)
public ModelAndView abc6() {
return new ModelAndView("list","msg","post만세6");
}
@RequestMapping(value="test7",method=RequestMethod.POST)
public String abc7(Model model) {
model.addAttribute("msg","post만세74444");
return "list";
}
@GetMapping("test8")
@ResponseBody //리턴값이 그대로 반환됨
public String abc8() {
String value = "실제로는 모델을 다녀온 결과를 반환.javaObject: String, Map, JSON ...";
return value;
}
@RequestBody
이 어노테이션이 붙은 파라미터에는 http요청의 본문(body)이 그대로 전달된다.
일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일이 없을 것이다.
반면에 xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다.
HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다.
@GetMapping("test8_1")
@ResponseBody //리턴값이 그대로 반환됨
public DataDto abc8_1() {
DataDto dto = new DataDto();
dto.setCode(10);
dto.setName("허균");
return dto;
}
//jackson library에 의해 json형태로 출력
@Controller
@RequestMapping("test9")
public class TestController2 {
@RequestMapping(method=RequestMethod.GET)
public String def(Model model) {
model.addAttribute("msg","success get");
return "list";
}
@RequestMapping(method=RequestMethod.POST)
public String def2(Model model) {
model.addAttribute("msg","success get");
return "list";
}
}