2013-03-11 2 views
0

다음 질문이 있습니다!동적으로 입력 텍스트 만들기

내 백킹 빈에서 inputtext를 동적으로 생성하고 싶습니다. 실행 시간에 생성되는 동적으로 생성 된 탭 안에 있습니다.

input 클래스를 사용하여 동적으로 구성 요소를 추가 할 수 있습니다.

그러나 구성 요소에 값 태그를 추가 할 수 없었습니다. valueExpresion 언어는 값을 managedBean에 바인딩합니다.

내가 이런 식으로 소화 할 수있는 코드를 발견했습니다.

@ManagedBean 
    @ViewScoped 
    public MyManagedBean(){ 

private TabView tabsi; 
    HtmlOutputLabel hol = new HtmlOutputLabel(); 
     InputText txt2 = new InputText(); 
private String value; 

/* getter and setters */ 

    public void MyManagedBean{ 
    tabsi = new TabView(); 
      Tab tab1 = new Tab(); 
      tab1.setTitle("Tab1"); 
      Tab tab2 = new Tab(); 
      tab2.setTitle("Tab2"); 
      tabsi.getChildren().add(tab1); 
      tabsi.getChildren().add(tab2); 

      hol.setValue("label"); 
      hol.setStyleClass("label"); 
      txt2.setValueExpression("value", 
        TestController.getExpression("#{myManagedBean.value}")); 
      txt2.setValue(value); 
      tab1.getChildren().add(hol); 
      tab1.getChildren().add(txt2); 
    } 

    public static ValueExpression getExpression(String expression) { 
      FacesContext fc = FacesContext.getCurrentInstance(); 
      ELContext ctx = fc.getELContext(); 
      ExpressionFactory factory = fc.getApplication().getExpressionFactory(); 
      return factory.createValueExpression(ctx, expression, Object.class); 
     } 

public void test1() { 
     System.out.println(value); 
    } 
    } 

나는 성공적 구성 요소를 구축하기 위해 관리하지만 나는 그것이 ValueExpression를 설정하는 바인딩 할 수 없습니다. 버튼에서 test1 함수를 호출하면 해당 버튼이 인쇄됩니다. null

어떻게 값을 ManagedBean에 바인딩 할 수 있습니까 ???

+0

당신은 TestController.getExpression ("# {myManagedBean.value}"))를 호출합니다. MyManagedBean의 생성자에서. 당신은 건설중인 무언가로부터 어떤 것도 얻을 수 없습니다. 항상 null를 돌려줍니다. – faissal

+0

생성자에서 나는 바인딩 될 값을 stablish! 그래서 실제로 actionListener를 시작하기 전까지는 호출되지 않습니다. 내 경우에는 제가 누르는 버튼입니다. –

답변

0

는 지금까지 제공된 정보에 정확한 원인을 정확히 파악할 수는 없지만,이 방법 적어도 세 가지 심각한 문제가있다 :

  1. UIComponent 인스턴스가 본질적 요청에이 범위는. 더 넓은 범위에서 bean의 속성으로 절대 선언해서는 안됩니다. 또는 동일한 인스턴스가 여러 뷰에서 참조 된 경우 악명 높은 "Duplicate component ID"오류가 발생합니다.

  2. 뷰 범위가 지정된 빈 특성을 참조하는 binding 속성을 사용하면 뷰 범위가 완전히 분리됩니다. 빈은 요청할 때마다 재생성됩니다. 그렇지 않으면 JSF는 요청 매개 변수지도에서 찾을 수 없습니다, JSTL in JSF2 Facelets... makes sense?

  3. A가 프로그램 UIInput을 생성 UICommand 구성 요소가 고정 idsetId()를 통해 설정해야합니다 :이 문제는 여기에 자세히 설명 된 바와 같이 기본적으로 동일한 근거를 가지고 신청서 제출 단계의 신청서 제출 단계에서 제출 된 값과 처리 방법을 본질적으로 처리 할 수 ​​없습니다.

세 번째 문제는 현재 문제의 정확한 원인 일 가능성이 높지만 첫 번째 및 두 번째 문제가 영향을 미칠 수 있습니다.

이와 관련없이 프로그래밍 방식으로 이러한 방식으로 구성 요소를 작성하려는 결정을 재고 해보십시오. 가능한 한 피해야합니다. 예 : rendered 속성을 사용하거나 JSTL <c:if>과 같은 빌드 타임 태그를 보시지 않겠습니까?

+0

감사합니다. 세 번째 옵션이 승리했습니다. 네, 맞습니다. 그러한 요소가로드되는 범위를 고려해야 할 필요가 있습니다. 빌드 할 때 구성 요소를 만드는 것에 대한 자세한 정보를 볼 것입니다! –

관련 문제