Dev/Spring

Spring2.5 MVC - AbstractController & BeanNameUrlHandlerMapping & 핸들러와 컨트롤러의 종류

창문닦이 2019. 4. 5. 17:54

스프링 MVC

스프링은 컨트롤러가 여러개 만들어진다. 종류가 여러개가 될 수 있다.

그 중 FrontController가 클라이언트의 요청에 따라 어느 컨트롤러에 매핑되어야 하는지 전달하는 역할을 한다.

세부 설명은 이전 포스팅을 참고하자 Spring - 개요 & 구성요소 & MVC패턴 https://wiper2019.tistory.com/121?category=786564



Spring MVC의 주요 구성 요소

구성요소

설명

DispatcherServlet

클라이언트의 요청을 전달받는다. Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴 한 결과 값을 View에 전달하여 알맞은 응답을 생성하도록 한다.

HandlerMapping

클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.

Controller

클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다.

ViewResolver

Commander의 처리 결과를 보여줄 View를 결정한다.

View

Commander의 처리 결과를 보여줄 응답을 생성한다.

① DispatcherServlet(FrontController 구현체)

web.xml에서 DispatcherServlet객체를 생성한다. 본적인 Spring 설정을 위한 web.xml은 아래와 같다. 스프링의 기본확장자도 action이다.

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

<listener>

② ViewResolver : dispatcher-servlet.xml에서 ViewResolver객체 생성

DispatherServlet은 뷰의 이름과 매칭되는 뷰(물리적 파일)를 찾기 위해 ViewResolver를 사용한다.

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"/>

<property name="suffix" value=".jsp"/>

</bean>


MVC 패턴 구현해보기 - AbstractController

AbstractController를 상속받은 클래스는 별도 기능을 제공하지 않는 컨트롤러로 요청 파라미터 처리등의 작업을 직접 구현해야 한다.
컨트롤러 역할 : 클라이언트의 요청을 받아, 프론트 컨트롤러에 진입, 컨트롤러는 요청에 대한 작업을 수행하고, View로 데이터를 전달한다.

1. 컨트롤러 클래스 생성
2. view의 요청경로 지정
3. 요청처리 메소드(로직)을 구현
4. 뷰 이름 리턴

1. 컨트롤러 클래스 생성

ModelAndView는 모델과 뷰를 함께 전달하는 기능을 제공한다. 컨트롤러의 처리결과를 보여줄 뷰와 뷰에서 출력할 모델을 지정한다.

package com.test;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.AbstractController;

public class TestController extends AbstractController {

@Override

protected ModelAndView handleRequestInternal(HttpServletRequest request,

HttpServletResponse arg1) throws Exception {

int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);

String msg= "";

if(hour>=6 && hour<=8)

msg = "아침이다. 일어나!";

else if(hour>8 && hour<=13)

msg = "지각!";

else if(hour>13 && hour<=14)

msg = "점심시간!";

else if(hour>14 && hour<=18)

msg = "오후에요!";

else

msg = "퇴근해요!";

request.setAttribute("message",msg);

// 경로 /test/view.jsp

//항상 경로를 작성할 때 /폴더명/페이지이름.jsp 에서 '/' 와 '.jsp'를 동일하게 작성한다.

//그러므로 View Resolver를 통해 prefix, suffix를 사용해서 생략할 수 있도록 설정하였다.

return new ModelAndView("test/view");//모델과 뷰를 한꺼번에 전달한다.test라는 폴더에 view.jsp 페이지

}

}


※ 컨트롤러의 종류 

컨트롤러

설명

Controller, AbstractController

별도 기능을 제공하지 않는 컨트롤러로 요청 파라미터 처리등의 작업을 직접 구현해야 한다.

AbstractCommandController

요청 파라미터를 객체에 저장해 주며, 파라미터 값 검증 기능을 제공 한다.

SimpleFormController

폼을 출력 하고 폼에 입력한 데이터를 처리할 때 사용된다.

AbstractWizardFormController

여러 페이지에 걸쳐서 데이터를 입력하는 경우 입력 폼의 흐름을 제어하고 입력한 데이터를 처리할 때 사용 한다.

UrlFilenameViewController, ParameterizableViewController

컨트롤러에서 어떤 기능도 수행하지 않고 단순히 클라이언트의 요청 뷰로 전달할 때 사용 된다.

MultiActionController

연관되거나 비슷한 로직을 수행하는 다수의 기능을 하나의 컨트롤러에서 구현할 때 사용된다.


 2. 뷰 페이지 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

${message }

</body>

</html>

 3. 컨트롤러 & 핸들러매핑 생성(BeanNameUrlHandlerMapping) 

프론트 컨트롤러와 핸들러매핑을 함께 작성하는 경우도 가능하다. dispatcher-servlet.xml이 하는 역할은 클라이언트의 요청이 오면 요청정보를 가지고 누구한테 보내야하는지 핸들러매핑에게 보낸다. 그 핸들러매핑의 종류는 4가지가 존재한다. dispatcher-servlet에 핸들러를 등록해보자.

BeanNameUrlHandlerMapping : 주소가 들어오면(클라이언트의 요청) 어디로 보내야하는지 다이렉트로 지정해준다. 직접적이다.


<!-- BeanNameUrlHandlerMapping -->

<bean id="beanNameUrlMapping"

class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<bean name="/test/msg.action" class="com.test.TestController"></bean>


※ 핸들러의 종류 

Handler

설명

BeanNameUrlHandlerMapping

요청 URI와 동일한 이름을 가진 Controller 빈을 매핑 한다.

SimpleUrlHandlerMapping

SimpleUrlHandlerMapping 패턴과 컨트롤러의 이름을 비교 URI가 패턴에 매칭될 때 지정한 컨트롤러를 사용 한다.

ControllerClassNameHanderMapping

URI와 매칭 되는 클래스 이름을 갖는 빈을 컨트롤러로 사용

DefaultAnnotationHanderMapping

DefaultAnnotationHanderMapping @RequestMapping 어노테이션을 어노테이션을 이용하여 요청을 처리할 컨트롤러를 구한다. DefaultAnnotationHanderMapping 클래스는 스프링 2.5 버전에 새롭게 추가된 HandlerMapping 구현 클래스 이다.


4. 실행 화면

현재시간에 따라 메세지가 뜨는 모습을 볼 수 있다.