我已经看到有关调用 bean 构造函数和 ViewScope 的其他问题,但我仍然遇到困难。我看到的问题涉及我的应用程序中的两个特定页面。第一个是一个数据表(现在它填充了随机生成的数据,但最终会调用一个数据库),第二个页面是一个相当简单的显示页面,其中来自所选行的信息以表格形式显示以供编辑或查看 -这是我的detail.xhtml
页面。这个页面的 bean 才是问题所在;它的构造函数被调用了两次:第一次当我导航到页面时,再次当我按下commandButton 提交更改或取消更改无关紧要时,第二次调用detail.xhtml 支持bean 的构造函数。
我的 bean 是@ViewScoped
,正在导入javax.faces.bean.ViewScoped
。其他一些可能会产生影响的细节,但如果他们这样做,我不明白为什么:我的 UserDetailBean.java 继承自一个基本 bean(我最初称之为 UIBaseBean.java)。现在,我的 UIBaseBean 是@RequestScoped
. 据我了解,这不应该有所作为,因为我的 UserDetailBean 是@ViewScoped
,如果我错了,请纠正我。
另一个可能产生影响的细节是 UIBaseBean 和 UserDetailBean 的构造函数中的变量设置。我想在页面顶部的工具栏中显示用户的位置。为此,我在 UIBaseBean 中创建了一个变量:
protected String toolbarDescription;
我还在 UIBaseBean 中提供了 setter 和 getter。在 UIBaseBean 的构造函数中,我定义了变量:
toolbarDescription = "fix me";
该定义只是为了让我知道为我的应用程序中的任何特定页面覆盖支持 bean 中的变量。在我的 UserDetailBean 中,我为字符串工具栏描述分配了一个新值。此值显示在 detail.xhtml 页面上。否则,我的 detail.xhtml 页面的 bean 非常简单,它获取和设置用于在 detail.xhtml 页面上的表单中显示数据的属性。
详细信息页面已设置,因此导航到它会通过重定向发生,而导航离开(按下 commandButton 时)会通过重定向发生。我尝试过使用有和没有重定向的 faces-config 导航规则,以及有和没有重定向的隐式导航,但是 UserDetailBean 构造函数总是被调用两次。
哦,我在我的 UserDetailBean 构造函数中的 toolbarDescription 变量上设置了一个断点,这会停止程序两次:第一次调用页面时,以及在详细页面上按下 commandButton 后再次停止。
根据我的描述,谁能告诉我为什么我的构造函数被调用了两次?我是否错误地设计了我的 bean,或者问题在我的应用程序中更深层次?
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);
}