[jsf-2] <ui : include>, 태그 파일, 복합 구성 요소 및 / 또는 사용자 지정 구성 요소를 언제 사용해야합니까?

최근 Facelets와 함께 JSF 2.0을 사용하기 시작했고 <ui:include>Facelets 1.x에서 제공하는 기존 및 기타 템플릿 기술을 알고있는 새로운 복합 구성 요소에 의아해했습니다 .

이러한 접근 방식의 차이점은 무엇입니까? 기능적으로 그들은 거의 같은 것을 제공하는 것 같습니다 : <ui:param>vs <cc:attribute>, <ui:insert>+ <ui:define>vs 태그 파일, 기존 템플릿의 재사용. 복합 구성 요소의 경우 구문 및 명확한 인터페이스 사양 외에 다른 것이 있습니까? 성능이 다를 수 있습니까?



답변

이러한 접근 방식의 차이점은 무엇입니까?

Facelet 템플릿

사용 Facelet는 (같이 템플릿 <ui:composition>, <ui:include>그리고 <ui:decorate>당신이 재사용 가능한 템플릿으로 메인 페이지 레이아웃 조각을 분할 할 경우). 예 : 머리글, 메뉴, 내용, 바닥 글 등

예 :

Facelet 태그 파일

코드 중복을 방지 / 최소화하기 위해 재사용 가능한 구성 요소 그룹을 갖고 싶다면 Facelet 태그 파일을 사용하십시오. 예 : 레이블 + 입력 + 메시지 구성 요소 그룹. 복합 구성 요소의 주요 차이점은 Facelet 태그 파일의 출력이 단일 항목을 나타내지 않으며 UIComponent일부 상황에서 복합 구성 요소가 충분하지 않은 경우 유일한 솔루션 일 수 있다는 것입니다. 일반적으로 관리 Bean 특성을 전달하는 <ui:include>하나 이상의 with <ui:param>(하드 코딩 된 값이 아님)를 갖는 것은 포함 파일이 태그 파일이 될 수 있다는 신호입니다.

예 :

복합 구성 요소

UIComponent순수한 XML을 사용하여 단일 책임으로 재사용 가능한 단일 사용자 정의를 작성하려는 경우 복합 컴포넌트를 사용하십시오 . 이러한 복합 구성 요소는 일반적으로 기존 구성 요소 및 / 또는 HTML의 무리로 구성되며 물리적으로 단일 구성 요소로 렌더링되며 단일 빈 속성에 바인딩되어야합니다. 예 나타내는 단일 요소 java.util.Date(3 개)에 의존하여 속성 <h:selectOneMenu>요소 또는 요소 결합 <p:fileUpload><p:imageCropper>하나에 <my:uploadAndCropImage>하나의 정의를 참조 com.example.Image속성으로 엔티티.

예 :

맞춤형 구성 요소

표준 / 사용 가능한 구성 요소 집합이 지원되지 않아 Facelet 태그 파일 또는 복합 구성 요소로 기능을 수행 할 수없는 경우 사용자 정의 구성 요소를 사용하십시오. PrimeFacesOmniFaces 와 같은 오픈 소스 구성 요소 라이브러리의 소스 코드에서 모든 위치에서 예제를 찾을 수 있습니다 .

태그 핸들러

HTML 출력을 렌더링하는 대신 JSF 구성 요소 트리의 빌드를 제어하려면 구성 요소 대신 태그 처리기를 사용해야합니다.

예 :

예제 프로젝트

다음은 위에서 언급 한 모든 기술을 활용하는 몇 가지 예제 프로젝트입니다.


성능이 다를 수 있습니까?

기술적으로 성능 문제는 무시할 수 있습니다. 구체적인 기능 요구 사항과 구현의 최종 추상화, 재사용 및 유지 관리 가능성을 기반으로 선택해야합니다. 각 접근 방식에는 잘 정의 된 목적과 한계가 있습니다.

그러나 컴포지트 구성 요소는 뷰를 빌드 / 복원하는 동안 (특히 : 뷰 상태를 저장 / 복원하는 동안) 상당한 오버 헤드를가집니다. 그리고 이전 버전의 Mojarra에서 복합 구성 요소는 기본값을 할당하는 데 성능 문제가 있었으며 2.1.13 이후 이미 수정되었습니다. 또한 Mojarra는 메서드 표현식에 a 를 사용할 때 메모리 누수가 발생했습니다 <cc:attribute method-signature>. 기본적으로 전체 구성 요소 트리가 HTTP 세션에서 다시 참조되며 2.1.29 / 2.2.8 이후 수정되었습니다. 메모리 누수는 다음과 같이 이전 2.1 버전에서 우회 할 수 있습니다.

<context-param>
    <param-name>com.sun.faces.serializeServerState</param-name>
    <param-value>true</param-value>
</context-param>

또는 아래와 같이 이전 2.2 버전에서 :

<context-param>
    <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
    <param-value>true</param-value>
</context-param>

그래도 비교적 “많은”복합 구성 요소가 있고로 javax.faces.STATE_SAVING_METHOD설정 client한 경우 성능이 고통 스러울 것입니다. 단순한 포함 파일 또는 태그 파일로 이미 가능한 기본 기능만을 원한다면 복합 구성 요소를 남용하지 마십시오. *.taglib.xml태그 파일보다 복합 구성 요소를 선호하는 변명으로 구성의 용이성 (읽기 : 파일 필요 없음 )을 사용하지 마십시오 .

Mojarra 2.2.10 또는 이전 버전을 사용하는 경우 프로덕션 모드에 대해 비교적 짧은 Facelets 새로 고침 기간을 비활성화하는 것을 잊지 마십시오.

<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>-1</param-value>
</context-param>

이 설정을 개발에 사용하지 마십시오. 그렇지 않으면 Facelets 파일의 변경 사항이 반영되도록 전체 서버를 다시 시작해야합니다! Mojarra 2.2.11 이상 및 MyFaces 는이로 설정되지 않은 -1경우 이미 기본값으로 javax.faces.PROJECT_STAGE설정되어 Development있습니다.


답변