JSF: сохранить выбранное значение переменной в datatable для следующего просмотра
У меня есть таблица данных:
<h:dataTable binding="#{table}" value="#{chooseKittens.kittenList}">
<h:column>
<p:commandLink value="#{chooseKittens.kittenList[table.rowIndex]}" action="#{chooseKittens.petKitten}"/>
</h:column>
</h:dataTable>
DataTable - это ссылка, которая приведет вас на другую страницу. Однако, когда я перехожу на другую страницу, я хочу сохранить значение щелчка по ссылке на команду, чтобы я мог отобразить ее в последующих представлениях. Есть ли способ сделать это без SessionScope? Я посмотрел в t: saveState, но я не уверен, как сохранить только переменную, выбранную в Datatable. Если SessionScope - единственная доступная вещь, есть ли способ сделать список kittenList в другом объеме? (Список котят должен меняться при добавлении нового котенка в базу данных, поэтому он должен быть в RequestScope или ViewScope).
1 ответ
Если вы хотите поделиться информацией между представлениями, есть две обычно используемые альтернативы, которые вы могли бы рассмотреть.
Передайте информацию следующему представлению как параметр GET
В этом случае вы будете использовать компонент JSF, генерирующий простую навигационную ссылку, и присоедините к этой ссылке параметр запроса, например:
<h:link value="Next page" outcome="/view-kitten"> <f:param name="id" value="#{kitten.id}"/> </h:link>
На странице получения параметр доступен через:
<f:metadata> <f:viewParam name="id" value="#{kittenBean.id}/> </f:metadata>
Более подробную информацию можно найти в разделе Что можно
<f:metadata>
а также<f:viewParam>
быть использованы для?Передайте информацию в перенаправленное представление, используя
Flash
В этом случае вы выполняете перенаправление в методе действия командного компонента и присоединяете необходимые данные к целевому представлению, используя
Flash
объект:<h:commandButton value="Next page" action="#{bean.next}"/>
с
public String next() { //do business job FacesContext.getCurrentInstance().getExternalContext().getFlash().put("kitten", selectedKitten); return "/view-kitten?faces-redirect=true"; }
Он будет доступен в виде цели через EL с
#{flash.kitten}
или программно сFacesContext.getCurrentInstance().getExternalContext().getFlash().get("kitten")
,Расширенный пример можно найти в JSF2.0 - Как получить значения в bean-компоненте другой страницы jsf в области запроса.
Последнее, что следует отметить: не злоупотребляйте HTTP-сессией. Вы не должны загрязнять сессию информацией, которая принадлежит другому.