본문 바로가기

웹/spring

spring --8.MVC

 

A> spring mvc

   spring core 는 스프링의 핵심기능이다. 

   스프링 MVC 는 spring core + 여러 서브 프로젝트로 구성된다.

 

   스프링을 실행하는 존재는 

   ApplicationContext 와 WebApplicationContext 이다.

   동시에 상호 연동하여 실행된다.

 

 

B>스프링 MVC 의 기본 흐름

   스프링 MVC 에서는 스프링이 만들어주는 기본 객체가 있다.

   개발자는 화면과 Controller,Model 만 만들어주면 된다.

 

   dispatcherServlet이 request 를 받는다.

   그리고 handlerMapping 객체에게 넘긴다.

   handler가 결정이 되면 다시 dispatcherServlet에게 그 결과를 넘긴다.

   handler를 결정이 됬기 때문에 Adapter를 시켜

   핸들러인 controller 와 연결을 한다.

   controller 에서 수행을 하고 그 결과를 adpater 를 타고  dipatcherServlet 에 보낸다.

   dipatcherServlet는 결과를 viewResolver에 보내고, viewResolver 는 그 결과를 해석하여 

   보여줄 view 정보를 dispatcherServlet에게 다시 보낸다. 

   그럼 dispatcherServlet은 view 를 통해 화면을 출력한다.

 

C> Controller

 

1.Controller 에서 쓰이는 어노테이션

@Controller

--클래스 위에다 붙이며 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고

  그 인스턴스를 컨트롤러로 사용하겠다는 선언

 

@RequestMapping(" URI ")

--메서드 위에 붙이며 특정한 URI 에 대한 처리를

   해당 컨트롤러에 메서드가 처리하겠다는 선언

 

@GetMapping  , @PostMapping

-- 스프링 4.3 버전이후에는 @GetMapping  , @PostMapping을

   @RequestMapping 대신 사용할 수 있게 되었다.

   원래는 @RequestMapping(value="uri", method={RequestMethod.GET ,RequestMethod.POST} )

   이런식으로 사용했음

 

 

2. 특징

   get , post 방식, 다양한 타입의 파라미터 처리가 가능하다.

 

3.파라미터 수집

   파라미터를 setter로 자동 수집

   @RequestParam("클라이언트로 부터의 request로 날아온 파라미터 이름") 타입 매개변수 로도 쓸 수 있다.

    ----예시 

   public String method(@RequestParam("name") String name)

 

4.return의 결과

   String 리턴타입일때  return 한 문자열에 대한 jsp 파일로 이동

   이때 return에 "redirect:" 와 "forward:" 로 리다이렉트와 포워드를 

   제어할 수 있다.

 

   void 리턴타입인 메소드일때 RequestMapping 에 value 의 값을 가진 jsp로 이동

 

   HttpHeaders: 응답에 내용 없이 Http 헤더 메세지만 전달하는 용도

 

4-1. 라이브러리 추가 시

   객체 리턴타입인 메소드일때 JSON으로 데이터 만들고 반환

   jackson-databind 추가시 가능

   @ResponseBody 응답메세지에 객체 정보를 보내겠다는 뜻

----예시

1
2
3
4
5
6
7
8
9
10
11
@GetMapping("/ex06")
  public @ResponseBody SampleDTO ex06() {
    log.info("/ex06..........");
 
    SampleDTO dto = new SampleDTO();
    dto.setAge(10);
    dto.setName("홍길동");
 
    return dto;
  }
 
cs

 

   위의 코드에서는 SampleDTO 타입의 객체를 json 형식으로 

   응답하겠다는 뜻

 

   ResponseEntity 타입: response할때 http 헤더 정보와

                               내용을 가공하는 용도

                               header 에 속성 추가적인 데이터 전달시에 사용 

1
2
3
4
5
6
7
8
9
10
11
12
@GetMapping("/ex07")
    public ResponseEntity<String> ex07() {
        log.info("/ex07..........");
 
        // {"name": "실제데이터"}
        String message = "{\"name\": \"실제데이터\"}"; //응답할 내용
 
        HttpHeaders header = new HttpHeaders();
        header.add("Content-Type""application/json;charset=UTF-8");
 
        return new ResponseEntity<>(message , header, HttpStatus.OK);
    }
cs

D>web.xml

        웹 컨테이너의 설정 정보를 담고 있다.

        servlet-context, root-context 는 스프링에 대한 정보를 담고 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
    <!-- 컨테이너 정보를 저장하는 역할  -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- 처음으로 정보를 처리하는 역할을 정의 =DispatcherServlet 이 받는다. -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
        
<!-- 기본 url 매핑 정보-->
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
</web-app>
 
cs

 

 

E> Model

--데이터 전달자의 역할

model.addArrtibute(키,값) 으로 전달한다.

 

컨트롤러에서 파라미터로 받은 객체형 타입(기본 자료형 제외)

은 그냥 요청하는 화면으로 전달을 해준다.

기본 자료형을 객체를 통하지 않고 보내려면 Model을 사용해야 한다.

즉, 객체를 요청하는 jsp 페이지에 보내는 게 원칙인데 

기본 자료형이 오니 Model이라는 객체를 통해 보내준다는 것이다.

 

@ModelAttribute("키") 변수

컨트롤러의 메소드(@ModelAttribute(“page”) int page

예를 들어

 

public String ex(@ModelAttribute("page") int page) {  }

http://localhost:8080/sample/ex?page=1

로 전달하고자 하는 페이지에 Model 객체를 보내는 것이 가능하다.

 

F>RedirectAttribute

화면에 한번만 전달되는 파라미터를 처리

내부적으로 HttpSession 객체에 담아 한번만 사용되고 폐기된다.

rttr.addFlashAttribute(키,값)

 

예시

1
2
3
4
5
6
7
8
@PostMapping("/register")
    public String register(BoardVO board , RedirectAttributes rttr) {
        log.info("register: "+ board);
        service.register(board);
        rttr.addFlashAttribute("result",board.getBno());
        
        return "redirect:/board/list";
    }
cs

 

' > spring' 카테고리의 다른 글

spring --9. 파일 업로드  (0) 2021.02.22
spring --0. 설정  (0) 2021.02.22
spring --7. 로그  (0) 2021.02.19
spring --5 . 테스트  (0) 2021.02.19
Spring 3 -- AOP  (0) 2021.02.18