development

사용시기

big-blog 2020. 8. 28. 07:54
반응형

사용시기 , 태그 파일, 복합 구성 요소 및 / 또는 사용자 지정 구성 요소?


최근 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>

Still, when you have relatively "a lot of" composite components, and you have javax.faces.STATE_SAVING_METHOD set to client, then the performance will be a pain. Do not abuse composite components if you merely want the basic functionality which is already possible with a simple include file or tag file. Do not use the ease of configuration (read: no *.taglib.xml file needed) as an excuse to prefer composite components over tag files.

When using Mojarra 2.2.10 or older, do not forget to disable the relatively short Facelets refresh period for production mode:

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

Do not use this setting for development, otherwise you've to restart the whole server to get changes in Facelets files to be reflected! Mojarra 2.2.11 and newer, and MyFaces already defaults to -1 when javax.faces.PROJECT_STAGE is not set to Development.

참고URL : https://stackoverflow.com/questions/6822000/when-to-use-uiinclude-tag-files-composite-components-and-or-custom-componen

반응형