gpt4 book ai didi

java - ViewScope 构造函数调用了两次,不知道为什么

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:13 25 4
gpt4 key购买 nike

我已经看到有关调用 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 中,我为 String toolbarDescription 分配了一个新值。该值显示在 detail.xhtml 页面上。否则,我的 detail.xhtml 页面的 bean 非常简单,它获取并设置用于在 detail.xhtml 页面上以表单形式显示数据的属性。

详细信息页面已设置为通过重定向导航到它,而离开导航(当按下 commandButton 时)通过重定向。我尝试过使用带和不带重定向的 faces-config 导航规则,以及带和不带重定向的隐式导航,但 UserDetailBean 构造函数总是被调用两次。

哦,我在我的 UserDetailBean 构造函数中的 toolbarDescription 变量上设置了一个断点,这使程序停止了两次:第一次调用页面时,以及在详细信息页面上按下命令按钮后再次停止。

根据我的描述,谁能告诉我为什么我的构造函数被调用了两次?是我的 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);
}

最佳答案

您需要删除 @RequestScoped和来自 UIBaseBean 的其他相关注释(并设为 abstract )。

完成后,您还需要修复 @ManagedProperty#{param}<f:viewParam> 定义或通过ExternalContext#getRequestParameterMap()获得反而。也就是说,不可能将范围较短的东西注入(inject)范围较大的东西(因为不清楚应该注入(inject)哪个,因为在接受器的范围内可能会有更多)。 JSF 会在 bean 的构造期间对此抛出异常。

关于java - ViewScope 构造函数调用了两次,不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com