JSF请求Scoped Bean不在页面中显示数据

时间:2018-04-27 20:38:00

标签: jsf jsf-2

我正在尝试使用JSF作用域,并且在请求作用域bean中使用会话作用域bean时遇到一些问题。

基本工作流程是用户点击主页上某个项目的“查看”按钮,然后调用我的代码加载&显示该项目的信息。

这是我的更新代码:

@ManagedBean(name="itemViewBean")
@RequestScoped
class ItemViewBean {
    @ManagedProperty("#{itemBean}")
    private ItemBean itemBean;

    private ItemViewObject itemViewObject;
    private int itemId;

    public void init() {
         itemViewObject = itemBean.readItem(itemId);
    }

    public String readItem(int itemId) {
     //     itemViewObject = itemBean.readItem(itemId);  // moved to init();
          return "/pages/viewItem.xhtml?faces-redirect=true";
    }

    public ItemViewObject getItemViewObject() {
          return itemViewObject;
    }

    // getters & setters as needed

}

@ManagedBean(name="itemBean")
@SessionScoped
class ItemBean {
    public ItemViewObject readItem(int itemId) {
        // hardcoded creating a ItemViewObject for now.
        // eventually would be loaded from the database.
        ....
    }
}

我的更新视图页面的内容如下:

<!-- added the metadata -->
<f:metadata>
    <f:viewParam name="id" value="#{itemViewBean.itemId}" />
    <f:event listener="#{itemViewBean.init}" type="preRenderView" />
</f:metadata>

<!-- same as before -->
<h:outputText value="#{itemViewBean.itemViewObject.description}" />

如果我的viewBean是请求范围(或视图范围),我在视图页面上获取空数据。如果viewBean是会话范围的,那么事情就可以了。我不明白为什么?

从我在调试器中看到的,调用readItem(itemId)(单击视图按钮时从主页),但是当视图页面本身调用getItemViewObject()时,itemViewObject为null。

我做错了什么?

更新 我之前忘了提到我的主页是如何调用readItem方法的,这是通过一个命令按钮:

<h:commandButton class="btn btn-mini firefoxBtnMiniCorrection"
    value="View"
    action="#{itemViewBean.readItem(b.itemId)}"/>

主页中列出的每个项目都有自己的“查看”按钮。

还忘了提到主页和我的视图页面都使用JSF模板。我不知道这是否重要。

根据以下人们提出的意见,我想出了上面的代码更改。事情现在有效。使用ItemViewBean的请求范围或视图范围现在可以正常工作。

我很惊讶这有效!我不太确定我完全理解它为什么会起作用。

我的更改是否是正确的做事方式?或者有更好的方法吗?

另外,我正在使用JSF 2.1。

更新2 它不起作用。范围确实有效,但我发现viewParam中的itemId始终为null。为什么呢?

1 个答案:

答案 0 :(得分:0)

itemViewObjectRequestScoped bean中是私有的。在readItem()获得itemViewObject的值之后,此值将在此请求后被遗忘,并在下一个请求时为空(`@RequestScoped')。