2012-04-10 1 views
10

테스트에서 응답이 충분히 빨리 렌더링되지 않아서 우리가 원하지 않는 백엔드 코드가 여러 번 호출되는 경우 버튼을 두 번 이상 눌러야하는 경우가 종종 있습니다.응답이 렌더링되기 전에 여러 제출을 처리하는 방법은 무엇입니까?

Application은 GlassFish 3.1.1에서 JSF 2.0을 사용하는 Java EE 6 Web Profile입니다.

  • 를 제출하는 응답이 렌더링되는 동안 자바 스크립트를 사용하여 모든 버튼을 비활성화해야합니다 :이 가 제대로 처리, 그리고 몇 가지 시나리오를 생각 어떻게해야

    가 궁금했다.
  • 세션 범위의 플래그로 이미 활성화되어 있으므로 민감한 코드는 건너 뛰고 이전 제출에 대한 응답의 다시 렌더링으로 넘어갑니다.
  • 이전 요청이 완료 될 때까지 처리를 지연시키는 동기 블록. 그런 다음 이미 처리되고 건너 뛴 것으로 감지되어야합니다.
  • 변환과 같은 "새로운"범위 중 하나를 사용하여 탐지를 처리합니까?

내 직감은 민감한 코드 블록을 원자 적으로 처리하는 것이 가장 좋은 방법이라는 것입니다.하지만 문제는 올바른 응답을 렌더링하는 것입니다.

어떻게 접근해야합니까?

+0

jQuery blockui와 같은 것을 사용해 보셨나요? BTW 동기화 된 블록은 클러스터에서 작동하지 않습니다. –

+0

아직 아무 것도 시도되지 않았습니다. 이것은 "잘, 어떻게합니까?" 단계. –

답변

2

Adrian이 언급했듯이 BlockUI도 사용합니다. Primefaces에서 BlockUI component이 있습니다. 아약스를 통해 양식을 제출할 때 요청 중에 오버레이를 사용할 수도 있습니다. 예를 들어 Primefaces`s Ajax Status을 참조하십시오.

10

제출은 응답이 렌더링되는 동안 javascript를 사용하여 모든 버튼을 비활성화해야합니다.

일반적인 방법으로 구현하는 것이 가장 쉽습니다. <f:ajax>을 독점적으로 사용하는 경우 jsf.ajax.addOnEvent()을 사용하여 일반적인 방식으로 작업을 수행 할 수 있습니다. 다른 JavaScript 접근법은 최종 사용자가 더 이상 기본 페이지와 상호 작용할 수 없도록 UI를 차단하는 "로드 중"오버레이를 만드는 것입니다. 이것은 기본적으로 어떤 뷰어 전체에 걸쳐 opacity (투명도)으로 숨겨진 절대적으로 배치 된 숨겨진 <div>입니다. 제출할 때 그것을 보여주고 렌더링시 숨길 수 있습니다. 이 기술의 키워드는 "modal dialog"입니다. UI 지향적 인 JSF 컴포넌트 라이브러리는 최소한 이러한 컴포넌트를 이미 가지고있다. 예 : <p:ajaxStatus> 내부 <p:dialog modal="true">, 또는 <p:blockUI>

유일한 단점으로 PrimeFaces는 클라이언트가 JS 사용할 수있는 경우 작동하지 않습니다하거나 사용하지 않고이 때문에 더블을 제출에서 HTTP 클라이언트를 방지 할 것입니다.


그것을 말하는 세션 범위에서 플래그는 이미 활성화되어 있으므로 구분 코드는 생략하고 바로 이전의 제출에 대한 응답의 재 렌더링을 진행한다.

이 더 "synchronizer token pattern"로 알려져 있으며 지금까지 2.2 대상 표에 현재 spec issue 559에 의해 JSF에 대한 요구되었지만, 거기에 모든 활동이 될 것 같지 않습니다. 탐지 및 차단 부분은 기술적으로 구현하기가 쉽지만 최종 요청자가 궁극적으로 초기 요청에 의해 생성 된 응답을 검색하기를 원하면 동기식 대응 처리 부분을 쉽게 구현할 수 없습니다. 비동기 응답 처리는 쉽습니다. 업데이트 할 구성 요소를 지정하지 마십시오. 즉, PartialViewContext#getRenderIds()에 의해 반환 된 컬렉션을 비 웁니다. 결국 이것은 JS를 사용하여 버튼을 비활성화하거나 UI를 차단하는 것보다 훨씬 강력합니다.

알고있는 한, <s:token>을 재사용 할 수있는 JSF 구성 요소를 제안한 사람은 Seam 2뿐입니다. 그러나 이것은 새로운 OmniFaces 구성 요소에 대한 흥미로운 아이디어라는 것을 인정해야합니다. 어쩌면 개인적으로 살펴볼 것입니다.


이전 요청이 완료 될 때까지 프로세싱을 지연시키는 동기 블록. 그런 다음 이미 처리되고 건너 뛴 것으로 감지되어야합니다.

이것은 일반적으로 구현하기 쉽지 않습니다. 작업이 이미 완료되었는지 확인하기 위해 모든 작업 방법을 변경해야합니다. 또한 웹 애플리케이션이 여러 서버에서 실행되는 경우에도 작동하지 않습니다. 동기화 메소드 토큰은 조치 메소드가 호출되기 전에 수행되므로 더 쉽습니다. 싱크로 나이저 토큰은 스레드/자원의 비용만을 요구하는 큐의 여러 요청으로 끝나지 않으므로 비용이 적게 듭니다.


검출을 처리 할 수있는 변환과 같은 "새로운"범위 중 하나를 사용하십니까?

이 문제는 관리 대상 범위를 사용하여 해결할 수 없습니다. Managed Bean 범위는 다른 목적, 즉 Bean 인스턴스의 수명을 제공합니다.

+0

"동기화 된 블록"이외에이 필터를 볼 수도 있습니다 - http://onjava.com/onjava/2004/03/24/examples/RequestControlFilter.java –

+0

매우 유익한 답변을 해주셔서 감사합니다. 자신에 대해 생각하지 못했던 추가 제안이 있습니까? –

+0

반갑습니다. 아니요, JS를 사용하여 사용자 상호 작용을 사용 중지/차단하거나 동기화 기 토큰 패턴을 사용하는 것 외에 다른 방법은 없습니다. – BalusC

관련 문제