스프링이 기본적으로 제공하는 HandlerMappingHandlerInterceptor를 이용해서 컨트롤러가 요청을 처리하기 전과 처리한 후에 알맞은 기능을 수핼할 수 있도록 하고 있다.

조건에 다라 컨트롤러에 요청을 전달하고 싶지 않거나, 컨트롤러가 요청을 처리한후에 ModelAndView 객체를 조작하고 싶은 경우에 사용된다.

HandlerInterceptor 인터페이스는 
요청처리전(preHandle), 요청처리후(postHandle), 요청처리하고 클라이언트에 응답전송한 뒤( afterCompletion ) .. 3군데이다.
순서대로...

ㄱ. boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)
handler 에는 컨트롤러 객체가 전달됨
한개 이상의 HandlerInterceptor가 체인을 형성하는데 preHandle 에서 false 를 리턴하면 다음 HandlerInterceptor또는 컨트롤러를 실행하지 않고,
요청 처리를 종료한다.

ㄴ. void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView)
컨트롤러가 요청을 처리한 뒤에 호출된다.
HandlerInterceptor체인에서 postHandle() 메소드는 preHandle 메소드의 살향순서를 반대로 해서 실행된다.
컨트롤러 실행 도중에 예외가 발생할 경우 실행되지 않는다.

 
ㄷ. afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler,Exception ex)
클라이언트의 요청을 처리한뒤, 즉, 뷰를 통해서 클라이언트에 응답을 전송한 뒤에 실행된다.
만약 컨트롤러가 처리중... 뷰처리중.. 에러가 나면..예외가 생기더라도 실행된다!!!
실행순서는 preHandle() 메소드의 실행순서와 반대이다.


HandlerInterceptor 인터페이스를 직접 구현하여 클래스를 작성할수도 있다. 다만 그렇게 되면 모두 구현해야한다;
해서 그냥 HandlerInterceptorAdaptor 클래스를 상속받아 필요한것만 구현한다.


HandlerInterceptor 의 실행순서
뭐 예측대로 움직이는데...  설정은 제대로..


<bean 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
    <list>
             <ref bean="interceptor1"/> 
             <ref bean="interceptor2"/> 
             <ref bean="interceptor3"/> 
    </list>
</property>

 위의 경우 클라이언트 요청을 처리할때 실행되는 메소드의 실행순서는
preHandle() : 1,2,3
postHandle() : 3,2,1
afterHandle() :3,2,1


HandlerExceptionResolver 를 이용하면 서블리 컨텐이너가 생성한 에러페이지가 아닌 예외타입에 맞는 , 스프링 MVC와
연동된 뷰를 이용해서 에러페이지를 출력할 수 있게 된다.

.. 찾아봐라 ~_~

SimpleMappingExceptionResolver
예외 타입이름과 특정 뷰 이름을 매핑할때 사용된다.

<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">
error/mathException
</prop>
<prop key="java.lang.Exception">
error/exception
</prop>
</props>
</property>
</bean>

java.lang.ArithmeticException 익셉션이면 뷰로 error/mathException 뷰를 사용하게 된다.
 











 





 

'IT > 스프링' 카테고리의 다른 글

WebApplicationContext 직접접근?  (0) 2012.01.19
캐시옵션 설정  (0) 2012.01.19
파일 업로드 in spring... 3  (1) 2012.01.18
Validator / Error interface .... in Spring  (0) 2012.01.16
Ant 경로 패턴 in @RequestMapping  (0) 2012.01.16

+ Recent posts