Могут ли данные Flash сохраняться после перенаправления?

Использование JSF 2.1.29

В list.xhtml

<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>

В listBean (с областью просмотра)

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);
    }
}

pretty-config.xml

  <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>

В viewbean (viewscoped)

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); 
}

На странице просмотр

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

firstName отображается после перенаправления. При обновлении страницы представления (нажатием f5) строка firstName становится нулевой, а строки идентификаторов, напечатанные в fillPage viewBean, равны нулю. Что мне нужно, так это обновление, мне нужно обновить firstName, для которого идентификаторы не должны быть нулевыми. Прошел по этой ссылке В любом случае, чтобы сохранить флэш-данные в запросе?

Пробовал ниже, но не удалось:

1.

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

2.

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

3.

FacesContext.getCurrentInstance().getExternalContext()
    .getFlash().setKeepMessages(true);
FacesContext.getCurrentInstance().getExternalContext()
    .getFlash().setRedirect(true);

При отладке Refresh идентификаторы присутствуют на карте области флэш-памяти при просмотре FacesContext.getCurrentInstance().getExternalContext().getFlash(), но они не отображаются при просмотре FacesContext.getCurrentInstance().getExternalContext().getFlash().get("petId"); (см. рис. 2).

Значения на флэш-карте при обновлении — рис. 1 Рис. 2

Обновление 1 (ответ):

По предложению Xtreme Biker добавлен preRenderView на страницу просмотра.

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

Из pretty-config.xml удалить или прокомментировать

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

Поместите проверку отсутствия обратной передачи в метод fillPage и добавьте flash.keep в управляемый компонент.

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

Приведенный выше метод не будет работать с тегом действия pretty-faces (если он используется вместо preRenderview), и мы получим страницу без значений.


person Eva Mariam    schedule 30.09.2015    source источник
comment
Пожалуйста, добавьте версию/импл JSF, которую вы используете   -  person Xtreme Biker    schedule 01.10.2015
comment
Я обновил вопрос. Используя JSF 2.1.29.   -  person Eva Mariam    schedule 01.10.2015
comment
Не знаю, как Prettyfaces справляется со своими действиями. Вместо этого я рекомендую вам вызывать ViewBean#fillPage в событии preRenderView на лицевой панели, когда вы загружаете свое представление (проверьте там, является ли входящий запрос обратной передачей или нет, и выполняйте только тогда, когда это не так). Затем вызовите flash.keep, который должен выполнить работу, которую вы ищете. Взгляните на это, чтобы узнать, как сохранить их непосредственно из EL, но вы можете сделать то же самое из управляемого компонента в Java-код.   -  person Xtreme Biker    schedule 01.10.2015
comment
да.. работает, когда uesd preRenderView.. :)   -  person Eva Mariam    schedule 01.10.2015
comment
Хотел оставить длинный комментарий, вместо этого отправил как ответ ;-)   -  person Xtreme Biker    schedule 01.10.2015


Ответы (1)


Действие prettyfaces, вероятно, выходит за рамки текущего состояния флэш-памяти. Не знаю точно, как работает красивое действие, но вам нужно установить flash.keep в том же цикле запроса, где выполняется перенаправление (при использовании красивого это делается с помощью шаблона POST-REDIRECT-GET).

В любом случае, как пример из документации для красивого действия показывает bean-компонент @RequestScoped, не знаю его совместимость с областью просмотра и, следовательно, с состоянием флэш-памяти. Лично я предпочитаю использовать f:event='preRenderView' проверку обратных передач, если вы все еще используете JSF 2.1. Если JSF 2.2, используйте f:viewAction без проверки обратных передач.

См. также:

person Xtreme Biker    schedule 01.10.2015