- BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping은 빈 이름과 URL을 Mapping한다.
이러한 BeanNameUrlHandlerMapping의 정의는 다음과 같다.
<bean name="/test.do"
class="sample.web.controller.HelloworldController">
<property name="helloworldService" ref="helloworldService" />
</bean>
test.do로 들어온 요청을 받아 HelloworldController와 매핑한다. 이 HelloworldController는 helloworldService를 사용하고 있으며
이 역시 bean으로 정의되어 있어 web.xml의 context-param에서 정의한 경로에 따라 applicationContext-helloworldService.xml을 읽어 들일수 있다.
또한 빈 설정 파일에 HandlerMapping이 설정되어 있지 않을 경우 Spring MVC는 BeanNameUrlHandlerMapping을 default HandlerMapping으로 설정한다.
- SimpleUrlHandlerMapping
SimpleUrlHandleMapping은 매핑에 대한 정보를 각각의 Controller에서 설정하는 것이 아니라 하나의 저장소에서 관리하는 것이다.
사용자는 컨트롤러를 빈으로 정의해 주고 mappings 프로퍼티의 value값에 각각의 요청에 대한 컨트롤러 매핑만 지정해 주면 된다.
다음은 위의 BeanNameUrlHandlerMapping 예시를 SimpleUrlHandlerMapping을 이용해 나타낸 것이다.
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/test.do = helloworldController
</value>
</property>
</bean>
<bean id="helloworldController"
class="sample.web.controller.HelloworldController">
</bean>
또한 SimplerUrlHandlerMapping을 사용할 경우 매핑 정보를 빈 설정 파일이 아닌 별도의 파일에서 관리하는 것이 가능하다. 예는 다음과같다.
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location">
<value>/mapping.properties</value>
</property>
</bean>
</property>
</bean>
다음은 위에서 정의된 mapping.properties파일의 내용이다.
test.do = helloworldController
- Intercepting requests
handler mapping은 interceptor를 만들어 요청이 들어오기 전(preHandle), 들어온 후(postHandle), 완료된 후(afterCompletion)에 특정 작업을 추가할 수 있다.
예를 들어 로그인한 사용자에게만 보여주고 싶은 페이지가 있다면 매번 exception을 발생시켜 페이지를 이동시켜 주지 않아도 페이지 요청 처리 전에
interceptor를 preHandler정의 하면 mappings의 value로 지정되어있는 모든 요청에 대해 interceptor를 적용시킬 수 있다.
이러한 interceptor를 처리하기 위해서는 먼저 interceptor를 만들어 줘야 하는데 이는 HandlerInterceptorAdapter를 extends하여 interceptor를 발생시킬 시점에 따른
메소드를 오버라이딩 한다.

interceptor의 생성예는 다음과 같다.
public class UserLoginInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object hadler) throws Exception {
// TODO Auto-generated method stub
if(request.getSession().getAttribute("userId") != null)
return true;
else {
response.sendRedirect("login.jsp");
return false;
}
}
}
위의 예는 preHandle메소드를 오버라이딩 하여 요청이 들어오기 전에 위와같은 작업을 수행 하게되는것이다. session에 userId값이 존재할 경우 true를 리턴하고 요청을 처리하게 될 것이고,
userId값이 존재 하지 않는다면 login.jsp페이지를 출력하게 될것이다.
다음은 빈 설정파일에 interceptor를 설정한 예시이다.
<bean id="urlMapping1"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="userLoginInterceptor"/>
</list>
</property>
<!-- 여러개의 핸들러 매핑을 정의할 경우 같은 요청에 대한 우선순위를 "order" 프로퍼티를 사용해
정해줄 수 있다. 숫자가 작을수록 우선순위는 높다. -->
<property name="order"><value>2</value></property>
<property name="mappings">
<value>
/list.do=getUserListController
</value>
</property>
</bean>
<bean id="userLoginInterceptor" class="sample.services.UserLoginInterceptor" />
위와같은 설정으로 interceptor를 사용해 요청에 따른 interceptor를 정의해줄 수 있다.
| ViewResolver |
설명 |
| AbstractCachingViewResolver |
View 들을 cashing하는 기능 제공 |
| XmlViewResolver |
ViewResolver 의 구현체로 XML파일 사용(/WEB-INF/views.xml 을 기본 설정파일로 사용)
|
| ResourceBundleViewResolver |
ViewResolver 의 구현체로 리소스 파일 사용(views.properties 를 기본 리소스 파일로 사용)
|
| UrlBasedViewResolver |
ViewResolver 의 구현체로 특별한 맵핑 정보 없이 의미상 view 이름을 URL로 사용(View 이름과 실제 view 자원과의 이름이 같을 때 사용)
|
| InternalResourceViewResolver |
UrlBasedViewResolver 를 상속 받았으며 InternalResourceView(Servlet, JSP)를 사용
|
| VelocityViewResolver/FreeMarkerViewResolver
|
UrlBasedViewResolver 를 상속 받았으며 VelocityView 와 FreeMarkerView를 사용
|
사용하려는 기술에 따라 위와같은 View Resolver를 적절히 선택하여야한다.