Seam Conversation 조사내용

<end-conversation before-redirect=”true” /> 보통은 before-redirect=false 상태인데, 이 경우는 HTTP 302를 응답할때 Conversation을 종료한다. before-redirect=true 로 하면 HTTP 302 응답할때는 아무것도 실시하지 않으며, HTTP 302로부터 브라우져가 다시 요청을 할때 Temporary Conversation 으로 강등이 된다. 따라서 Response를 반환하는 과정에서 Temporary Conversation은 소멸하게 된다. 좀 헷갈리기는 하지만 false(default) 경우에는 바로 파기하는것이며, true로 설정하면 리다이렉트후에 파기하게 된다. 그리고 이 설정은 redirect할 경우에만 유효하고 render 로 결과를 반환하는 경우는 아무런 의미가 없다.

종료한 과거 cid 를 첨부하면 어떻게 될까?

cid는 무시되고 Temporary Conversation 이 이용된다. 단, pages.xml 의 설정에서 conversation-required=”true” 로 정의된 viewId 를 호출하게 되면 에러가 된다.

ConversationEntry가 세션에 저장된 상태에서 cid를 삭제한후에 호출하면 어떻게 될까?

자동으로 cid를 복원해 주지는 않는다. 따라서 Temporary Conversation 이 이용된다.

pages.xml 내부 태그의 실행순서

               <page view-id="/sample.xhtml">
                 <action execute="#{sampleLogger.debug}" on-postback="true" /> ... ①
                 <begin-conversation /> ... ②
                 <action execute="/sampleResult.xhtml" /> ... ③
                 <navigation>
                 </navigation>
               </page>
위와 같이 정의가 되어있다고 할때, 실행순서는 2,1,3이 된다. 즉, 태그종류별로 우선 순위가 있다. 같은 태그일 경우에는 먼저 정의된 순서. begin-conversationやend-conversation ↓ action ↓ navigation

pages.xml 내부에 정의한 action 태그가 실행이 되고 안되고 한다?

예를들면 url을 입력하여 요청하면 action 태그가 실행이 되는데, 화면의 링크를 클릭하면 실행이 될때가 있고 안될때가 있다? 이 부분은 여러가지로 테스트를 해 보았는데 아래와 같다.
HTTP Request Lifecycle (Phase) 비고
URL직접 입력시 RESTORE_VIEW 1
RENDER_RESPONSE 6
INVOKE_APPLICATION 5 pages.xml의 action태그가 실행된다.
commandButton태그의 action으로 호출한 메소드의 리턴값이 void인 경우 RESTORE_VIEW 1
APPLY_REQUEST_VALUES 2
PROCESS_VALIDATIONS 3
UPDATE_MODEL_VALUES 4
INVOKE_APPLICATION 5 이 단계에서 h:commandButton 태그에서 지정한 action 이 실행되어 outcome으로 navigation 룰을 결정한다.
하지만 void 이므로 outcome=null
RENDER_RESPONSE 6
INVOKE_APPLICATION 5 pages.xml의 action태그가 실행된다.
commandButton태그의 action으로 호출한 메소드의 리턴값이 String인 경우
※outcome의 navigation룰이 redirect
RESTORE_VIEW 1
APPLY_REQUEST_VALUES 2
PROCESS_VALIDATIONS 3
UPDATE_MODEL_VALUES 4
INVOKE_APPLICATION 5 이 단계에서 h:commandButton 태그에서 지정한 action 이 실행되어 outcome으로 navigation 룰을 결정한다.
룰의 결과가 redirect 이므로 HTTP 302 발생.
HTTP 302 RESTORE_VIEW 1
RENDER_RESPONSE 6
INVOKE_APPLICATION 5 pages.xml의 action태그가 실행된다.
commandButton태그의 action으로 호출한 메소드의 리턴값이 String인 경우
※outcome의 navigation룰이 render
RESTORE_VIEW 1
APPLY_REQUEST_VALUES 2
PROCESS_VALIDATIONS 3
UPDATE_MODEL_VALUES 4
INVOKE_APPLICATION 5 이 단계에서 h:commandButton 태그에서 지정한 action 이 실행되어 outcome으로 navigation 룰을 결정한다.
룰의 결과가 render
RENDER_RESPONSE 6
INVOKE_APPLICATION 5 pages.xml의 action태그가 실행된다.
즉, HTTP 302 Redirect 가 발생하는 경우는 RENDER_RESPONSE 상태가 되지 않아서 pages.xml의 action태그는 실행이 되지 않는다.

Conversation을 여러개 이용할때 (nested conversation) 각각의 cid 에 인스턴스가 flush 되지 않는다?

보통 nested conversation 이 begin 될때는 이미 루트cid가 존재하는 상태이며 이시점에서는 이미 ThreadLocal<ConversationContext> 에는 루트cid가 갖고 있는 컴포넌트가 ThreadLocal에 소속되어 있다. 이때 nested conversation 을 개시하게 되면 cid가 새로운 번호로 생성된다. 하지만 이미 ThreadLocal에 소속된 Conversation scope의 컴포넌트 또한 참조가 가능하다. 즉, cid=2라고 했을때 cid=1의 Conversation scope의 컴포넌트가 참조가 되는 것이다. 그 이후에 생성되는 Conversation scope의 컴포넌트들만 cid=2 소속으로 세션에 저장되게 되는것에 주의하라. cid=1에도 cid=2에도 같은 인스턴스가 2개 들어가는 경우는 없다. 오직 인스턴스는 세션에 1개만 존재하며 이는 어딘가의 cid로 저장되어 있다.

같은 page내에 navigation을 중복해서 정의하면 어떻게 될까?

Caused by: java.lang.IllegalStateException: multiple catchall elements at org.jboss.seam.navigation.Pages.parseActionNavigation(Pages.java:1261) at org.jboss.seam.navigation.Pages.parse(Pages.java:991) at org.jboss.seam.navigation.Pages.parse(Pages.java:930) at org.jboss.seam.navigation.Pages.initialize(Pages.java:126) at org.jboss.seam.navigation.Pages.create(Pages.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) at org.jboss.seam.Component.callComponentMethod(Component.java:2275) at org.jboss.seam.Component.callCreateMethod(Component.java:2198) at org.jboss.seam.Component.newInstance(Component.java:2158) … 74 more
위와 같은 에러가 발생한다. ]]>

Related Posts