Использование 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 (ответ):
По предложению 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), и мы получим страницу без значений.
ViewBean#fillPage
в событииpreRenderView
на лицевой панели, когда вы загружаете свое представление (проверьте там, является ли входящий запрос обратной передачей или нет, и выполняйте только тогда, когда это не так). Затем вызовитеflash.keep
, который должен выполнить работу, которую вы ищете. Взгляните на это, чтобы узнать, как сохранить их непосредственно из EL, но вы можете сделать то же самое из управляемого компонента в Java-код. - person Xtreme Biker   schedule 01.10.2015