Использование JSF 2.1.29Могут ли данные Flash сохраняться после перенаправления?
В 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 (viewscoped),
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);
}
}
довольно-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, для которого идентификаторы не должны быть нулевыми. Прошло через это link В любом случае, чтобы сохранить данные флэш-памяти в запросе?
Пробовал ниже, но не был успешным:
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).
Update 1 (ответ):
Как было предложено Xtreme Байкер, добавлена preRenderView на странице просмотра.
<f:event type="preRenderView" listener="#{ownerAndPetViewBean.fillPage}"/>
.
С довольно-config.xml, удалить или комментарий
<action onPostback="false">#{ownerAndPetViewBean.fillPage}</action>
Помещенный не обратной передачи проверки в методе fillPage и добавил flash.keep в управляемом компоненте.
FacesContext.getCurrentInstance().getExternalContext().getFlash().keep("ownerId");
выше метод не будет работать с довольно-гранями действия тега (если он используется вместо preRenderview), и мы получим страницу без каких-либо значений.
Пожалуйста, добавьте версию JSF/осущ который вы используете –
я обновил вопрос .. Использование JSF 2.1.29. –
Не знаю, как Prettyfaces обрабатывает свои действия. Вместо этого я рекомендую вам позвонить 'ViewBean # fillPage' в событие' preRenderView' в facelet при загрузке вашего представления (проверьте, если входящий запрос является обратной передачей или нет, и выполняйте его только тогда, когда это не так) , Затем вызывается 'flash.keep', который должен выполнять работу, которую вы ищете. Посмотрите на [this] (http://stackoverflow.com/a/25057753/1199132), чтобы посмотреть, как сохранить их непосредственно с EL, но вы можете сделать то же самое из управляемого компонента в Java-коде. –