빈 생성자 및 ViewScope 호출과 관련하여 다른 질문을 보았습니다. 여전히 어려움을 겪고 있습니다. 내가 겪고있는 문제는 응용 프로그램에서 두 개의 특정 페이지를 포함합니다. 첫 번째는 dataTable입니다 (이제는 무작위로 생성 된 데이터로 채워지지만 결국 데이터베이스를 호출합니다). 두 번째 페이지는 선택된 행의 정보가 편집 또는보기 용으로 표시되는 매우 간단한 표시 페이지입니다. 내 detail.xhtml
페이지입니다. 이 페이지의 빈 (bean)입니다. 해당 생성자가 두 번 호출됩니다. 첫 번째로 페이지로 이동하면 다시 commandButton을 눌러 변경 사항을 제출할지 또는 변경 사항을 취소할지 여부가 중요하지 않으며 detail.xhtml 백업 빈의 생성자가 두 번째로 호출됩니다.ViewScope 생성자가 두 번 호출되었지만 이유가 확실하지 않습니다.
내 콩 @ViewScoped
, 수입은 javax.faces.bean.ViewScoped
입니다. 차이를 만들 수있는 몇 가지 다른 세부 사항이 있지만 그 이유를 이해하지 못한다면 : 내 UserDetailBean.java는 기본 bean (원래 UIBaseBean.java라고 부릅니다)에서 상속합니다. 자, 내 UIBaseBean은 @RequestScoped
입니다. 내 UserDetailBean이 @ViewScoped
이기 때문에 나는 이해할 수 있지만 차이가 없어야한다. 내가 틀렸다면 나를 바로 잡아라.
다른 점은 UIBaseBean과 UserDetailBean의 생성자에서 변수를 설정하는 것입니다. 내 페이지 상단의 툴바에 사용자의 위치를 표시하고 싶습니다. 이를 위해 UIBaseBean에서 변수를 만들었습니다.
protected String toolbarDescription;
또한 setter와 getter를 UIBaseBean에 제공했습니다. 그 정의는 너무 내 응용 프로그램에서 특정 페이지에 대한 백업 빈의 변수를 대체 할 알고있다
toolbarDescription = "fix me";
: UIBaseBean의 생성자에서 나는 변수를 정의합니다. 내 UserDetailBean에서 문자열 toolbarDescription에 새 값을 할당합니다. 이 값은 detail.xhtml 페이지에 표시됩니다. 그렇지 않으면 내 detail.xhtml 페이지의 bean은 매우 직설적이며 detail.xhtml 페이지의 양식에 데이터 표시를위한 속성을 가져오고 설정합니다.
세부 정보 페이지가 설정되어 리디렉션과 함께 탐색이 이루어지며 리디렉션이있는 경우 (commandButton을 누르면) 리디렉션이 발생합니다. faces-config 탐색 규칙을 사용하거나 사용하지 않고 리디렉션을 사용하고 리디렉션을 사용하거나 사용하지 않는 암시 적 탐색을 시도했지만 UserDetailBean 생성자는 항상 두 번 호출됩니다.
아, 두 번 프로그램을 중지하는 UserDetailBean 생성자의 toolbarDescription 변수에 중단 점을 설정합니다. 페이지가 처음 호출 될 때와 다시 세부 정보 페이지의 commandButton을 누른 후 다시 누릅니다.
내가 설명한대로 누군가가 내 생성자가 두 번 호출되는 이유를 알 수 있습니까? 콩을 잘못 디자인했거나 응용 프로그램에 문제가 있습니까?
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import [package name].UIBaseBean;
import java.util.Locale;
import javax.faces.bean.ManagedProperty;
@ManagedBean
@ViewScoped
public class UserDetailBean extends UIBaseBean {
@ManagedProperty(value = "#{param.action}")
private String action;
private String firstName;
private String lastName;
private String jobTitle;
private String DOH;
private String location;
private String status;
private String comments;
@ManagedProperty(value = "#{param.id}")
private String id;
private String tabTitle;
private boolean editMode;
private boolean viewMode;
private ClUserDetail dBUserDetail;
/** Creates a new instance of UserDetailBean */
public UserDetailBean() {
toolbarDescription = CoreMsgBundle.getMessageFromResourceBundle("UserDetail", Locale.ENGLISH);
}
대단히 고맙습니다.이 코드는 원래 코드가 작동되기를 기대하면서 정확하게 작동합니다. @ManagedProperty에 관해서는 나쁜 정보라는 좋은 이해가없는 작은 정보의 예입니다. 나는 [이 답변] (http://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id)을 읽고 "오, 좋은 생각인데, 내 신청서에서 그렇게하겠습니다"라고 생각했습니다. – Sean
네 말이 맞아. 답변을 업데이트했습니다. – BalusC
@balusc ViewScoped 빈 생성자가 여러 번 호출된다는 점에서 비슷한 문제가 있습니다. Bean은 유틸리티 기능을 제공하지만 Bean 자체는 아닌 기본 클래스를 확장합니다. 여기서 기본 클래스는 추상화로 표시되었지만 생성자는 여전히 두 번 호출됩니다. 이것이 일어날 수있는 다른 이유가 있습니까? 1.2에서 2.0으로 마이그레이션하는 과정에서 주석 대신 faces-config.xml에서 bean을 선언했음을 주목할 필요가 있습니다. – Lucas