programing

JSF f:event preRenderView는 f:ajax 호출 및 부분 렌더링에 의해 트리거됩니다. 다른 것이 있습니까?

powerit 2023. 8. 26. 12:24
반응형

JSF f:event preRenderView는 f:ajax 호출 및 부분 렌더링에 의해 트리거됩니다. 다른 것이 있습니까?

F: 이벤트가 있습니다.

   <f:metadata>
    <f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/>
   </f:metadata>

초기 페이지 로드(렌더) 시 원하는 대로 트리거됩니다.

그러나 이 PreRenderView 이벤트는 아래와 같이 ID가 projectListing인 h:panel group을 다시 렌더링하는 Ajax 부분 페이지 렌더에 의해서도 트리거됩니다.

<h:commandButton action="#{mrBean.addProject}" value="Create Project"
                                     title="Start a new project">
   <f:ajax render="projectListing" />
</h:commandButton>

초기 페이지 렌더에 대해 dashboardBacking.loadProjectListFromDB만 호출하고 Ajax 부분 렌더가 있을 때는 호출하지 않습니다.제가 사용할 수 있는 더 적절한 이벤트나 방법이 있습니까?

저는 얼마 전에도 같은 욕구가 있었습니다.저는 Balus C가 제안한 것을 사용하게 되었습니다.

FacesContext 클래스에는 전체 블로우 요청을 처리하는지 또는 어떤 종류의 부분 처리를 처리하는지 알 수 있는 방법이 있습니다.

FacesContext.getCurrentInstance().isPostback()

이렇게 하면 PreRenderView 기법을 계속 사용하여 수신기에서 포스트백인지 확인할 수 있습니다.사용자가 다른 페이지로 이동하고 돌아와야 하기 때문에 세션 빈이 필요했기 때문에 특히 유용했습니다.위에서 Brian이 제안한 것처럼 뷰 스코프 빈을 사용하면 탐색하기 전에 가지고 있던 정보가 손실됩니다.

또 다른 옵션은 당신의 것을 놓는 것입니다.preRenderView의 기능성@PostConstruct의 방법ViewScoped관리 콩이 논리는 빈이 초기화될 때 실행되며 뷰를 변경할 때까지 모든 아약스 요청에 대해 동일한 빈 인스턴스를 유지합니다.

또 다른 가능성은 PreRenderView 메서드에서 요청이 Ajax one인지 확인하는 것입니다.또한 요청이 GET인지 여부 및 유효성 검사 실패 여부와 같은 다른 요인을 고려하여 조건부로 로드를 수행할 수 있습니다(GET 페이지에서 파라미터 유효성 검사가 실패할 수 있음).

boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET") ? true : false;
boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
boolean validationFailed = fc.isValidationFailed();

이 문제를 처리하는 "새로운 시대" 방법은 다음과 같습니다.

http://www.coderanch.com/t/509746/JSF/java/duplicate-call-preRenderView-event#2634752

페이지가 아닌 개별 구성요소에 PreRenderView 이벤트 수신기를 연결해 볼 수 있습니다.Ajax 요청 중에 렌더링되지 않는 구성 요소를 선택합니다.

한 가지 작은 문제는 @PostConstruct 메서드를 호출할 때 뷰 매개 변수가 설정되지 않았기 때문에 명시적으로 가져와야 했다는 것입니다.

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("theParam");

업데이트: 사실, 저는 @PostConstruct 일을 하게 되었습니다. 훨씬 깨끗합니다.

저는 오늘 세션 범위의 백빈과 정확히 같은 문제를 겪었습니다.즉, PreRenderView에 등록된 지원 세션 범위 빈에 이벤트 수신기 메서드를 등록했습니다.그러나 PrimeFaces 3 dataTable 구성 요소의 일부 Ajax 정렬 작업에서도 발생했습니다.그래서 제가 하게 된 것은 세션 범위의 백 빈에서 부울 인스턴스 변수를 사용하여 이벤트 청취자 메서드의 본문이 처음에만 실행되도록 하는 것이었습니다(부울이 플래그 역할을 했습니다).저는 그것이 다소 순진하고 아마도 특정한 경우에 깨졌을 것이라고 확신하기 때문에 저는 왜 그리고 어떻게 이 단순한 접근법이 실패할 수 있는지 알고 싶습니다.

언급URL : https://stackoverflow.com/questions/2830834/jsf-fevent-prerenderview-is-triggered-by-fajax-calls-and-partial-renders-some

반응형