문제

JSF에서 사용자 정의 구성 요소를 개발하는 것과 관련하여 이해하기 어려운 몇 가지 사항이 있습니다. 이러한 질문의 목적을 위해 모든 사용자 지정 컨트롤이 값 바인딩 / 표현식 (리터럴 바인딩이 아님)을 사용한다고 가정 할 수 있지만 이에 대한 설명에도 관심이 있습니다.

  1. 가치 바인딩의 값은 어디에서 설정합니까? 이것은 디코딩에서 발생해야합니까? 아니면 디코딩이 다른 작업을 수행 한 다음 encodeBegin에 값을 설정해야합니까?
  2. 값 바인딩에서 읽기-언제 값 바인딩에서 데이터를 읽거나 제출 된 값에서 데이터를 읽어 값 바인딩에 넣습니까?
  3. 이 모든 것과 관련하여 양식의 액션 리스너는 언제 호출 되나요? JSF 라이프 사이클 페이지는 모두 다양한 단계에서 발생하는 이벤트를 언급하지만 명령 버튼에 대한 간단한 리스너가 호출 될 때 완전히 명확하지 않습니다.

    몇 가지 조합을 시도했지만 항상 이벤트 수명주기에 대한 기본적인 오해로 인해 발생한다고 생각되는 버그를 찾기가 어렵습니다.

도움이 되었습니까?

해결책

요청을 보여주는 JSF 사양 에 꽤 좋은 다이어그램이 있습니다. 수명주기-이 내용을 이해하는 데 필수적입니다.

단계는 다음과 같습니다.

  • 보기 복원 . UIComponent 트리가 다시 작성됩니다.
  • 요청 값 적용 . 편집 가능한 구성 요소는 EditableValueHolder를 구현해야합니다. 이 단계에서는 구성 요소 트리를 살펴보고 processDecodes 메서드를 호출합니다. 구성 요소가 UIData와 같이 복잡한 것이 아니라면 자체 decode 메서드를 호출하는 것 외에는 많은 작업을 수행하지 않습니다. decode 메서드는 렌더러를 찾고 decode 메서드를 호출하여 자체를 인수로 전달하는 것 외에는 많은 작업을 수행하지 않습니다. 제출 된 값을 가져와 setSubmittedValue 를 통해 설정하는 것은 렌더러의 작업입니다.
  • 프로세스 유효성 검사 . 이 단계에서는 validate 를 호출하는 processValidators 를 호출합니다. validate 메소드는 제출 된 값을 가져 와서 모든 변환기로 변환하고 모든 유효성 검사기로 유효성을 검사하고 (데이터가 해당 테스트를 통과한다고 가정) setValue 를 호출합니다. 이것은 값을 지역 변수로 저장합니다. 이 지역 변수는 null이 아니지만 getValue 호출에 대한 값 바인딩의 값이 아니라 반환됩니다.
  • 모델 값 업데이트 . 이 단계에서는 processUpdates 를 호출합니다. 입력 구성 요소에서 이것은 ValueExpression 을 가져 오는 updateModel 을 호출하고이를 호출하여 모델에 값을 설정합니다.
  • 애플리케이션 호출 . 버튼 이벤트 리스너 등이 여기에서 호출됩니다 (메모리가 제공되는 경우 탐색과 마찬가지로).
  • 렌더 응답 . 트리는 렌더러를 통해 렌더링되고 상태가 저장됩니다.
  • 이러한 단계 중 하나라도 실패하면 (예 : 값이 유효하지 않음) 수명주기가 응답 렌더링으로 건너 뜁니다.
  • 대부분의 이러한 단계 후에 다양한 이벤트가 발생하여 적절하게 리스너를 호출 할 수 있습니다 (예 : 프로세스 유효성 검사 후 값 변경 리스너).

    일정의 다소 단순화 된 버전입니다. 자세한 내용은 사양을 참조하세요.

    당신이 왜 당신 만의 UIComponent를 작성하는지 의문이들 것입니다. 이것은 사소한 작업이 아니며 JSF 아키텍처에 대한 깊은 이해가 필요합니다. 사용자 지정 컨트롤이 필요한 경우 동등한 렌더러를 사용하여 기존 UIComponent (예 : HtmlInputText)를 확장하는 구체적인 컨트롤을 만드는 것이 좋습니다.

    오염이 문제가되지 않는다면 Apache MyFaces 형태의 오픈 소스 JSF 구현이 있습니다.

다른 팁

CommandButton 과 같은 작업 리스너는 최종 렌더 응답 응용 프로그램 호출 단계에서 호출됩니다.> 단계.이는 JSF 수명주기-그림 1 에 나와 있습니다. p>

<인용구>

내가 가진 유일한 프레임 워크 구성 요소 생성이있는 곳에서 사용 이와 같은 깊고 복잡한 과정입니다. 다른 웹 프레임 워크 없음 (.net 세계 여부에 관계없이) 이것을 너무 고통스럽게 만듭니다. 완전히 설명 할 수 없습니다.

JSF 뒤의 일부 디자인 결정은 목표를 고려할 때 조금 더 이해하기 시작합니다. JSF는 도구로 설계되었습니다. IDE를위한 많은 메타 데이터를 노출합니다. JSF는 웹 프레임 워크가 아닙니다. 웹 프레임 워크로 사용할 수있는 MVP 프레임 워크입니다. . JSF는 고도로 확장 가능하고 구성 가능합니다. 애플리케이션별로 구현의 90 %를 대체 할 수 있습니다.

원하는 모든 작업이 추가 HTML 컨트롤을 사용하기 만하면 대부분의 경우 작업이 더 복잡해집니다. <인용구>

구성 요소는 여러 입력 텍스트 (및 기타) 기본 구성 요소, btw.

JSP 포함 / 도구 기반 페이지 조각이 요구 사항을 충족하지 않는다고 가정합니다.

UIComponentELTag.createComponent 를 사용하여 UIPanel 기반으로 복합 컨트롤을 만들고 기존 구현에서 모든 자식을 만드는 것을 고려합니다. (JSP / taglibs를 사용하고 몇 가지 다른 추측을한다고 가정합니다.) 기존 UIPanel 렌더러가 작업을 수행하지 않은 경우 사용자 지정 렌더러를 원할 것입니다.하지만 렌더러는 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top