Seam가 사용하는 FacesServlet 소스

아무리 Seam Framework 라고 해도 역시 핵심적인 부분은 FacesServlet이다.
특히 Lifecycle관리부분…

h:commandButton 등으로 설정하는 action속성은 언제 실행될까?
HTML에서 submit버튼을 클릭하게 되면 해당 버튼의 id 및 ViewState를 보낸다.(RESTORE_VIEW)
이후 Lifecycle에 의해 INVOKE_APPLICATION 에서는 AjaxViewRoot인스턴스를 생성후에 해당 UIComponent를 찾아서 broadcast한다.

AjaxViewRoot.java에서 실제 호출하는 부분은 아래.

아래는 UICommand.java에서의 처리부분. (UICommand는 HtmlCommandButton의 슈퍼클래스)

참고로 Lifecycle에서 각각의 phase에서 실행되는 doPhase에 등록된 listener는 아래와 같다.
(sample.war작성하여 출력해본 결과)

listener.add> com.sun.faces.lifecycle.ELResolverInitPhaseListener
listener.add> com.sun.faces.renderkit.JsfJsResourcePhaseListener
listener.add> org.jboss.seam.debug.jsf.SeamDebugPhaseListener
listener.add> org.jboss.seam.jsf.SeamPhaseListener
listener.add> org.jboss.seam.document.DocumentStorePhaseListener
listener.add> org.ajax4jsf.event.AjaxPhaseListener
listener.add> org.ajax4jsf.event.InitPhaseListener
listener.add> org.richfaces.component.FileUploadPhaselistener

아래는 Seam과 JSF에서 가장 핵심적인 부분의 소스를 찾아보았다.

PhaseListener는 아래와 같은것들이 등록되어 있는데 이중에서 중요한것은 SeamPhaseListener이다.

13:53:40,494 INFO [ lifecycle: 80] [] listener.add> com.sun.faces.lifecycle.ELResolverInitPhaseListener
13:53:40,499 INFO [ lifecycle: 80] [] listener.add> com.sun.faces.renderkit.JsfJsResourcePhaseListener
13:53:40,509 INFO [ lifecycle: 80] [] listener.add> org.jboss.seam.debug.jsf.SeamDebugPhaseListener
13:53:40,517 INFO [ lifecycle: 80] [] listener.add> org.jboss.seam.jsf.SeamPhaseListener
13:53:40,522 INFO [ lifecycle: 80] [] listener.add> org.jboss.seam.document.DocumentStorePhaseListener
13:53:40,525 INFO [ lifecycle: 80] [] listener.add> org.ajax4jsf.event.AjaxPhaseListener
13:53:40,534 INFO [ lifecycle: 80] [] listener.add> org.ajax4jsf.event.InitPhaseListener
13:53:40,539 INFO [ lifecycle: 80] [] listener.add> org.richfaces.component.FileUploadPhaselistener