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>
또 다른 큰 차이점은 이 시스템이valueChangeListener
method는 의 종료시에 호출됩니다.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_APPLICATION
syslog.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
'programing' 카테고리의 다른 글
다이내믹 ID ng-module (0) | 2023.02.11 |
---|---|
max File Size를 설정하려고 하는데 허용되지 않습니다. (0) | 2023.02.11 |
Local Storage를 React와 함께 사용하시겠습니까? (0) | 2023.02.11 |
ajax formdata : 잘못된 호출 (0) | 2023.02.11 |
AngularJs에서 CORS를 활성화하는 방법 (0) | 2023.02.11 |