KyungHwan's etc.

스프링프레임워크 - 디스패처(Dispatcher)가 뷰(View)를 찾는 방법 본문

Java/스프링프레임워크

스프링프레임워크 - 디스패처(Dispatcher)가 뷰(View)를 찾는 방법

KyungHwan_0 2018. 6. 21. 10:29

디스패처(Dispatcher)가 뷰(View)를 찾는 방법

Spring MVC 기초

스프링의 흐름은 위와 같다.

client가 요청을 한다.

DispatcherServlet 이 요청을 받는다.

DispatcherServlet이 Controller에게 요청을 하고, 응답을 받는다.(ModelAndView를 이용)

ViewResolver와 View(JSP)를 통해 사용자에게 페이지를 띄어준다.

(보통 제작 과정에서 Controller와 View 부분을 많이 건드리게 된다.)

디스패처(Dispatcher)가 뷰(View)를 찾는 방법

servlet-context.xml은 보통 빈 설정 내용들을 적게 된다.

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
   <resources mapping="/css/**" location="/resources/css/" />
   <resources mapping="/js/**" location="/resources/js/" />
   <resources mapping="/images/**" location="/resources/images/" />
   <resources mapping="/jsp/**" location="/resources/jsp/" />
   
<!-- 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>

<context:component-scan base-package="com.mvcboard.board"/>

servlet-context.xml파일에 들어가보면, prefix와 suffix가 있다.

prefix와 suffix를 정해주면, 디스패쳐는 알아서 view를 찾을 수 있다.

위의 경우는 /WEB-INF/views/ + 뷰의 이름 + .jsp

즉, /WEB-INF/views/ 디렉토리 안에 있는 뷰의 파일이라는것을 알려주는 것이다.

페이지 화면이 띄어지는 과정

DispatcherServlet은 web.xml에서 설정을 해준다.

    <!-- 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>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

servlet mapping의 url-pattern을 보면 / 으로 url이 설정되어 있다. 그래서, / 라는 url이 들어오면 디스패쳐가 가로챈다. 그럼 디스패처는 controller를 찾아야하는데, 어느 패키지에서 찾아야 하는지 모른다.

    
<context:component-scan base-package="com.mvcboard.board"/>

그렇기 때문에, servlet-context.xml의 context:component-scan에 의해서 컨트롤러의 패키지를 알려준다.

그러면 그 안의 파일들을 검색하기 시작한다.

@Controller를 만나면 그 클래스가 Controller라는 것으로 인식한다.

그리고 디스패처는

@Controller
public class HomeController {

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);

Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home"; //home.jsp를 찾아 화면에 띄어준다
}

@RequestMapping을 보고, (여기서는 /로 설정되어 있다.)

그 어노테이션이 붙어있는 메소드의 로직을 수행한다.

그리고 return값으로 view의 이름을 알려준다. 여기서는 home 이라고 되어 있으므로,

ViewResolver를 통해 /WEB-INF/views/ + home + .jsp /WEB-INF/views/home.jsp 를 찾아 화면에 띄어준다. 위와 같은 이유로

그래서 주소창에 context명을 쓰고 / 를 붙이면, (여기서는 board/)

위와 같은 페이지가 화면에 띄어진다.

Reference

http://hongku.tistory.com/115

Comments