코드베이스가 좋지 않은 옛날에는 표준 지정 동작보다는 ICEfaces 또는 MyFaces의 구현 세부 사항으로 인해 작업이 의심되는 이벤트 대기열에 많이 의존했습니다.JSF : 값 변경 후 액션 호출
<ice:inputText value="#{bb.frequency}" valueChangeListener="#{bb.valueChanged}"/>
목표는 retune
이 setFrequency
때마다 주파수 변경 후 호출 할 수 있도록 준비하는 것입니다 : 우리가 자주 수행하는 데 사용되는 것은 이런 종류의 일이었다.
그런 다음 우리는 이벤트를 다시 큐잉 할 백킹 빈에서 꽤 역겨운 코드를 가지고있었습니다. 일반적으로 다음과 같이 보입니다.
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();
}
}
}
이것은 좋은 방법은 아닙니다. 나는 나중에 단계를 위해 이벤트를 재구성 할 수있는 확실한 방법을 찾지 못했고 사람들이하는 일과는 분명히 다르다.
- 가
BB#setFrequency
방법에 리튠 정보를 이동: 나는 두 가지 솔루션을 참조하십시오.
저수준 모델 클래스를 직접 처리하고 다른 클라이언트의 동작을 방해하고 싶지 않기 때문에 많은 경우이 문제를 해결할 수 없습니다.
사용자 지정 구성 요소를 만들고 논리를
setFoo
메서드로 옮깁니다.다른 컨테이너에 포함 된 Mojarra 및 사용자 지정 구성 요소에 많은 문제가 있기 때문에이 방법을 좋아하지 않습니다. 또한 내가해야 할 일이 너무 과장된 것 같습니다. 일부 속성을 설정 한 후 문자 그대로
retune
으로 전화해야합니다.모든 것을위한 백킹 빈을 생성하십시오. 대부분의 메서드를 내부 객체에 직접 위임하지만
setFoo
을 잡고 거기에서 다시 수행하십시오. 이것은 우리가 해왔 던 것과 매우 유사하며 많은 상용구, 래퍼 및 글루 코드를 의미하므로 좋아하지 않습니다. 내 마음에
나는 이런 식으로 뭔가 상상 :
<ice:inputText value="#{bb.frequency}" afterChange=#{bb.retune}"/>
을하지만 분명히 작동하지 않으며, 즉 '클래스 이름이 필요하지만, 무엇에 아무런 관련이 없습니다 년부터 <f:actionListener>
를 부착 할 현재 진행중이며, 그 외에도 UICommand
에 설정할 수 있습니다. 이는 UIInput
입니다.
이 딜레마를 해결하는 우아하고 정확한 방법은 무엇입니까?
대단한 직접 답변에 다시 한번 감사드립니다. 누군가 JSF를 완전히 배우는 것을 어떻게 추천합니까? 나는 웹 주변의 작은 조각들을 배우는 것처럼 느껴지지만 3 년 후에는 전문적으로 그것을 사용하여도 여전히 많은 지식이 부족합니다.S.O.와는 별도로 그 틈새를 어떻게 막아야합니까? –