기본 프로젝트 설정
DispatcherServlet, View Resolver
톰캣실행하면 요청이 들어오면 dispatcherServlet이 알아서 스프링 컨테이너를 자동 구동해주는 클래스다.
요청에 대한 handler, controller 를 전달하는 역할 (frontController)
위의 역할을 해준다. 디스패처로 설정하면 위에 코드 안적어줘도 됨
/mvc/a
라고 요청이 들어오면 < url-pattern>와 매핑되어있는 servlet-name을 찾고 servlet-name의 class를 찾아서 클래스의 객체가 존재하는지 확인함. 없으면 만들고 param-name, value로 xml파일을 읽어서 스프링 컨테이너를 구동함
<load-on-startup>1</load-on-startup> <!-- 톰캣이 켜지자마자 dispatcherServlet의 객체를 미리 만들어 두는 것 -->
db와는 어떻게 연결하고 dao와는 어떻게 service하고 어떻게 연결할지만 들어가있음
-> web에 관한 설정(controller)이 더 필요하다.
TestController 예제
-> view resolver가 없으면 뜨는 에러
-> xml에 view resolver를 추가해준다.
-> 같은 변수로 여러개의 데이터 받아오기
-> 리스트도 포문형태 동일!! String[] strArr
-> List<String> strArr
로만 변경해주면 됨
dispatcherServlet의 작동 방법
1) /mvc/a로 요청하면 일단 servlet으로 설정된 dispatcherServlet이 받음 -> HandlerMapping으로 보냄. dispatcherServlet은 보내고 아무일도 안함 (거의 일을 시키는애)
2) HandlerMapping이 요청을 받아서 해당 url에 해당하는 컨트롤러용 메서드를 찾아냄 (요청용 컨트롤러 메서드 찾기), 요구되는 매개변수가 있을 경우(url뒤에 ?로 받아온 데이터) 요청을 받아낸 핸들러 매핑이 전달이 잘 될 수 있도록 requstParam으로 해당하는 요청 전달 데이터를 변수에 자동연결시켜주고 메서드 호출.
3) dispatcherServlet에게 알려줌. 어떤 handler(controller)를 쓸지 찾아내고, 핸들러어답터의 도움을 받아서(일을맡김) 컨트롤러의 해당 메서드를 호출.
4) return되는 특정 값으로 view name으로 돌려주고 handlerAdapter가 다시 그 return값(String)을 받아옴.
5) dispatcherServlet가 viewResolver의 도움을 받아서 (suffix, prefix)를 붙여서 해당 view를 찾아냄. -> viewResolver가 jsp를 찾아냈다고 dispatcher에게 전달하고, dispatcher가 forwarding방법으로 이동 -> view가 응답
@ResponseBody
- 응답받은 문자열을 viewname - viewResolver-> view로 응답하는 시스템을 사용하지 않겠다.
- 회색부분을 거치지 않겠다는 의미. 5, 6, 7
-> json형태로 응답해줄 것
- json문자열로 응답을 '받'기 위해서는
@RequestBody
, 응답을 하기 위해서는(return)@ResponseBody
↳ application/json타입으로 json형태의 data를 보낼거다. 라고 설정했기 때문에 일반 String 전달데이터는 넣어서 보낼 데가 없음.- 요청을 할 때 요청 전달데이터만 보내거나 json만 보내거나 둘중 하나는 할 수 있지만, 둘이 합쳐서 요청 전달 데이터 & json 같이는 불가능.
↳ 절대 불가능.
↳ url뒤에 ? queryString으로 붙어서 이동하는 것은 가능, 하지만data : Json.stringify({})
로는 불가능하다.
↳ 일반 문자열도 보내려면 쿼리스트링으로 보내라~
↳ 이런얘길 하는 이유는 나중에 이미지 업로드할때 이미지와 글을 같이 올리고싶다~할때를 대비해서 한것. 그때는 form data이용해야 한다.