action실행과 pages.xml의 navigation실행 타이밍에 대해서

아래와 같이 NavigationHandler를 수정(로그출력)하여 테스트용 war에 넣어두었다.

로그를 확인해보면 모든 action이 실행된후에 handleNavigation가 호출됨을 알 수 있다.

11:35:01,962 INFO [ UniIDPhaseListener: 20] [/] phase> INVOKE_APPLICATION 5 begin
11:35:01,965 INFO [ Test3Bean: 26] [/] 액션이 실행되었습니다!
11:35:01,965 INFO [ SeamNavigationHandler: 33] [/] handleNavigation(/outcome_test.xhtml) => fromAction:[#{test3Bean.sendOutcome(‘render’)}], outcome:[render]
11:35:01,970 INFO [ SeamNavigationHandler: 47] [/] handleNavigation(/outcome_result.xhtml)
11:35:01,971 INFO [ UniIDPhaseListener: 25] [/] phase> INVOKE_APPLICATION 5 end
11:35:01,972 INFO [ webapp: 99] [/] —
11:35:01,977 INFO [ SeamNavigationHandler: 33] [2/0] handleNavigation(/outcome_result.xhtml) => fromAction:[#{conversationMDCHandler.setCIDtoMDC}], outcome:[null]
11:35:01,978 INFO [ SeamNavigationHandler: 47] [2/0] handleNavigation(/outcome_result.xhtml)
11:35:01,981 INFO [ Test3Bean: 22] [2/0] ‘outcome_result’ => called from pages.xml (INVOKE_APPLICATION 5), viewid=/outcome_result.xhtml
11:35:01,982 INFO [ SeamNavigationHandler: 33] [2/0] handleNavigation(/outcome_result.xhtml) => fromAction:[#{test3Bean.log(‘outcome_result’)}], outcome:[null]
11:35:01,985 INFO [ SeamNavigationHandler: 47] [2/0] handleNavigation(/outcome_result.xhtml)
11:35:01,987 INFO [ UniIDPhaseListener: 20] [2/0] phase> RENDER_RESPONSE 6 begin
11:35:01,997 INFO [ UniIDPhaseListener: 25] [2/0] phase> RENDER_RESPONSE 6 end

테스트 결과를 정리하면 아래와 같다.

1. submit(postback)시의 h:commandButton 이나 s:link(actionMethod파라미터)로 실행하면 INVOKE_APPLICATION이 실행되는데 이때 pages.xml의 navigation이 실시되며 그에 따른 viewId가 바뀐다.
이때 redirect라면 바로 redirect를 실시한다.(responseCompleted)

2. render의 경우는 단순히 viewId만 바뀌게 되므로 다음으로 RENDER_RESPONSE phase가 실행이 된다.
이때 1번에서 바뀐 viewId를 참조하게 되며 pages.xml에 정의된 action태그들도 전부 실행이 되고 당연히 outcome도 가져온다.
outcome에 의한 새로운viewId과 현재의 viewId가 다르면 handleNavigation은 종료되지만 새로운 viewId로 다시 pages.xml를 참조하지는 않는다. (이부분에 주의! 따라서 무한루프에 빠지지 않음.)

이상의 결과를 보면 postback에 의한 outcome으로 일단 viewId가 바뀌는데 이걸 render로 표시한다면 RENDER_RESPONSE에서 다시 1번 pages.xml이 참조되게 된다.
즉, 최대 2번의 pages.xml에 정의된 viewId를 참조하여 action을 실행하는 경우가 있는것이다.

ps. fromAction및outcome값은 action실행시마다 값이 설정된다. void메소드의 경우 outcome=null이 됨.

This entry was posted in Java, JBoss. Bookmark the permalink.