2013-09-23 3 views
0

У меня есть страница с результатами поиска, расположенных на страницах. Когда я перемещаюсь вперед к подробному представлению и назад к представлению результата, представление результата переходит к странице1. Как я могу это исправить? Я использую два компонента ViewScoped. Я попробовал SessionScoped, но он будет делать то же самое. Каков наилучший способ сделать это?Возвращаясь к странице Я теряю состояние

страница результатов

<f:metadata> 
     <f:viewParam name="lang" value="#{search.language}" /> 
     <f:viewAction action="#{result.init()}" /> 
</f:metadata> 
<h:form> 
      <ui:repeat value="#{result.recipesView}" var="rec"> 
       <h:link value="#{rec.title}" outcome="recipeshow"> 
        <f:param name="id" value="#{rec.id}" /> 
       </h:link> 
       <br/> 
       <h:outputText value="#{rec.id}"/><br/> 
       <h:outputText value="#{rec.author}"/><br/> 
       <h:outputText value="#{rec.createDate}"/><br/> 
       <br/> 
      </ui:repeat> 
      <br/> 
      <ui:repeat value="#{result.pagesArray}" var="page"> 
       <h:commandLink value="#{page.pageNumber}" disabled="#{page.pageDisabled}"> 
        <f:ajax listener="#{result.doPages()}" render="@form"/> 
        <f:param name="currentPage" value="#{page.pageNumber}"/> 
       </h:commandLink>     &nbsp; 
      </ui:repeat> 
</h:form> 

ответ

2

Если вы манипуляция зрения области видимости данных, как управление текущей страницей она будет доступна до тех пор, как вы взаимодействуете с текущим видом, делая постбэк через <h:commandLink>. Когда вы показываете представление деталей, вы больше не имеете дело с представлением результатов, поэтому ваша информация о просмотре в основном отсутствует. Поэтому, когда вы нажмете кнопку назад браузера, вы либо вернетесь на первую страницу (в случае, если страница не кэшируется), либо к представлению, поскольку она была оставлена ​​заранее (в случае, если страница кэширована), но вы получите ViewExpiredException.

Что нужно сделать, чтобы преодолеть эту трудность, так это удерживать информацию в URL-адресе, на который указывает кнопка возврата. Другими словами, отказаться от использования ссылок (<h:commandLink>), чтобы опубликовать результаты и переключиться на использование ссылок (<h:link>). Последний будет использоваться для отправки нового запроса на получение, содержащего соответствующую информацию (текущая страница, размер поискового вызова, порядок подкачки и т. Д.), Чтобы показать результаты. Это можно сделать, используя <f:param> и <f:viewParam> теги. В этом свете при нажатии кнопки «Назад» вы увидите результаты с параметрами, определенными в запросе. Идемпотентность результата - это ключ к вашей ситуации.

Итак, у вас будет куча <f:viewParam> тегов, чтобы сохранить данные подкачки в представлении результатов. Вам также необходимо изменить свои командные ссылки на простые <h:link> с вложенными <f:param> s, которые также представляют данные подкачки.

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