사용시기 , 태그 파일, 복합 구성 요소 및 / 또는 사용자 지정 구성 요소?
최근 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>
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
.
'development' 카테고리의 다른 글
Python 목록 색인의 콜론 (:) (0) | 2020.08.28 |
---|---|
표 셀에서 확인란을 중앙에 배치하는 방법은 무엇입니까? (0) | 2020.08.28 |
Alt-Tab 프로그램 전환기에서 창을 숨기는 가장 좋은 방법은 무엇입니까? (0) | 2020.08.28 |
"스핀 락"이란 정확히 무엇입니까? (0) | 2020.08.28 |
int를 16 진수 문자열로 (0) | 2020.08.28 |