简体   繁体   中英

JSF Request Scoped Bean not displaying data in page

I'm experimenting with JSF scopes, and have some issues when using a session scoped bean within a request scoped bean.

The basic workflow is that the user would click a View button on an item from the home page, which then calls my code to load & display that item's information.

Here's my UPDATED code:

@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.
        ....
    }
}

My UPDATED view page then has things like:

<!-- 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}" />

If my viewBean is request scoped (or view scoped), I get empty data on the view page. If the viewBean is session scoped, things work. And I'm not understanding why?

From what I see in my debugger, readItem(itemId) is called (from the home page when clicking a view button), but when the view page itself calls the getItemViewObject(), the itemViewObject is null.

What am I doing wrong?

UPDATE I forgot to mention earlier how my home page was calling readItem method, and that was through a command button:

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

Each item listed in the home page has its own View button.

Also forgot to mention that both the home page and my view page are using JSF Templates. I don't know if that matters.

From the comments below which people have made, I came up with the code changes above. And things work now. Using either request scope or view scope with ItemViewBean works now.

And I am surprised this worked! I'm not quite certain I fully understand why it works.

Are my changes the correct way to do things? Or is there a better way?

Also, I'm using JSF 2.1.

Update 2 It doesn't work. The scoping works, but I discovered that the itemId in the viewParam is always null. Why?

itemViewObject is private in a RequestScoped bean. After readItem() got a value for itemViewObject, this value will be forgotten after this request and will be null at the next request (`@RequestScoped').

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM