DispatcherServlet(Front Controller)
HandlerMapping
Controller
ModelAndView
ViewResolver
View
구현 과정
Controller 작성 : Controller가 많은 일을 하지 않고 Service에 처리 위임.
web.xml
- DispatcherServlet 설정
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Processes application requests -->
<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>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
web.xml
- 최상위 Root ContextLoader 설정<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
context:component-scan
을 통해 자동 스캔 설정을 해주어야함.@Controller // Clinet 요청을 처리하기 위한 Annotation.
@RequestMapping("path") // 해당 주소로 전달이 되면 이 컨트롤러에서 처리.
public class TestController{
...
}
@Controller // Clinet 요청을 처리하기 위한 Annotation.
@RequestMapping("path") // 해당 주소로 전달이 되면 이 컨트롤러에서 처리.
public class TestController{
@RequestMapping(value = "path2", method=RequestMethod.GET)
public void test(){
...
}
@RequestMapping(value = "path2", method=RequestMethod.POST)
public void test2(){
...
}
}
parameter로 다양한 Object 설정 가능.
|Parameter Type|설명|
|-|-|
|HttpServletRequest
HttpServletResponse
HttpSession|필요시 Servlet API 사용 가능.|
|Java.util.Locale|현재 요청에 대한 Locale|
|InputStrema, Reader|요청 컨텐츠에 직접 접근할 때 사용|
|outputStream, Writer|응답 컨텐츠를 생성할 때 사용|
|@PathVariable annotation 적용 파라미터|URI 템플릿 변수에 접근할 때 사용|
|@RequestParam annotation 적용 파라미터|HTTP 요청 파라미터를 매핑|
|@RequestHeader annotation 적용 파라미터|HTTP 요청 헤더 매핑|
|@CookieValue annotation 적용 파라미터|HTTP 쿠키 매핑|
|@RequestBody annotation 적용 파라미터|HTTP 요청의 body 내용에 접근할 때 사용|
|Map, Model, ModelMap|view에 전달할 model data를 설정할 때 사용|
|커맨드 객체(DTO)|HTTP 요청 parameter를 저장한 객체
기본적으로 클래스 이름을 모델명으로 사용
@ModelAttribute annotation 설정으로 모델명을 설정할 수 있음.|
|Errors, BindingResult|HTTP 요청 파라미터를 커맨드 객체에 저장한 결과
커맨드 객체를 위한 파라미터 바로 다음에 위치|
|SessionStatus|폼 처리를 완료 했음을 처리하기 위해 사용
@SessionAttributes annotation을 명시한 session 속성을 제거하도록 이벤트 발생.|
RequestParam
value
: 키 값required
: 필수 여부defaultValue
: 기본값@Controller
public class Controller{
@GetMapping("/index")
public String home(@RequestParam("name") String name, Model model){
model.addAttribute("msg", name);
return "index";
}
@GetMapping("/index2")
public String home(@RequestParam(value="name", required=false) String name, Model model){
if(name != null) model.addAttribute("msg", name);
return "index";
}
@GetMapping("/index3")
public String home(TestDto testDto, Model model){
model.addAttribute("dto", testDto);
return "index";
}
}
ViewResolver
: 논리적 view와 실제 JSP 파일의 mapping<!-- servlet-context.xml -->
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
@Controller
public class Controller{
@GetMapping("/index1")
public ModelAndView hello1(){
ModelAndView mav = new ModelAndView("hello");
return mav;
}
@GetMapping("/index2")
public ModelAndView hello2(){
ModelAndView mav = new ModelAndView();
mav.setViewName("hello");
return mav;
}
@GetMapping("/index3")
public ModelAndView hello3(){
return "hello";
}
}
@Controller
public class Controller{
@GetMapping("/index")
public ModelAndView hello1(){
Map<String, Object> model = new HashMap<String, Object>();
return model;
}
}
redirect:
접두어를 붙여 redirect 사용 가능.@Controller
public class Controller{
@GetMapping("/index")
public ModelAndView hello1(){
return "redirect:index";
}
}
RESTful 방식
@PathVariable("변수명") 파라미터_타입 파라미터명