2장 컴포넌트 식별자와 클라이언트 식별자

– UI 컴포넌트는 서버에서는 컴포넌트 트리로 살고 클라이언트쪽에서는 여러 형태의 뷰 표현체로 존재한다.
– 서버쪽에서는 컴포넌트 식별자로 컴포넌트를 참조한다.
– 클라이언트에서는 클라이언트 식별자를 사용해서 컴포넌트를 참조한다.
– 컴포넌트 식별자를 이용해서 클라이언트 식별자를 생성한다.
– 컴포넌트 식별자는 반드시 문자 또는 언더바(_)로 시작한다.
– 컴포넌트 식별자를 생략하면 JSF가 자동으로 만들어 준다.
– Naming container: 하위 컴포넌트들이 모두 유일한 식별자를 가지고 있는 컴포넌트.
– 예를 들어 HtmlDataTable, HtmlForm의 하위 컴포넌트트 식별자에는 이 컴포넌트의 식별자를 이용해서 클라이언트 식별자를 만든다.

2장 JSF 요청 처리 생명주기 – Phase 6. 응답 보여주기

Render Response

– 최종적으로 사용자에게 응답을 보낸다.
– 뷰 상태를 저장하여 ‘뷰 복원하기’ 단계에서 재사용할 수 있게 한다.
– 특정 뷰 기술에 종속적이지 않다.
– 컨트롤러의 인코딩 메서드 결과만을 뷰에서 사용할 수 있다.
– 컨트롤러의 인코딩 메서드 결과를 마크업을 만드는 애플리케이션에서 통합할 수 있다.
– 컨트롤러의 인코딩 메서드 결과를 정적인 템플릿에 통합할 수 있다.
– 컨트롤러의 디코딩 메서드 결과를 JSP 같은 동적 리소스에 통합할 수 있다.
– 각각의 컨트롤러 인코딩 과정 중에 변환기(Conveter)를 사용하여 컴포넌트의 값을 문자열로 변환한다.
– 이 단계가 JSF 요청 처리 생명주기의 마지막 단계다.

2장 JSF 요청 처리 생명주기 – Phase 5. 애플리케이션 호출하기

Invoke Application

– 이 단계에서 등록되어 있는 리스너로 이벤트를 전파한다.
– ‘요청값 적용하기’ 단계에서 만든 액션 이벤트를 여기서 전파한다.
– 컴포넌트에 등록된 액션 리스너 EL을 평가하여 백빈의 특정 메서드(액션 리스너 메서드)를 실행한다.
– 액션 리스너 메서드는 컴포넌트의 actionListener 속성으로 설정한다.
– 액션 리스너 메서드 실행이 끝나면 모든 컴포넌트에 자동으로 등록되는 기본 리스너를 실행한다.
– 기본 리스너는 컴포넌트에 등록되어 있는 액션 메서드를 호출한 뒤 해당 메서드의 논리적인 이름을 통해 랜더링할 뷰를 찾는다.
– 액션 메서드는 컴포넌트의 action 속성을 설정한다.
– 액션 메서드가 없는 경우 기본 액션 리스너가 현재뷰를 랜더링 한다.
– 액션 리스너 메서드나, 액션 메서드에서는 직접 응답을 랜더링 할 수도 있고, 애플리케이션 메시지를 추가할 수도 있고, 이벤트를 만들 수도 있고, 애플리케이션 로직을 실행할 수도 있고, 그냥 뷰 랜더링 단계로 건너뛸 수도 있다.
– 모든 리스너 실행이 끝나면 뷰를 랜더링 할 준비가 된 것이다.

2장 JSF 요청 처리 생명주기 – Phase 4. 모델 값 변경하기

Update Model Values

– JSF EL 표현식을 통해서 모델 또는 백빈의 속성 값을 설정한다.
<h:inputText id=”helloInput” value=”#{helloBean.numControls}” 
             required=”true”> 
… 
</h:inputText> 
1. helloBean이라는 키를 가지고 있는 빈을 찾아온다.
2. helloBean의 numControls 속성에 값을 해당 컴포넌트의 로컬 값으로 설정한다.
– 이 단계가 끝나면 관련 리스너에 이벤트를 보내고, 여태까지 그랬던것처럼 리스너에서는 응답을 직접 출력하거나  Render Response 단계로 건너뛸수도 있다.

2장 JSF 요청 처리 생명주기 – Phase 3. 검증하기

Process Validation

– 이 단계에서 JSF는 컴포넌트 트리를 순회하면서 각각의 컴포넌트에게 자신의 값을 수용할 수 있는지 확인하도록 요청한다.
– ‘요청 값 적용하기’ 단계에서 입력 컴포넌트들이 갱신되기 때문에 이 단게에서는 사용자가 입력한 최신값을 가지고 있다.
– 검증을 하기전에 변환기에 의해 값이 변환된다.
– 변환기와 검증기를 무사히 거치고 나면 해당 값을 서브밋하고 다음 단계로 넘어간다.
– 그렇치 않은 경우 ‘응답 보여주기’ 단계로 넘어간다.
<h:inputText id=”helloInput” value=”#{helloBean.numControls}” 
             required=”true”> 
<f:validateLongRange minimum=”1″ maximum=”500″/> 
</h:inputText> 
1. required 속성이 true가 입력한 값이 있는지 검사한다.
2. 컨버터가 입력한 값을 int로 바꾼다.
3. validateLongRange 검증기가 값의 범위를 검증한다.
– submitted value가 변환과 검증이 끝나면 그 값을 기반으로 로컬 값을 세팅하는데 이때 value change event가 발생하고 그에 따른 적절한 리스너가 실행된다. 이 리스너들에 의해 직접 응답을 출력하거나 Render Repsponse 단계로 넘어갈 수 있다.
– 모든 submitted value가 유효하다면 다음 단계로 넘어간다.