有没有办法在ViewScope和RequestScope中同时拥有一个bean

时间:2011-12-29 16:56:27

标签: jsf-2

我有一个项目表,每行都有一个转发到编辑项目页面的链接。要在编辑页面中加载数据,我需要在请求范围内使用托管bean(如果我将它放在视图范围内,我将数据放在前面)。

要在编辑页面中使用ajax,我需要在视图范围内使用托管bean,因为我必须保留一些值。如果我使用JSF 1.0和RichFaces,我会使用请求范围和a4j:keepalive

如何使用PrimeFaces和JSF 2.0获得此功能,或者如何重新定义界面以获得此功能?

好的,最后根据下面的帖子,这对我有用:
Items表中的CommandButton:

<o:commandButton id="editButton"
action="#{itemTableMB.editItem(item.id)}" styleClass="botonTabla">
<h:graphicImage styleClass="imagenBotonTabla" url="/resources/images/icons/pencil.png"/>  
</o:commandButton> 

托管bean中的操作:

public String editItem(Integer id){
return "/pages/items/edit.xhtml?faces-redirect=true&id="+id;
}

edit.xhtml:

<f:metadata>
  <f:viewParam id="id" name="id" value="#{itemMB.item.id}"    required="true">
  </f:viewParam>
  <f:event type="preRenderView" listener="#{itemMB.loadItem}" />
</f:metadata> 

itemMB中的监听器:

public void loadItem(){
      this.item = this.itemManager.get(this.item.getId());
}

1 个答案:

答案 0 :(得分:1)

  

要在编辑页面中加载数据,我需要在请求范围内使用托管bean(如果我将它放在视图范围内,我将数据放在前面)。

您是否在没有重定向的情况下使用导航规则(或隐式导航)?

一种解决方案是在视图范围内放置&#34;项目表&#34; -page和&#34;编辑项目&#34; -page的后备bean,然后从第一个到第二个直接通过GET请求(例如使用<h:link>)或POST /重定向,其中请求参数表示用户单击的行。

在第二页上使用<f:viewParam>可以方便地将请求参数转换回表示正在编辑的项目的实体。

如果你确实使用了没有重定向的导航,那么这将带来额外的好处,你不会受到臭名昭着的一个URL背后问题的困扰,这可能会让人感到困惑。您的应用程序的用户,并成为支持的噩梦。