2011-05-16 3 views
2

Excel 파일 집합에서 정적으로 생성되는 jsf 구성 요소 집합 (비즈니스 사람들이 업데이트 함)이 있습니다. 생성 된 각 파일은 데이터가 약간 다른 비즈니스 오브젝트를 나타내며, 모두 동일한 클래스에 속합니다.JSF ui : 조각 렌더링 된 성능

<!-- IMPLEMENTATION -->   
<composite:implementation> 
    <ui:fragment rendered="#{cc.attrs.type eq 'cartcred'}"> 
     <limites:limites-cartcred limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 
    <ui:fragment rendered="#{cc.attrs.type eq 'cdcp'}"> 
     <limites:limites-cdcp limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 
    <ui:fragment rendered="#{cc.attrs.type eq 'cheqpredatado'}"> 
     <limites:limites-cheqpredatado limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 
    <ui:fragment rendered="#{cc.attrs.type eq 'confirming'}"> 
     <limites:limites-confirming limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 
    <!-- many more lines --> 
    <!-- many more lines --> 
    <!-- many more lines --> 
    <ui:fragment rendered="#{cc.attrs.type eq 'contacorr'}"> 
     <limites:limites-contacorr limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 

:

동적으로 렌더링하기 위해

, 내가 찾은 유일한 해결책은 런타임에 적절한 구성 요소에 ui:fragment의 무리 파견을 설정했다

그러나 나는 이것의 성능이 끔찍하다는 것을 알았습니다. 나는 JSF가 하나의 컴포넌트만을 렌더링 할 것을 강요했지만, 모두을 렌더링하고 런타임에 다른 컴포넌트를 "숨기는"것으로 보인다.

내 목표를 달성하는보다 효율적인 방법이 있습니까? 을 비즈니스 클래스에 대한 런타임 정보 (if-then-else와 비슷 함)를 기반으로 단일 구성 요소으로 렌더링하려고하지만 런타임시 렌더링 할 구성 요소 만 결정할 수 있습니다.


명확한 설명 : 무슨 일하는 limites:limites*에 의해 참조 각 구성 요소가 다른 구성 요소의 많은 거대한 복잡한 페이지는 것이다. 런타임에 type' will decide what component to render. But my tests show that if I only render one component, but leave the other ui : fragments`라는 매개 변수 (심지어 렌더링되지 않는다는 것을 알면서도)는 보다 더 느리게 렌더링합니다.

그래서 내 페이지가 정확히 같은 경우 :

<composite:interface> 
    <composite:attribute name="type" required="true" /> 
    <composite:attribute name="limite" required="true" /> 
</composite:interface>   
<composite:implementation> 
    <ui:fragment rendered="#{cc.attrs.type eq 'cartcred'}"> 
     <limites:limites-cartcred limite="#{cc.attrs.limite}"/> 
    </ui:fragment> 
</composite:implementation> 

더 빨리 초기 버전보다 많은 (10 배 주위를) 렌더링, 매개 변수가 동일하더라도. 필자는 JSF가 전체 컴포넌트 트리를 생성하고 런타임시에만 (제공된 파라미터에 따라) 서로를 렌더링할지 여부를 결정할 것이라고 생각합니다.


거의 다

편집. 내 복합 구성 요소동적으로을 포함하면됩니다. ELExpression을 평가하려고 시도했지만 작동하지 않았습니다.

//obviously, ELExpressions don't work here 
Resource resource = application.getResourceHandler().createResource("file-#{varStatus.loop}.xhtml", "components/dynamicfaces"); 

답변

2

하나의 가능성은 내부에서 컨테이너 구성 요소에 액세스 할 수 binding 속성을 사용할 수 있습니다 : 내가 필요로하는 구성 요소 생성에서 현재 범위에 액세스하고 적절한 파일 이름을 생성하는 것을 사용하는 방법입니다 귀하의 관리 빈과 자바 사이드에서 구성 요소 트리를 빌드하십시오. 그렇게하면 필요한 구성 요소 만 포함 할 수 있으므로 불필요한 구성 요소는 전혀 평가되지 않습니다.

JSP : I 복합 구성 요소와 함께이 사용하지 않은 아직, this question 복합 이것을 사용에 대한 좀 더 자세한 사항과 example application을 갖고있는 것 같아요

private UIPanel panel; 

// getter and setter 


// Action method, might also work in a @PostConstruct 
public String showComponent() { 
    if (showComponent1) { 
     UIOutput component1 = new HtmlOutputText(); 
     component1.setValue("Hello world!"); 

     getPanel().getChildren().add(component1); 
    } 

    return "viewId"; 
} 

:

<h:panelGroup binding="#{managedBean.panel}"/> 

는 콩을 관리 구성 요소.

편집 : 당신의 편집에 관해서는, 당신은 또한이처럼 관리 빈에 EL 표현식을 평가할 수 :

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ELContext elContext = facesContext.getELContext(); 
ExpressionFactory exprFactory = facesContext.getApplication().getExpressionFactory(); 
ValueExpression expr = exprFactory.createValueExpression(elContext, "#{expr}", String.class); 
String value = (String) expr.getValue(elContext); 
+0

이 기능은 제 특정 문제를 해결하지 못했지만 정답이라고 생각합니다. –

+0

@Miguel, 감사합니다. Java 코드에서 el 식을 사용하는 방법에 대한 예제는 내 업데이트를 참조하십시오. –

+0

Hehe 고마워, 나는 콩에서 ELExpression을 평가하려고 이미 시도했지만 어떤 이유로 제대로 평가하지 못했다. 'setComponent'가 불려 갔을 때에 액세스하려고하고 있던 변수를 해결할 수 없었습니다. 때때로 당신은 계속 전진해야합니다. –

8

예, rendered 속성이없는 빌드 시간 동안, 동안 렌더링 시간을 평가한다. 예, 상대적으로 끔찍합니다. 한 가지 조건이 1ms라고 가정하고, 그 중 10 번이 10ms 더 길고 10ms가 걸릴 것이라고 생각해보십시오. 페이지 번호가 매겨진 테이블에 이러한 구성 요소가 10 개있는 경우 웹 앱로드 시간은 0.1 초 더 오래 걸립니다. 약 한 번 이상 눈 깜박임. 그러나 페이지 매김을하지 않거나 참조 브라우저로 MSIE를 사용하는 경우 시간이 오래 걸립니다. 데이터를 페이지 매김하고 적절한 브라우저에서 테스트하고 있습니까?

가장 좋은 방법은 <c:if>/<c:choose>과 같은 JSTL 태그를 <ui:fragment>으로 바꾸어 렌더링하는 동안이 아니라 빌드하는 동안 평가되도록하는 것입니다. 또는, 뷰가 아닌 Backing Bean 생성자에서 컴포넌트 트리를 빌드하십시오.

+0

생성 된 페이지가 인쇄 목적으로 사용 중이기 때문에 페이지 매김을 할 수 없습니다. 위의 페이지는 xls 메타 데이터에서도 생성되기 때문에, 실제로 알고 싶다면 렌더링 된 조건이 'true'로 평가되면 'fragment'내용이 "처리"되는 것을 어떻게 보장 할 수 있을까요? 게다가 내 참조 브라우저는 MSIE6입니다. 나는 아마 다른 직업을 가져야한다 ... –

+0

MSIE는 극히 열악한 HTML 테이블 렌더링 성능을 가지고있다. 나는 당신의 문제가 EL에 의해 실제로 야기 된 것인지 의심 스럽다. 그것은 매우 빠릅니다. 다른 브라우저에서 같은 페이지를 테스트 해보십시오. Firefox 또는 Chrome - 참조 용으로 만 제공됩니다. – BalusC

+0

나는 내 문제를 분명히했다. –