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


102

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

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

답변:


176

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

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있습니다.


3 (facelet 태그 파일) 대신 1 개의 구성 요소 (복합 구성 요소)를 렌더링하려는 이유는 무엇입니까? 글쎄요, 화창한 날에는 아마도 3이 아닌 1이 될 것 같은 느낌이들 것입니다.하지만 그 뒤에 뭔가 다른 것이있는 것 같아요. 귀하의 예제에서 UINamingContainer를 확장하고 있습니다 ... 그것이 cc를 선택하는 이유 중 하나 일 수 있습니까 (따라서 일부 jsf 구현 특정 기능을 덮어 쓸 수 있습니까?)?
Toskan

2
태그 파일은 일종의 포함으로 보여야합니다. 복합 구성 요소는 실제 구성 요소로 보여야합니다. 복합 구성 요소 는를 구현 해야 합니다 NamingContainer. 그렇지 않으면 동일한 구성 요소를 여러 번 재사용 할 때 중복 ID 문제가 발생합니다.
BalusC

@BalusC 주소를 추가하거나 제거 할 수있는 '블록'을 만드는 HTML 및 JSF가 많이 있다고 가정 해 보겠습니다 (그리고 모든 속성 : 거리, 번호, 도시 등). 2 ~ 3 페이지에서 동일한 블록을 사용해야합니다. 복합 구성 요소에 대한 설명에 해당합니까?
RinaldoPJr 2013

1
@Rinaldo : stackoverflow.com/questions/5713718/… 에서 설명 된 것처럼 동적으로 채워진 구성 요소 ID가있는 태그 파일을 사용할 것 같습니다 . IMO, 태그 파일로 할 수 있다면 사용하십시오. 태그 파일로 수행 할 수없는 경우 복합을 사용하십시오. 단일 속성을 조작하기 위해 여러 구성 요소가 필요한 경우 (주소가 아니라 단일 속성에 들어가야하는 streetname + housenumber) 복합 구성 요소가 유일한 솔루션입니다.
BalusC 2013

2
@Tarik : 컴포지트는 태그 파일에 비해 오버 헤드가 많습니다. 즉, 성능 저하입니다. 밀접하게 관련된 기존 구성 요소 집합을 기반으로 단일 사용자 정의 UI 구성 요소를 만들어야하는 경우에만 사용하십시오. 이것은 태그 파일로 할 수 없습니다. 예를 들어 ZEEF.com은 하나의 컴포지트 만 가지고 있습니다. 즉, 페이지 사진, 프로필 사진, 링크 블록 헤더, 이미지 블록 등에 사용되는 업로드 / 다운로드 / 자르기 이미지 올인원 사물입니다. Image속성 에만 바인딩됩니다. 콩에.
BalusC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.