programing

value Change Listener 또는 f:ajax 리스너를 사용하는 경우

megabox 2023. 2. 11. 09:07
반응형

value Change Listener 또는 f:ajax 리스너를 사용하는 경우

다음 두 가지 코드 간의 차이점은 무엇입니까?listener배치?

<h:selectOneMenu ...>
    <f:selectItems ... />
    <f:ajax listener="#{bean.listener}" />
</h:selectOneMenu>

그리고.

<h:selectOneMenu ... valueChangeListener="#{bean.listener}">
    <f:selectItems ... />
</h:selectOneMenu>

valueChangeListener는 폼이 송신되어 송신된 값이 초기값과 다른 경우에만 호출됩니다.따라서 HTML DOM만 호출되지 않습니다.change이벤트가 발생합니다.HTML DOM 중에 폼을 제출하려면change이벤트를 하나 더 추가해야 합니다.<f:ajax/>입력 컴포넌트에 대한 리스너(!)가 없습니다.현재 컴포넌트만 처리하는 폼 제출이 발생합니다(예:execute="@this").

<h:selectOneMenu value="#{bean.value}" valueChangeListener="#{bean.changeListener}">
    <f:selectItems ... />
    <f:ajax />
</h:selectOneMenu>

사용시<f:ajax listener>대신valueChangeListener디폴트로는 HTML DOM 중에 실행됩니다.change이미 이벤트입니다.안에서.UICommand체크 박스 또는 라디오 버튼을 나타내는 컴포넌트와 입력 컴포넌트는 기본적으로 HTML DOM 중에 실행됩니다.click이벤트만.

<h:selectOneMenu value="#{bean.value}">
    <f:selectItems ... />
    <f:ajax listener="#{bean.ajaxListener}" />
</h:selectOneMenu>

또 다른 큰 차이점은 이 시스템이valueChangeListenermethod는 의 종료시에 호출됩니다.PROCESS_VALIDATIONS그 시점에서는, 송신된 값이 아직 모델내에서 갱신되지 않았습니다.따라서 입력 컴포넌트에 바인드되어 있는 bean 속성에 접속하는 것만으로는 취득할 수 없습니다.value. 당신은 그것을 얻어야 한다.ValueChangeEvent#getNewValue()참고로 오래된 값은 다음 사용자도 사용할 수 있습니다.ValueChangeEvent#getOldValue().

public void changeListener(ValueChangeEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();
    // ...
}

<f:ajax listener>메서드는 다음 시간 동안 호출됩니다.INVOKE_APPLICATION그 시점에서, 송신된 값은 이미 모델내에서 갱신되고 있습니다.입력 컴포넌트에 바인드된 bean 속성에 직접 액세스하여 얻을 수 있습니다.value.

private Object value; // +getter+setter.

public void ajaxListener(AjaxBehaviorEvent event) {
    System.out.println(value); // Look, (new) value is already set.
}

또한 제출된 값을 기반으로 다른 속성을 업데이트해야 하는 경우 사용 중 실패합니다.valueChangeListener갱신된 속성은 이후 전송되는 값에 의해 덮어쓸 수 있습니다.UPDATE_MODEL_VALUES단계. 이것이 바로 이전 JSF 1.x 어플리케이션/튜토리얼/리소스에서 볼 수 있는 것입니다.valueChangeListener와 조합하여 사용되는 구조입니다.immediate="true"그리고.FacesContext#renderResponse()그런 일이 일어나지 않게 하려고요.결국,valueChangeListener실제로 비즈니스 액션을 실행하는 것은 항상 해킹/회피책이었습니다.

요약:를 사용합니다.valueChangeListener실제 값 변경 자체를 가로채야 하는 경우에만 해당됩니다.즉, 실제로 이전 값과 새 값(: 기록) 모두에 관심이 있습니다.

public void changeListener(ValueChangeEvent event) {
    changeLogger.log(event.getOldValue(), event.getNewValue());
}

를 사용합니다.<f:ajax listener>새로 변경된 값에 대해 비즈니스 액션을 실행해야 하는 경우에만 해당됩니다.즉, 실제로는 새 값(예: 두 번째 드롭다운 입력)에만 관심이 있습니다.

public void ajaxListener(AjaxBehaviorEvent event) {
    selectItemsOfSecondDropdown = populateItBasedOn(selectedValueOfFirstDropdown);
}

실제로 비즈니스 액션을 실행하는 동안 오래된 가치에도 관심이 있다면 다음으로 넘어갑니다.valueChangeListener을 해서 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ.INVOKE_APPLICATIONsyslog.syslog.

public void changeListener(ValueChangeEvent event) {
    if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return;
    }

    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();
    System.out.println(newValue.equals(value)); // true
    // ...
}

첫 번째 fragment(수신자 속성):

ajax 태그의 "listener" 속성은 클라이언트 측에서 ajax 함수가 발생할 때마다 서버 측에서 호출되는 메서드입니다.예를 들어, 이 속성을 사용하여 사용자가 키를 누를 때마다 호출할 서버 측 함수를 지정할 수 있습니다.

단, 두 번째 fragment(value Change Listener):

Value Change Listener는 폼이 전송될 때만 호출되며 입력 값이 변경될 때는 호출되지 않습니다.

* 이 편리한 답변을 보시기 바랍니다.

언급URL : https://stackoverflow.com/questions/11879138/when-to-use-valuechangelistener-or-fajax-listener

반응형