어플리케이션의 확장을 위해 model,view, controller 세가지 영역으로 분리
화면과 비즈니스 로직을 분리해서 작업 가능
영역별 개발로 인하여 확장성이 뛰어남
표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음
DispatcherServlet(Front Controller)
HandlerMapping
Controller
ModelAndView
ViewResolver
View
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
리스터 설정 후 최상위 context를 생성
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<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>
<!-- DispatcherServlet이 해당 mapping을 찾지 못할 경우 NoHandlerFoundException를 throw하게 설정 -->
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
@Controller
//@RequestMapping("/test")
public class HelloController {
// @RequestMapping(value = "/", method = RequestMethod.GET)
@GetMapping("/")
public ModelAndView index() {
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("name","박효빈");
return mav;
}
}
✏ 1번
@PostMapping("/parameter")
public String param(
@RequestParam(value = "userName", required = true) String name,
@RequestParam( value = "userAge", required = false, defaultValue ="25" ) String age,
@RequestParam("fruit") String[] fruits,
Model model
) {
String userInfo = name + "(" + age + ")";
model.addAttribute("userInfo" ,userInfo);
model.addAttribute("fruits", fruits);
return "param/result";
}
✏ 2번 Map, Model, ModelMap사용
@PostMapping("/paramdto")
public String param(HelloDto helloDto, Model model) {
model.addAttribute("result",helloDto);
return "param/result_dto";
}
✏ 3번 dto대신
@PostMapping("/paramdto")
public String param( @RequestParam Map<String, Object> map, Model model) {
model.addAttribute("result",map);
return "param/result_dto";
}
<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>
viewresolver: 논리적 view와 실제 jsp파일 mapping
@PostMapping("/write")
public String write(BoardDto boardDto, HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
logger.debug("write boardDto : {}", boardDto);
MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
boardDto.setUserId(memberDto.getUserId());
boardService.writeArticle(boardDto);
redirectAttributes.addAttribute("pgno", "1");
redirectAttributes.addAttribute("key", "");
redirectAttributes.addAttribute("word", "");
return "redirect:/article/list";
}
ReqeustToViewNameTranslator을 이용해 URL로 부터 view 이름 결정
view 이름에 "redirect:" 접두어를 붙임
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("name","박효빈");
+) @WebServlet("/")는 web.xml로 서블릿과 서블릿매핑을 대신함