2011-01-28 2 views
4

(지난 몇 개월 동안 ICEfaces 1.8 사용 후) JSF 2.0을 사용해 본 결과, JSF 2.0에서 내 backing bean 생성자가 여러 번 호출되는 이유를 알아 내려고하고 있습니다.여러 번 호출 된 JSF Backing Bean 생성자

빈은 생성시 한 번 인스턴스화되지만 commandButton을 클릭 할 때마다 "Bean Initialized"텍스트가 표시되어 새 Bean 객체가 인스턴스화되었음을 나타냅니다.

facelet 페이지 :

<?xml version='1.0' encoding='UTF-8' ?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 

    <h:body> 
     <div id="content"> 
      <h:form id="form"> 
       <h:commandButton value="Toggle" action="#{bean.toggleShowMe}"/> 
      </h:form> 


      <h:panelGrid rendered="#{bean.showMe}"> 
       <h:outputText value="Show me!"/> 
      </h:panelGrid> 
     </div> 
    </h:body> 
</html> 

백킹 빈 :

@ManagedBean 
@RequestScoped 
public class Bean { 
    private boolean showMe = false; 

    public boolean isShowMe() { 
     return showMe; 
    } 

    public void setShowMe(boolean showMe) { 
     this.showMe = showMe; 
    } 

    public void toggleShowMe(){ 
     System.out.println(showMe); 
     if(showMe==true){ 
      showMe=false; 
     }else{ 
      showMe=true; 
     } 
    } 
    /** Creates a new instance of Bean */ 
    public Bean() { 
     System.out.println("Bean Initialized"); 
    } 

} 

그게 전부가있다. 그냥 간단한 테스트. ICEfaces 2.0을 사용하고 panelGrid 대신에 동일한 동작을 사용합니다.

<ice:panelPopup visible="#{bean.showMe}"> 

여기서 도움을 주셔서 감사합니다. 나는 그것을 설명하기가 어렵다.

업데이트 : Aba Dov에 대한 응답으로 @SessionScoped는 요청할 때마다 생성자를 호출하지 않고 동일한 동작으로 실행됩니다. 내가 뭘 놓치고 있니?

+0

구성 요소 IS 세션 범위가 세션 당 두 번 이상 생성되지는 않습니다.이 방법은 널리 사용되기 때문에 JSF가 아닌 코드에 버그가있을 수 있습니다. 올바른 패키지에서 @SessionScoped를 사용하고 있습니까? (EE6에는 두 가지가있다). – fdreger

+0

fdreger-javax.faces.bean.SessionScoped를 사용하고 있습니다. javax.enterprise.context.SessionScoped를 사용해야합니까? – TheDream34

답변

6

을하는 데 도움이 직렬화

희망이 될 수 있습니다. 참으로 콩은 모든 요청에 ​​따라 만들어 질 것입니다.

Bean이 뷰 자체만큼 오래 살아 가기를 원한다면 (IceFaces가 모든 아약스 내용에 대해 커버하고있는 것처럼) bean 뷰 범위를 선언해야합니다 (이것은 JSF 2.0에서 새로 추가되었습니다) .

@ManagedBean 
@ViewScoped 
public class Bean implements Serializable {} 
+0

감사합니다! 그것은 작동합니다. 새로운 JSF 2.0에 관한 좋은 제안에 대한 제안? 사양은 꽤 무거운 독서입니다. – TheDream34

+0

또한''와 관련된 코드와 빈에서 오는리스트에주의하십시오. ViewScoped 일 때도 생성자를 여러 번 호출합니다 –

+0

@Chris : http://stackoverflow.com/questions/2842401/jstl-cforeach-causes-viewscoped-bean-to-invoke-postconstruct-on-every-request/ 2842424 # 2842424 – BalusC

0

빈은 페이지에서 요청이있을 때마다 호출됩니다.

당신이 <h:commandButton> 양식이 제출 및 요청이 당신이하고 대한 <t:saveState> 또는 <a4j:keepAlive> 태그를 사용할 수 있습니다 그것을 방지하기 위해 서버

로 전송을 클릭

.

해당 태그 예를 <a4j:keepAlive beanName="YourBean" />에 대한

구성 요소 트리에서 빈 인스턴스를 저장합니다.

또한 클래스 implements Serializable인지 확인하십시오. 그래서 이것은 당신이 요청 범위에 배치되는 빈을 선언하고 명령 단추에 의해 새로운 HTTP 요청 매번 발사하고

+0

JSF 2에서 뷰 스코프가 keepAlive 또는 saveState의 작업을 수행합니다. –

1

빈은 ViewScoped에 있어야합니다.

+0

오랫동안 데이터를 보존 할 필요가 없다면 어떻게해야합니까? viewScoped는 작동하지만 무료는 아니며 서버의 메모리를 소비합니다. 왜 오랫동안 불필요한 데이터를 보존해야합니까? 데이터가 이미 빈에 의해 요청 되었기 때문에 뷰 범위에서 데이터를 유지하는 요점은 무엇인가? & commmandButton이 눌려 졌을 때 JSF가 뷰의 모든 관리 빈을 생성해야하는 이유는 무엇입니까? actionListener bean이 인스턴스화됩니까? –

관련 문제