2015-09-30 2 views
1

Использование 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).

Values in Flash Map on Refresh - Fig 1 Fig 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), и мы получим страницу без каких-либо значений.

+0

Пожалуйста, добавьте версию JSF/осущ который вы используете –

+0

я обновил вопрос .. Использование JSF 2.1.29. –

+1

Не знаю, как Prettyfaces обрабатывает свои действия. Вместо этого я рекомендую вам позвонить 'ViewBean # fillPage' в событие' preRenderView' в facelet при загрузке вашего представления (проверьте, если входящий запрос является обратной передачей или нет, и выполняйте его только тогда, когда это не так) , Затем вызывается 'flash.keep', который должен выполнять работу, которую вы ищете. Посмотрите на [this] (http://stackoverflow.com/a/25057753/1199132), чтобы посмотреть, как сохранить их непосредственно с EL, но вы можете сделать то же самое из управляемого компонента в Java-коде. –

ответ

1

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

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

Смотрите также:

Смежные вопросы