필터 디스패처는 인터셉터, 액션, 액션 실행 후 반환되는 리절트 코드 값과 매핑된 리절트를 실행하는 액션 프록시를 실행한다. 


필터 디스패처는 ActionMapper가 유효성 검사 후에 넘어온 액션실행을 위해서


1. serviceAction() 메소드가  ActionProxy 클래스의 execute() 메소드를 실행 시킨다.


2. 프록시는 Configuration Manager(Struts.xml) 의 설정 정보를 가져온후, 


3. 프록시 execute() 메소드는 ActionInvocation 클래스인 DefaultActionInvocation 클래스의 invoke() 메소드를 수행 시킨다.


     invoke() 메소드를 수행하면서 프록시는 DefaultActionInvocation 클래스에게 ActionContext 를 넘겨준다


액션 인보케이션은 인터셉터 스택 중 실행할 다음 인터셉터가 있다면, 그 인터셉터의 intercept() 메소드를 호출한다.


호출 하면서 인자로 ActionInvocation 자신을 넘긴다. Interceptor.Intercept(this);


intercept()메소드는 파라미터로 넘어온 인보케이션의 invoke() 메소드를 다시 호출하며, 체인이 형성된다.

결국 같은 액션 인보케이션의 invoke() 메소드를 반복하여 더이상 인터셉트가 없을때까지, 재귀호출된다.


더이상 호출할 인터셉터가 없다면, invoke() 메소드는 해당 액션을 실행한다음 리절트를 실행한다.


실행후 리턴되면, 자신을 호출했던 인터셉트로 반환되면서, 해당 인터셉트의 남은 후처리 작업을 수행후 리턴한다.


다시 invoke() 로 리턴되면 액션을 수행했기 때문에 그냥 리턴되어서 자신이 호출한 인터셉트로 리턴되고,
인터셉트는 후처리작업후


다시 invoke() 로 리턴되면서 맨처음으로 돌아가게된다. 


끝까지 콜백된 메소드는 httpServletResponse를 통해서 돌아 나간다.


아래는 DefaultActionInvocation 클래스의 invoke() 메소드 코드다.



public String invoke() throws Exception {

	
	if(executed) {

		throw new IllegalStateException("Action has already executed");

	} // if end;

	
	if(interceptors.hasNext()){
		
		InterceptorMapping interceptor 
		= (InterceptorMapping) interceptors.next();
		
		resultCode =
			
			// 여기에서 인터셉트를 호출하면서 자신이 인자로 들어간다.
			interceptor.getInterceptor().intercept(this);
		
	}else{
		
		// 더이상 실행할 인터셉트가 없기 때문에, 액션을 실행한다.
		resultCode = invokActionOnly();
		
	} // end if;
	
	
	
	if( !executed) {
		
		//......................
		
		
		if(proxy.getExecuteResult()) {
			
			// 리절트를 실행한다.
			executeResult();
			
		}
		
		
		executed = true;
		
	} // end if;
	
	return resultCode;

}

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST