이러한 접근 방식의 차이점은 무엇입니까?
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 태그 파일 또는 복합 구성 요소로 기능을 수행 할 수없는 경우 사용자 정의 구성 요소를 사용하십시오. PrimeFaces 및 OmniFaces 와 같은 오픈 소스 구성 요소 라이브러리의 소스 코드에서 모든 위치에서 예제를 찾을 수 있습니다 .
태그 핸들러
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
있습니다.