重定向后Flash数据可以保留吗?

时间:2015-09-30 11:02:52

标签: jsf prettyfaces flash-scope

使用JSF 2.1.29

list.xhtml

AlarmReceiver

listBean (viewscoped)中,

<p:commandLink id="ownerViewLinkId" value="#{petOwner.firstName} #{petOwner.lastName} " 
action="#{ownerAndPetListBean.viewPetOwnerFrmList(petOwner.id,petOwner.userId,0)}"
        onclick="PF('progrees_db').show()"
        oncomplete="PF('progrees_db').hide()"
        style="color:#0080FF;">
</p:commandLink>

漂亮-config.xml中

public void viewPetOwnerFrmList(String ownerIdStr, String userIdStr,
            String petIdStr) {
    try {
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("ownerId",ownerIdStr);
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("userId",userIdStr);
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("petId",petIdStr);

            FacesContext.getCurrentInstance().getExternalContext()
                    .redirect("/ownerandpets/view");

    } catch (Exception e) {
            log.warn("FL Warning", e);
    }
}

viewbean (viewscoped)中,

  <url-mapping id="ownerandpetsview"> 
      <pattern value="/ownerandpets/view" />          
      <view-id value="/WEB-INF/views/ownerAndPet/OwnerAndPetsView.xhtml" />
      <action onPostback="false">#{ownerAndPetViewBean.fillPage}</action> 
  </url-mapping>

查看页面中

String petIdStr;
String userIdStr;
String ownerIdStr;
String firstName;
//include getters and setters
public void fillPage() {

    petIdStr = (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("petId");
    userIdStr = (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("userId");
    ownerIdStr = (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("ownerId");

    System.out.println(ownerIdStr+" "+userIdStr+" "+petIdStr);
    firstName = getFromDBByOwnerId(ownerIdStr); 
}
重定向后显示

firstName。 在刷新视图页面时(通过按f5),字符串firstName变为null,并且在viewBean的fillPage中打印的id字符串为null。 我需要的是刷新,我需要重新获取firstID,其中id不能为null。 已经完成了这个link 无论如何要在请求中保留flash数据?

尝试以下但没有成功:

1

<h:outputText value="#{ownerAndPetViewBean.firstName}"/>

2

FacesContext.getCurrentInstance().getExternalContext()
                    .redirect("/ownerandpets/view?faces-redirect=true");

第3

FacesContext.getCurrentInstance()
    .getExternalContext().getFlash().keep("ownerId");
FacesContext.getCurrentInstance()
    .getExternalContext().getFlash().keep("userId");
FacesContext.getCurrentInstance()
    .getExternalContext().getFlash().keep("petId");

在刷新调试时,在观看FacesContext.getCurrentInstance().getExternalContext() .getFlash().setKeepMessages(true); FacesContext.getCurrentInstance().getExternalContext() .getFlash().setRedirect(true); 时,闪存范围地图中会显示ID,但在观看FacesContext.getCurrentInstance().getExternalContext().getFlash()时不会显示相同的内容(参见图2)。

Values in Flash Map on Refresh - Fig 1 Fig 2

更新1(答案):

根据Xtreme Biker的建议,将preRenderView添加到视图页面。

FacesContext.getCurrentInstance().getExternalContext().getFlash().get("petId");

从pretty-config.xml中删除或评论

<f:event type="preRenderView" listener="#{ownerAndPetViewBean.fillPage}"/>

在fillPage方法中放入一个非回发检查,并在托管bean中添加了flash.keep。

<action onPostback="false">#{ownerAndPetViewBean.fillPage}</action>

上述方法不适用于漂亮的脸部动作标签(如果使用而不是preRenderview),我们将获得没有值的页面。

1 个答案:

答案 0 :(得分:1)

prettyfaces动作可能超出了当前闪存状态的范围。不确切知道漂亮的动作是如何工作的,但是你需要在执行重定向的同一请求周期中设置flash.keep(如果使用漂亮,则由POST-REDIRECT-GET模式完成)。

无论如何,由于漂亮操作的the docs example显示了@RequestScoped bean,因此不知道它与View Scope的兼容性和flash状态。如果你还在JSF 2.1中,我个人更喜欢使用f:event='preRenderView' checking for postbacks。如果是JSF 2.2,请使用f:viewAction,而不必检查回发。

另见: