(지난 몇 개월 동안 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는 요청할 때마다 생성자를 호출하지 않고 동일한 동작으로 실행됩니다. 내가 뭘 놓치고 있니?
구성 요소 IS 세션 범위가 세션 당 두 번 이상 생성되지는 않습니다.이 방법은 널리 사용되기 때문에 JSF가 아닌 코드에 버그가있을 수 있습니다. 올바른 패키지에서 @SessionScoped를 사용하고 있습니까? (EE6에는 두 가지가있다). – fdreger
fdreger-javax.faces.bean.SessionScoped를 사용하고 있습니다. javax.enterprise.context.SessionScoped를 사용해야합니까? – TheDream34