230313 Spring boot MVC

kangjuju·2023년 3월 13일
0

Spring

목록 보기
5/13
post-thumbnail

Mapping실습

  • model측은 사용되지 않은 예제들이다.

HandlerMapping ~ Controller

  • 해당 코드는 HandlerMapping ~ Controller에 해당하는 코드이다.
//인스턴스 생성,클라이언트와 데이터 입출력을 제어하는 클래스에 적용.
@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","스프링만세"); 
	}
}
  1. 여기서 Controller가 list.jsp파일을 호출했다.(Contorller~Dispatcher..)

  2. 요청받은 dispatcherServlet은 다시 View를 통해 클라이언트로 jsp페이지를 표시한다.

ModelAndView : 모델을 수행한 결과값을 저장

요청 하기로 한 list.jsp를 EL로 출력해보자.

<body>
결과는 ${msg }<br/>
<!-- req 생략 -->
결과는 ${requestScope.msg } 
</body>

  1. index는 클라이언트 측의 요청URL(test1,2,3....) 이는 컨트롤러의 Mapping된 이름과 매칭될 예정. 요청명을 DispatcherServlet에게 준다

  2. DispatcherServlet가 요청명을 컨트롤러에게 넘긴다.
    TestController 컨트롤러에서는 모델을 수행한 결과값과 보여질 뷰파일 정보(jsp)을 저장하는 ModelAndView 객체를 지원한다.

  3. 그 객체에 어떠한 모델의 결과값을 어떠한 뷰에 뿌려질지 담아야하고, 위 예제에서는 모델값을 문자열로 넣었고 뷰정보는 list.jsp로 설정했다.

  4. 그 저장된 ModelAndView 객체는 다시 DispatcherServlet에게 넘어가고, DispatcherServlet는 뷰파일을 확인 후 결과를 출력한다.

  5. prefix/surfix의 정보를 합쳐 웹에서 실행한다.

server.port=80
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

controller의 여러 표현법

	//매핑명 여러가지
	@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 (객체 반환)

@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형태로 출력

클래스 Mapping (GET / POST)

  • 해당 예제에서는 GET / POST 두가지 방법에 차이를 두었다.
  • 요청이 get일땐 위, Post일땐 아래의 메소드를 자동으로 인식하여 실행됨.
@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";
	}
}

0개의 댓글