2-10 관심사의 분리와 MVC패턴 - 실습

서현우·2022년 5월 12일
0

스프링의정석

목록 보기
10/85

yoil.jsp

content타입, charset지정을 해야 한글이 안깨짐
EL로 Model에서 받은 값을 넣을 자리를 만듬

<!-- content타입, charset지정 -->
<%@ page contentType="text/html;charset=utf-8" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<!-- EL로 Model에서 받은 값을 넣을 자리를 만듬 -->
<P> ${year }년 ${month }월 ${day }일은 ${yoil }입니다.</P>
</body>
</html>

yoilError.jsp

유효성검사를 통과하지 못할 때

<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	잘못된 요청입니다. 년, 월, 일을 모두 올바르게 입력해주세요.  
</h1>
</body>
</html>

servlet-context.xml

Controller에서 반환하는 뷰의 이름에 접두사, 접미사 붙여주는 부분

<!-- 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>

yoilTellerMVC.java

Controller처리와 입력, 출력을 분리.
입력은 DispatcherServlet이 처리.
출력은 jsp로 처리.

컨트롤러 메서드의 반환타입
1. String : 뷰 이름을 반환
2. void : 맵핑된 url의 끝단어가 뷰 이름
3. ModelAndView : Model과 뷰 이름을 반환

package com.fastcampus.ch2;

import java.io.IOException;
import java.util.Calendar;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller 
public class YoilTellerMVC {
	@RequestMapping("/getYoilMVC") 
	//추가 1. 반환타입을 void로 하고, 뷰의 이름을 리턴하지않으면 맵핑된 URL에 의해 뷰의 이름이 결정됨.
	//추가 2. 반환타입을 ModelAndView로도 가능
	public String main(int year, int month, int day, Model model) throws IOException {
	
		//1. 유효성 검사
		if(!isValid(year, month, day))
			return "yoilError";
		
		//2. 요일 계산
		char yoil = getYoil(year, month, day);
		
		//3. 계산한 결과를 model에 저장
		model.addAttribute("year", year);
		model.addAttribute("day", day);
		model.addAttribute("month", month);
		model.addAttribute("yoil", yoil);
		
		return "yoil"; // /WEB-INF/views/yoil.jsp
		
	}

	private boolean isValid(int year, int month, int day) {
		// TODO Auto-generated method stub
		return true;
	}

	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month-1, day); //month는 0부터 시작
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 
		
        return " 일월화수목금토".charAt(dayOfWeek);
	}
}

ModelAndView

반환타입을 ModelAndView로 함.
ModelAndView객체를 Controller내부에서 생성해서
ModelAndView에 뷰의 이름과 작업한 결과를 저장해서 반환.

@RequestMapping("/getYoilMVC3")
public ModelAndView main(int year, int month, int day) throws IOException {

	//1. ModelAndView를 생성하고, 기본 뷰를 지정
	ModelAndView mv = new ModelAndView();
	mv.setViewName("yoilError"); //뷰의 이름을 지정
	
	//2. 유효성 검사
	if(!isValid(year, month, day)
		return mv;
	
	//3. 작업
	char yoil = getYoil(year, month, day);
	
	//4. ModelAndView에 작업한 결과를 저장
	mv.addObject("year", year);
	mv.addObject("month", month);
	mv.addObject("day", day);
	mv.addObject("yoil", yoil);
	
	//5. 작업 결과를 보여줄 뷰의 이름을 지정
	mv.setViewName("yoil);
	
	//6. ModelAndView를 반환
	return mv;
}
profile
안녕하세요!!

0개의 댓글