2012-11-28 3 views
1

코드베이스가 좋지 않은 옛날에는 표준 지정 동작보다는 ICEfaces 또는 MyFaces의 구현 세부 사항으로 인해 작업이 의심되는 이벤트 대기열에 많이 의존했습니다.JSF : 값 변경 후 액션 호출

<ice:inputText value="#{bb.frequency}" valueChangeListener="#{bb.valueChanged}"/> 

목표는 retunesetFrequency 때마다 주파수 변경 후 호출 할 수 있도록 준비하는 것입니다 : 우리가 자주 수행하는 데 사용되는 것은 이런 종류의 일이었다.

그런 다음 우리는 이벤트를 다시 큐잉 할 백킹 빈에서 꽤 역겨운 코드를 가지고있었습니다. 일반적으로 다음과 같이 보입니다.

class BB { 
    // this happens first, thanks to UPDATE_MODEL_VALUES 
    public void setFrequency(Frequency f) { 
    this.model.f = f; 
    } 

    public void valueChanged(ValueChangeEvent event) { 
    if (event.getOldValue().equals(event.getNewValue()) 
     return; // nothing changed, so leave 

    if (FacesContext.getCurrentInstance().getPhaseId() != INVOKE_APPLICATION) { 
     OurMagicEventUtils.requeueEvent(event, INVOKE_APPLICATION); 
    } 
    else { 
     // do the post-setter work here (the setter happened recently during 
     // UPDATE_MODEL_VALUES so we're up-to-date by here 
     this.model.retune(); 
    } 
    } 
} 

이것은 좋은 방법은 아닙니다. 나는 나중에 단계를 위해 이벤트를 재구성 할 수있는 확실한 방법을 찾지 못했고 사람들이하는 일과는 분명히 다르다.

  1. BB#setFrequency 방법에 리튠 정보를 이동

    : 나는 두 가지 솔루션을 참조하십시오.

    저수준 모델 클래스를 직접 처리하고 다른 클라이언트의 동작을 방해하고 싶지 않기 때문에 많은 경우이 문제를 해결할 수 없습니다.

  2. 사용자 지정 구성 요소를 만들고 논리를 setFoo 메서드로 옮깁니다.

    다른 컨테이너에 포함 된 Mojarra 및 사용자 지정 구성 요소에 많은 문제가 있기 때문에이 방법을 좋아하지 않습니다. 또한 내가해야 할 일이 너무 과장된 것 같습니다. 일부 속성을 설정 한 후 문자 그대로 retune으로 전화해야합니다.

  3. 모든 것을위한 백킹 빈을 생성하십시오. 대부분의 메서드를 내부 객체에 직접 위임하지만 setFoo을 잡고 거기에서 다시 수행하십시오. 이것은 우리가 해왔 던 것과 매우 유사하며 많은 상용구, 래퍼 및 글루 코드를 의미하므로 좋아하지 않습니다. 내 마음에

나는 이런 식으로 뭔가 상상 :

<ice:inputText value="#{bb.frequency}" afterChange=#{bb.retune}"/> 

을하지만 분명히 작동하지 않으며, 즉 '클래스 이름이 필요하지만, 무엇에 아무런 관련이 없습니다 년부터 <f:actionListener>를 부착 할 현재 진행중이며, 그 외에도 UICommand에 설정할 수 있습니다. 이는 UIInput입니다.

이 딜레마를 해결하는 우아하고 정확한 방법은 무엇입니까?

답변

2

JSF2를 이미 사용하고 있으므로 <f:ajax>을 사용하십시오. HTML DOM change 이벤트가 발생했을 때

public void retune(AjaxBehaviorEvent event) { // Note: the argument is optional. 
    // ... 
} 

이와

<ice:inputText value="#{bb.frequency}"> 
    <f:ajax listener="#{bb.retune}"/> 
</ice:inputText> 

는 호출 작업 단계에서 호출됩니다.

+0

대단한 직접 답변에 다시 한번 감사드립니다. 누군가 JSF를 완전히 배우는 것을 어떻게 추천합니까? 나는 웹 주변의 작은 조각들을 배우는 것처럼 느껴지지만 3 년 후에는 전문적으로 그것을 사용하여도 여전히 많은 지식이 부족합니다.S.O.와는 별도로 그 틈새를 어떻게 막아야합니까? –