최근 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>
당신이 재사용 가능한 템플릿으로 메인 페이지 레이아웃 조각을 분할 할 경우). 예 : 머리글, 메뉴, 내용, 바닥 글 등
예 :
- JSF 2.0 Facelets를 사용하여 XHTML에 다른 XHTML을 포함하는 방법은 무엇입니까?
- ui : decorate와 ui : include의 실제 개념적 차이점은 무엇입니까?
- ui : composition 템플릿을 사용할 때 h : head를 사용자 정의하는 방법은 무엇입니까?
- ui : composition을 사용할 때 페이지의 헤드 요소를 변경하는 방법
- 탐색 메뉴로 동적 포함 콘텐츠를 ajax 새로 고치는 방법은 무엇입니까? (JSF SPA)
Facelet 태그 파일
코드 중복을 방지 / 최소화하기 위해 재사용 가능한 구성 요소 그룹을 갖고 싶다면 Facelet 태그 파일을 사용하십시오. 예 : 레이블 + 입력 + 메시지 구성 요소 그룹. 복합 구성 요소의 주요 차이점은 Facelet 태그 파일의 출력이 단일 항목을 나타내지 않으며 UIComponent
일부 상황에서 복합 구성 요소가 충분하지 않은 경우 유일한 솔루션 일 수 있다는 것입니다. 일반적으로 관리 Bean 특성을 전달하는 <ui:include>
하나 이상의 with <ui:param>
(하드 코딩 된 값이 아님)를 갖는 것은 포함 파일이 태그 파일이 될 수 있다는 신호입니다.
예 :
- 사용자 지정 Facelets 태그를 만드는 방법은 무엇입니까?
- JSF 복합 구성 요소의 그리드를 만드는 방법은 무엇입니까?
- 데이터 테이블 열에 대한 복합 구성 요소를 만드는 방법은 무엇입니까?
- 복합 구성 요소에 대한 Primefaces outputLabel
복합 구성 요소
UIComponent
순수한 XML을 사용하여 단일 책임으로 재사용 가능한 단일 사용자 정의를 작성하려는 경우 복합 컴포넌트를 사용하십시오 . 이러한 복합 구성 요소는 일반적으로 기존 구성 요소 및 / 또는 HTML의 무리로 구성되며 물리적으로 단일 구성 요소로 렌더링되며 단일 빈 속성에 바인딩되어야합니다. 예 나타내는 단일 요소 java.util.Date
(3 개)에 의존하여 속성 <h:selectOneMenu>
요소 또는 요소 결합 <p:fileUpload>
및 <p:imageCropper>
하나에 <my:uploadAndCropImage>
하나의 정의를 참조 com.example.Image
속성으로 엔티티.
예 :
- 컴포지트 컴포넌트 위키 페이지
- BalusC 코드 : 여러 입력 필드가있는 복합 구성 요소
- f : convertDateTime을 사용하여 시간과 분을 나타내는 두 개의 h : inputText 필드에 java.util.Date 분할
- 동적 ID가있는 Multiple SelectManyCheckBox의 모든 항목 선택
- JSF commandLink 구성 요소 확장
- 동일한 이름 지정 컨테이너에서 facelet 구성을 재사용 할 때 중복 ID 방지
맞춤형 구성 요소
표준 / 사용 가능한 구성 요소 집합이 지원되지 않아 Facelet 태그 파일 또는 복합 구성 요소로 기능을 수행 할 수없는 경우 사용자 정의 구성 요소를 사용하십시오. PrimeFaces 및 OmniFaces 와 같은 오픈 소스 구성 요소 라이브러리의 소스 코드에서 모든 위치에서 예제를 찾을 수 있습니다 .
태그 핸들러
HTML 출력을 렌더링하는 대신 JSF 구성 요소 트리의 빌드를 제어하려면 구성 요소 대신 태그 처리기를 사용해야합니다.
예 :
- JSF의 사용자 정의 Facelet 구성 요소
- 프로그래밍 방식으로 <ui : define>으로 만든 내용에 액세스하려면 어떻게해야합니까?
- 속성 지정 여부에 따라 태그 파일에서 조건부 렌더링
- 쿼리 매개 변수와 관련된 변환 / 검증이 실패한 경우 리디렉션 수행
예제 프로젝트
다음은 위에서 언급 한 모든 기술을 활용하는 몇 가지 예제 프로젝트입니다.
성능이 다를 수 있습니까?
기술적으로 성능 문제는 무시할 수 있습니다. 구체적인 기능 요구 사항과 구현의 최종 추상화, 재사용 및 유지 관리 가능성을 기반으로 선택해야합니다. 각 접근 방식에는 잘 정의 된 목적과 한계가 있습니다.
그러나 컴포지트 구성 요소는 뷰를 빌드 / 복원하는 동안 (특히 : 뷰 상태를 저장 / 복원하는 동안) 상당한 오버 헤드를가집니다. 그리고 이전 버전의 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
있습니다.