f : viewAction / preRenderView 대 PostConstruct를 언제 사용합니까?


96

주석을 사용하는 것과 비교하여 페이지의 데이터를 초기화하기 위해 언제 f:viewAction또는 preRenderView이벤트를 사용해야 @PostConstruct합니까? 기가 콩 등의 범위의 유형에 따라 둘 중 하나를 사용할 수있는 이론적 근거는 백업 콩이 경우인가 @RequestScoped, 다음 사용의 선택 것 f:viewAction또는 preRenderView이상 @PostConstruct보기를 렌더링하기 전에 백업 빈을 초기화 할 수는 관련성이없는 두 하듯이 같은 효과가 발생합니까?

f : viewAction 또는 preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

또는

안녕하세요.

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

답변:


119

@PostConstruct 어노테이션을 사용하여 페이지 구절에 대한 데이터를 초기화하기 위해 f : viewAction 또는 preRenderView 이벤트를 언제 사용해야합니까?

<f:viewAction>HTML이 렌더링되기 전에 메소드를 실행하려는 경우 사용하십시오 . 이는 모델 값 <f:viewParam>업데이트 단계에서 설정 한 모델 값을 기반으로 작업을 수행하려는 경우 특히 유용합니다 . 즉, @PostConstruct실행 되는 순간에는 사용할 수 없습니다 . JSF 2.0 / 2.1에서는이 태그가 존재하지 않았으므로 preRenderView해결 방법 을 사용해야합니다 .

백킹 빈이 @RequestScoped이면 똑같은 일을 효과적으로 수행합니까? (그러면 개발자의 선택에 달려 있습니까? (@PostConstruct는 "더 깔끔한"것 같습니다)).

아니요, 그들은 확실히 똑같은 일을 효과적으로하지 않습니다. 는 @PostConstruct작업 수행들이 의도된다 직접 빈의 구조와 모든 주입 종속성 설정과 같은 관리를 등록 후 @EJB, @Inject, @ManagedProperty등, 즉, 주입 의존성 빈의 생성자 내부를 사용할 수 없습니다. 따라서 Bean이보기, 세션 또는 애플리케이션 범위 일 때보기, 세션 또는 애플리케이션 당 한 번만 실행됩니다. 은 <f:viewAction>단지 초기 GET 요청에 호출 기본적으로,하지만 통해 수 onPostback="true"속성이 아니라 다시 게시 요청을 호출하도록 구성 될 수있다. preRenderView이벤트는 모든 HTTP 요청에 호출된다 (예, 이것은 또한 아약스 요청을 포함!).

사용, 요약 @PostConstruct하면 주입 의존성에 의해 설정되는 관리 속성에 대한 작업을 수행 할 경우 @EJB, @Inject, @ManagedProperty콩의 건설 기간 동안, 등. 에서 설정 한 속성에 대해 작업을 수행하려는 <f:viewAction>경우 에도 사용 합니다 <f:viewParam>. 여전히 JSF 2.0 / 2.1을 사용 preRenderView하는 경우 <f:viewAction>. 필요한 경우 초기 요청시에만 작업 FacesContext#isPostback()을 수행하도록 체크를 추가 할 수 있습니다 preRenderView.

또한보십시오:


감사. 당신이 응답을 작성하는 동안 미안 내 원래의 질문에 편집 ...
BestPractices

@PostConstruct는 Bean이 SessionScoped (빈이 처음 생성 될 때) 인 경우 한 번만 호출되지만 페이지에 액세스 할 때마다 preRenderView가 호출되기 때문에 Bean 범위를 언급했습니다. 아니면 내가 틀렸습니까?
BestPractices 2012 년

네, 맞습니다. 사전 렌더링보기 이벤트는 호출 조치 단계에서 호출됩니다. post 구조는 bean의 생성 후에 호출됩니다. 세션 범위 Bean은 모든 HTTP 요청에서 구성되지 않습니다.
BalusC 2012 년

내 메서드가 ajax 요청 중에 호출되고 있는지 궁금합니다. isPostBack () 호출이 하루를 저장했습니다 !!
jacosta 2013 년

완벽을 위해, 우리는 언급해야 Omnifaces를 '@Param : "HTTP 요청 매개 변수를이 같이 기본적으로이다 <f:viewParam>,하지만 큰 차이로 주입 된 매개 변수 중 직접 사용할 수 있음을 @PostConstructA에 대한 필요없이 처리 훨씬 쉬운 방법 있도록, <f:event type="preRenderView">또는 <f:viewAction>의를 전망."
Jens Piegsa

1

관리 빈의 속성을 초기화해야합니까? -> 그런 다음 @ PostConstruct를 사용 하십시오. 그렇지 않으면 다른 뷰에서 전달 된 매개 변수로 작업해야합니까? -> 그런 다음 " preRenderView "를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.